CakePHP bakeによる高速開発 Bakeの流れを非常に詳しく解説しています。
counterCacheは便利だが、どうやら1モデルにつき1つしか登録できないようだ。 たとえばUserモデルとFriendモデルがあるとする。 Userモデルにはfriend_countフィールドがあり、Friendの数がカウンターキャッシュで更新できるようにする場合、Friendモデルには下記のような記述をする var $belongsTo = array( ‘User’ => array( ‘className’ => ‘User’, ‘foreignKey’ => ‘user_id’, ‘conditions’ => ”, ‘fields’ => ”, ‘order’ => ”, ‘counterCache’ => ‘friend_count’, ‘counterScope’ => array(‘Friend.status’ => 1), ), ); 単純に友達の数をカウントするだけならこれでいいが、さらに「特に親しい友達の数もカウントしたい」というような要望がある場合は別処理でカウントする必要がある(と思う)。 試しに次のように配列で入れてみたが、結果は上手くうごかなかった。 (Friendモデルにis_favoriteというフィールドを設け、このis_favoriteが1の要素の合計数を、Userモデルのfriend_favorite_countというフィールドに入れたいとする) var $belongsTo = array( ‘User’ => array( array( ‘className’ => ‘User’, ‘foreignKey’ => ‘user_id’, ‘conditions’ => ”, [...]
jQueryを使ってフォーム要素をリセットしてみた。 <?php $this->Html->scriptStart();?> $(function(){ // 検索フォームの入力値をリセット $("button.reset").click(function(){ $(‘input[type="text"], input[type="radio"], input[type="checkbox"], select’). val(""). removeAttr(‘checked’). removeAttr(‘selected’) }) }) <?php echo $html->scriptEnd();?> //form echo $form->create(); echo $form->text(‘name’); echo $form->text(‘tel’); echo $form->button(‘reset’, array(‘class’ => ‘reset’)); echo $form->end(); ?> ※jQueryへのパスは適宜変更すること。
YUIのCSSフレームワークで便利なリセットCSSがあるんで、クロスブラウザ対策としてデザイン前にlayout.ctp内にかましておく。 <?php echo $html->css(‘http://yui.yahooapis.com/2.8.2r1/build/reset/reset-min.css’); ?> <?php echo $html->css(‘http://yui.yahooapis.com/2.8.2r1/build/reset-fonts-grids/reset-fonts-grids.css’); ?> <?php echo $html->css(‘http://yui.yahooapis.com/2.8.2r1/build/base/base-min.css’); ?>
数時間ハマってしまったので忘れないようにメモ。 開発中のサイトで画像が削除できないという症状が発生した。 削除ボタンを押しても「削除できませんでした」とメッセージが表示され、削除が失敗する。 デバッグモードを2にして、SQLを確認してみると、DELETEが発行されてない。 試しに新しい画像をアップして、それを削除してみると、問題なく削除できた。DELETEのSQLもバッチリ走ってる。 落ち着いて考えてみると、数日前までは全ての画像が問題なく削除できたのだ。 その間に何かやらかしたっけな・・・と思ったときに1つ思い出した。 数日前に、自分担当のシステムファイルとデザイナ担当のViewファイルをマージしたことを。 そしてこのシステムではMediaPluginを使っている。 で、/app/transfer/imgフォルダを確認したら、テストデータの画像がまるごとなくなってるじゃないディスカ。 /app/webroot/media/の中はしっかり移植されてるのに、transferフォルダが放置状態でした。 Mediaプラグインではどうやらtransferフォルダの中に元データを保管しており、 ファイル削除の命令がくると、transferフォルダ内を確認して該当ファイルを見つけ、 次にmediaフォルダ内にある各サイズの関連ファイルを削除するのではないだろうか。 (まったくソース読んでないけど、動作的にそうとしか思えない) だからtransferフォルダにあるべきファイルが無いと、そこで処理が中断してしまうのでは・・・。(全部推測w)
CakePHPで組まれたサイトは初期設定のままだと、存在しないページにアクセスされた場合、それとわかるエラーページが表示されます。 このページをとりあえずプレーンなレイアウトに変えたい場合のMEMO。 1. /app/error.phpを新規作成 <?php class AppError extends ErrorHandler { function error404($params) { $this->controller->layout = "error"; parent::error404($params); } } 2. /cake/libs/view/errors/error404.ctpをコピって、/app/views/error/error404.ctpとして複製する 3. /app/views/errors/error404.ctpを新規作成 <?php echo $content_for_layout; ?> 以上で、デバッグモードが0ならば、真っ白でシンプルなエラーページが表示される。
ローカル環境でいちいち書き換えるのが面倒だと思ったら、簡単に切り替えられるようだったのでMEMO class DATABASE_CONFIG { //本番用 var $default = array( ‘driver’ => ‘mysql’, ‘persistent’ => false, ‘host’ => ‘XXXXXX’, ‘login’ => ‘XXXXXX’, ‘password’ => ‘XXXXXX’, ‘database’ => ‘XXXXXX’, ‘encoding’ => ‘utf8′, ); //開発用 var $dev = array( ‘driver’ => ‘mysql’, ‘persistent’ => false, ‘host’ => ‘localhost’, ‘login’ => ‘root’, ‘password’ => ”, ‘database’ => ‘XXXXXX’, ‘encoding’ [...]
database.phpで開発用と本番用の2種類のDB設定を使い分けている場合、コントローラー内でJOIN指定する時に、きちんとPrefixも含めて組み立てなければならない。 で、テーブルプレフィックスをどうやって取得すればいいのか調べたがなかなか見つけられなかったのでメモ。 $prefix = $this->Model->tablePrefix;
ブログの記事一覧ページを作ったときに、1つの記事にたいして200文字程度で切り捨てるような仕様だった場合。。 記事にはHTMLタグが混入していて、途中のPタグやらIMGタグやらAタグやら、開始タグはあるけど、終了タグを切り捨ててしまった場合に表示崩れがおきた。 しかたないから一覧ページではタグを除去するしかないと思って、探した処理がこちら。 Aタグの途中で切り捨てても、しっかりリンクは正しい形で残っていた。すばらしい。 <?php App::import(‘Sanitize’); $data = Sanitize::html($value['Post']['body'], true); echo $text->truncate($data, 200, ‘…’, true); ?> Ver1.3 <?php echo $text->truncate($data, array(‘ending’ => ‘…’, ‘html’ => true)); ?>
■CKEditorの実装手順メモ 1. ダウンロード http://ckeditor.com/download 2. 解答したckeditorフォルダを下記のように配置 /app/webroot/js/ckeditor/ 3. Viewファイルの修正 <?php //insert head echo $javascript->link(‘ckeditor/ckeditor’, false); ?> //CKEditorを反映させるテキストエリア <?php echo $this->Form->input(‘content’, array(‘type’=>’textarea’, ‘label’=>’内容’, ‘id’=>’editor’)); ?> <script type="text/javascript"> var editor = CKEDITOR.replace( ‘editor’ ); </script> 手順は以上。 ポイントとしては、CKEditorを表示させるテキストエリアのID名と、javascriptのID名を合わせるところくらいです。(上記例では「editor」となってる部分) ■CKEditorの実装手順メモ 1. ダウンロード http://ckfinder.com/download 2. 解答したckfinderフォルダを下記のように配置 /app/webroot/js/ckfinder/ 3. Viewファイルの修正 <?php //insert head echo $javascript->link(‘ckeditor/ckeditor’, false); echo $javascript->link(‘ckfinder/ckfinder’, false); //←追記 ?> <script type="text/javascript"> var editor = CKEDITOR.replace( [...]
