‘CakePHP’ カテゴリーのアーカイブ

Cakephp1.2でModel::findの条件指定変更だったとは!

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

愛媛ITフェアに向けて、社内でオリジナルアプリを作ろうという話になった。開発チームでは、作成するのものの大枠が決定したので、とりあえずプロトタイプを作って、社内レビューして、よさそうだったら出展という流れにしようかなと思って、開発を開始した。

使用するフレームワークはCakePHP。これは勝手に俺が決めて、作っているだけだが、まあプロトタイプ作成だし、手段はどうだっていいということだ。RedMineのWiki上に要求仕様をまとめて、制作開始。

CakePHP1.2もstableが出たし、CakePHP徹底入門も結構前に買ってたので、CakePHP1.2で作ることにした。バージョンが1.1から1.2に変わったことで、便利になった部分も多いが、1.1を覚えてしまったせいで、結構弊害もあって、なかなか難しい。

CakePHP徹底入門
CakePHP徹底入門 イージーゲート

翔泳社 2008-08-29
売り上げランキング : 120410

おすすめ平均 star
starこれから始める人にはお勧め
starがっかり

Amazonで詳しく見る by G-Tools

この本だけでは、正直CakePHPの使い方をマスターできるとは到底思えないが、CakePHP1.2からスタートする人にとっては必須になるだろうなとは思う。個人的には、CakePHPガイドブックから入った人には、CakePHPポケットリファレンスのほうが便利に感じるだろう。

CakePHP ポケットリファレンス (Pocket Reference)
CakePHP ポケットリファレンス (Pocket Reference) 株式会社ブルーオーシャン 岡田 佳典

技術評論社 2008-06-18
売り上げランキング : 16855

おすすめ平均 star
starこれだけで作れそうです。
star現状のCakePHPリファレンスでは最良
starサンプルコードがもう少し丁寧であれば5つ星

Amazonで詳しく見る by G-Tools

さて、本題に入るが、CakePHP1.1のときと同じような感覚で、Model::findメソッドの条件指定に以下のように書いたら、動かなかった。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name' => '= ' . $name,
    'limitdate' => '> ' . date('Y-m-d')
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

動かなかったというよりは、条件に合うものがなかった処理が実行されてしまった。
確実に条件に合うものがあるのに。デバッグモードを2にしていたため、SQL文を見たところ、条件部分が明らかにおかしくなっていたので、ググってみたら、以下のサイトを見つけた。

CakePHP 1.2 RC1からfindの条件指定方法が変更となった

このページに書かれているが、CakePHP1.2RC1から、Model::findの条件指定方法が変更になり、条件は連想配列の値側ではなく、キー側に持たせるようになった。これらは書籍にはない情報だったので、非常に助かった。先ほどの条件式を新しい方式に書き直すと、以下のようになる。

<?php
// コントローラークラス内での記述
$conditions = array(
    'name =' => $name, // ココを修正
    'limitdate >' => date('Y-m-d') // ココを修正
);
$modelInfo = $this->Model->find($conditions); // Modelは任意のModelクラス
if (empty($modelInfo)) { // 追記:emptyを書いたら2重になった
    // 条件に合うものがなかった処理
} else {
    // 条件に合うものが見つかった処理
}
?>

これで、見事に動いてくれた。CakePHPの情報は本だけではなかなか難しい。一番参考になるのは、やっぱりCookbookかな~と思う。

追記:syntax-highlighterで、emptyを書いたら、2重に書かれてしまった…。plainでみたら、1つなんですけどね。syntax-highlighterのバグかな。


各都道府県のコース一覧でAtomFeedを作ってみた。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

自転車でヒルクライムしようぜ!で、各都道府県のコース一覧のページでAtomFeedを出力するようにしてみた。これはCakePHPを使っていますが、Zend_Feedを使ったAtomComponentを作ってやってます。といってもAtomの仕様とかにもあんまり詳しくないので、適当に、Zend Frameworkのドキュメントを読んで作りました。

こいつをThunderbirdなどで購読すると、自分のいる都道府県に新しいコースが登録されたら自動的に通知されるはず。まあ、需要はあるかどうかは謎ですがw、とりあえず、色々とやってみるという気持ちでいますのでやってみたという感じ。作業時間は、1.5時間程度だったでしょうか。


CakePHP: AjaxHelper::editorでonFailureは出来ない?

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1の話。

CakePHP Users in Japanで質問してたんですが、
AjaxHelper::editorで、エラーの場合にどうすればいいのか?で、一応自分なりに答えが出たので、ブログでも書いておこうかなと。ネットで調べても情報がなかったもんで。。。(探すの下手?)

一応、私がぶつかった問題をおさらいしておきますと、例えば重複を許さないカテゴリーの編集などをした場合に、既に存在するカテゴリ名などを入力されたらエラーにして、『そのカテゴリは既に存在します』みたいなエラーメッセージを表示したかったんです。しかし、それがAjaxHelper::editorを使った場合にどうすれば実装できるのかわからなかったわけです。

まず、CakePHPのAjaxHelperは基本的にprototype.jsとscriptaculousを使ってるので、Ajaxヘルパーを使うとこれらを使ったソースを自動的に吐いてくれる。ところが、AjaxHelper::editorメソッドは、scriptaculousのInPlaceEditorのオプションであるonFailureが指定できないっぽい。

/cake/libs/view/helpers/ajax.phpを見てみると、有効なオプションを指定する配列($editorOptions)にonFailureがなかった。editorメソッド内もちょこっといじってみたが(onFailureを加えそうな感じに)、できなかった。まあこれは私が安直にやったからだろう。もっと時間かければできるかも。

ただどちらにしろ、時間がもったいないのとcakeディレクトリ以下のソースに手を付けたくなかったので(単純に面倒だし、バグになったら嫌)、viewのthtmlファイル側でscriptaculousのInPlaceEditorの呼び出しをajaxヘルパーを使わずに書いた。それならonFailure書けるし。

今のところ、AjaxHelper::editorは、自分だけが使うんなら使ってもいいけど(要は運用面でカバー)、一般ユーザに使ってもらうには難しい気がします。エラー制御できんのは致命的だと思うんですが、これってeditorメソッドを使ったエラー制御ってできるんでしょうかね?


CakePHP: お問い合わせプラグインを作成

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1で、お問い合わせプラグインを作りました。
入力項目は、

  1. 名前
  2. メールアドレス
  3. カテゴリー(選択)
  4. 件名
  5. 本文

です。

私が使ってるPEAR::Mailを使ったMailComponentが必要なので、同梱しています。もし、MailComponentが既にある場合は、InquiryControllerの内容を書き換えるか、私が使ってるMailComponentを使ってください。

デモというか、ページの感じは、私のサイトで確認できます。(実際に動いてます)

http://hillclimb.319ring.net/inquiry/

以下のリンクからダウンロード可能です。使用される方はreadme.txtをよく読んでから使用してください。

cake_inquiry_plugin_ver_1.0.zip


CakePHP: 掲示板プラグインを作成しました。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHP1.1で、掲示板のプラグインを作成しました。そして、これを自転車でヒルクライムしようぜ!の掲示板に使っています。

http://hillclimb.319ring.net/bbs/

ネットでこういうプラグインないかなって探したんですけど、なんかなさそうだったので、じゃあ簡単なのでも作ってみるかということで。機能的にはショボイんですけど、プラグインを公開してるサイトってあんまりなさそうだったので公開します。
機能は、

  1. 投稿
  2. 投稿への返信
  3. 投稿の削除
  4. ページング
  5. コメントスパム対策キャプチャ画像表示(ON/OFF切り替え可能。ONなら要jpgraph)

というところでしょうか。編集機能はないんだな〜、これが。
なかなかいいアルゴリズムを思いつかなかったが、さっき思いついたのでバージョンアップしたら編集機能もつけるか。
ショボイくせして一応バージョンは1.0ということにします(メジャーリリース?)

インストールの仕方は、zipファイルの同梱しているreadme.txtを読んでいただけるとわかります。まあ、基本的にはDBにbbsテーブル作って、あとはソースをコピペすれば一応は動きます。テストもやったけど(使ってないノートPCにXAMPPインストールしてcakephpセットしてそこにすぐに当プラグインをインストール)、動いたのでOKでしょう。

もし使ってみようと思われた方は、以下をダウンロードしてください。
cake_bbs_plugin_ver_1.0.zip

バグがあったら私に連絡していただけますと助かりますw


JPGraphを使って標高グラフを出すようにした

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

自転車でヒルクライムしようぜ!で、コースの標高を出すようにした。
5時間ぐらいの作業だったが、ようやく出来たなぁ〜。

もちろん、CakePHPです。JpgraphComponentを作って、サクサクやりました。

しかも開発環境でやったあとに、本番環境に移行がちゃんとできんかったらアホみたいだからまた確認作業とかもやらなあかんし。軽くやけどね。ほんまに一人でやると大変ですな。でも個人サイトだから、仕様書とか作ってないからしゃーない。でもいつかまとめんとあかんな。。。

ただ、グラフは出るようになったけど、具体的な数値が表示されてないから、やっぱりそういうのって要望あるだろうなぁと思うし、そっちの表示もやらんといかん。できれば傾斜が何%とか、そういうのも求める式とか探しとかんといかん。

ちなみに三坂峠の情報とかは以下のURLで!!

http://hillclimb.319ring.net/courses/view/10

3時過ぎてもーた。眠い。。。寝よう。


CakePHP:携帯サイト開発続き

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

昨日の参考URLの情報を元に、携帯サイトの続きを行った。

http://cakephp.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=751&forum=3

とりあえず、記録も登録できるようになったし、$this->Session->setFlash(’登録しました’);の文字の文字化けもなくなった。ただし、すべてこの参考サイトの通りにやったわけではないので、一応自分なりに注意点を書いておきます。

  1. app_controller.phpのコンストラクタ
    if(ereg(”^/m/”, $_SERVER['REQUEST_URI'])){ …だが、
    ^/m/は、開発中には向かない場合がある。俺のように、phpmyadminを使う人は、おそらくhttp://localhost/cake/m/となっているんじゃないか?と思うが、その場合は、
    if(ereg(”^/cake/m/”, $_SERVER['REQUEST_URI'])){ …
    とする。もちろん、公開するときは修正必要なので注意!
  2. CakePHPガイドブックに従ってmobileヘルパーを作っている場合、afterRenderでmb_convert_encodingしていると、app_controller.phpのafterFilterメソッド内で文字コード変換済みなのでさらに文字化けするので注意。afterRenderをコメントアウトしてしまうとよい。

まあこれくらいかな?あとは、リンクにいちいちセッションをGETで引き渡さなければならないが、毎回のようにCAKE_SESSION_COOKIE . “=” . session_id()と書くのが、非常に面倒なので、mobileヘルパーに以下のようなメソッドを作ってみた。

function cake_session(){
return h(CAKE_SESSION_COOKIE) . "=" . h(session_id());
}

これを作っておくと、VIEWで、

<?php e($html->link('トップページ', '/?'. $mobile->cake_session())) ?>

と書けるので、なんとなく楽。


携帯対応の続き

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

それにしても俺はCakePHPを使っているにもかかわらず何故に開発スピードが遅いのだろう?不器用だからか?テレビ見ながらやってるからか?はい、携帯対応の続きです。ログインとユーザ登録と、記録の登録までできるようになったけど、記録の登録時に$this->setFlash(’登録しました’);みたいにしたら、思いっきり文字化けした。

まあこれは、flashするときの文字列がUTF-8のままなんだろうというのはすぐにわかるのだが、defaultレイアウトファイル上で、$session->flash()ってされて出力されてるので、このメソッド内部に改修を加えないといけなさそうだということまではわかって、色々調べていたが、タイムアップ。今日はもう寝る。。。

とりあえず、参考になりそうなURLを記述。試してないけど、後日試しますので。。。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=751&forum=3&post_id=1698#forumpost1698

ってか、flashメソッドの内部のe($out);を、return $out;にして、レイアウト側でe($session->flash)だったら、e(mb_convert_encoding($session->flash(), ‘SJIS’, ‘UTF8′));でいけるんじゃないの?と思ったのだが。まあ、逆にechoする手間が面倒だわな〜普通は。


CakePHPの開発事例に掲載されました!

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

先日、何気にCakePHPのサイトを見ていたら、開発事例に自転車でヒルクライムしようぜ!が載っていました!なんで〜???って思ったら、どうやらこのブログの記事から発見されたようです。すごく驚きましたが、いやはや、ありがたいことです。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1172&forum=13&post_id=2395

正直大したことしてないのですが、いい刺激になりました。もっと機能を追加しよう!とりあえず今日はサイトのチュートリアルを作成しました。登録数が伸びないのは、まあ公開して数日しか経ってないからというのと、使い方がわからんからかな?と思ったので。

本当にできることだけをやってるので、まだまだ勉強の身です。でもWebアプリを公開するってことは、そういうものを作ることができるという実績をアピールできるわけで、有意義だと思うんですよね。他の人にも薦めてるんですが、なかなか開発をする暇がないようです。。。まあ興味が他にあれば仕方ないんですけど。


CakePHP:IE(InternetExplorer)で画面が真っ白になる不具合

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

CakePHPで、画面が真っ白になる不具合がありました。
先日宣伝したサイト、自転車でヒルクライムしようぜ!の開発中でした。
私のブラウザは開発用のアドオンを入れたfirefoxなので、全然気付かなかったのですが(webサービスを提供するものとして失格?)IEでテスト(controllerクラス内でflashメソッドを呼ぶ)をしたら、画面が真っ白になりました。しかし、ソースはちゃんと取れていました。

原因は、どうやらIEはデフォルトでSJISで文字を理解しようとするため、UTF-8の文字コードのものに最初に当たるとそこで止まってしまうようです。

metaタグで、明示的にUTF-8って書いてるのになぁ〜と思ったら、metaタグ以前にtitleタグがあって、その中に日本語などのマルチバイト文字があるとアウトのようです。ですので、metaタグで文字コードがutf-8と宣言したあとで、titleタグを使えば解決しました。

参考URL:http://groundrhythm.blogspot.com/2007/04/blog-post.html