アーカイブ : CakePHP

CakePHP2での開発一段落

試しにCakePHP2で開発してきましたが、とりあえず一段落しました。

いろいろな命名が1.3から変わっていますので注意が必要です。HTMLヘルパーは必ず$this->Htmlにしなければいけないとか、Appの下のディレクトリが頭が大文字になっているとか、細かい変更がありますが、だんだんと慣れていくことでしょう。

一番変わったのは、Authコンポーネントです。こちらは参考となるサイトはありませんでした。やはりCakePHPの本家サイトのCookBookが一番まとまっています。というよりも、ここしか参考となる資料は今のところありません。ここで何回も言いましたが、2の情報を知りたければ、絶対にCookBookを読む必要があります。

こいうことで、今年の営業はこれでおしまいにしていいかしら。

CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

CakePHP辞典 Pocket詳解

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

Cakephp2でTextHelper::truncate()がおかしいとき

2でTextHelper::truncate()を動かすと、1回目の処理が文字化けしてしまいました。どういう訳か2回目以降は正常に切り取ってくれます。

/lib/Cake/View/Helper/TextHelper.phpのソースを追ってみると、mb_strlen()が正しい文字列の長さを返していません。strlen()と同じ値を返してくれます。それで後のmb_substr()で正しく切り取ってくれていませんので文字化けしているようです。

strlen()になっているということは、予想通りmb_strlen()の第4パラメータにエンコードを指定しておけばOKでした。ということは、.iniのmbstringの項目を正しく設定していないのが原因です。そこで、

[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8

なんて設定してApacheを再起動すると、ソースに手を入れずにエンコードなしで文字化けしないで表示します。/app以外のソースはいじらないのが基本。

つまり、日本語のサイトを作成するときは、mbstringをサボらずに設定しましょうというという基本を忘れるなということでした。

CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

CakePHP辞典 Pocket詳解

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHPでタイムゾーンを明示しないとUTCでcreatedに格納される

CakePHPで発生した障害の対応のメモ。

config/core.phpに

date_default_timezone_set('Asia/Tokyo');

とタイムゾーンを明示してあげないと、モデルからテーブルにレコードを追加したとき、UTCの世界標準時でcreatedに現在時間が格納されてしまいます。

5.3からのようです。

CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

CakePHP辞典 Pocket詳解

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

#CakePHPのサイトをサーバーに配置してはまったこと。

ローカルPCで開発していたCakePHPのサイトをサーバーに配置したら動かなかった。対応していく過程のメモ。

まずはPHPのバージョン。最新のPHP5.3にしたのは間違え。大量にエラーをはく。これは使っているCakePHPのバージョンがPHP5.3に対応していないため。以下のページに対応方法が書いてある。

PHP 5.3だとCakePHPで大量のエラー

あまりいじりたくないので、PHPのバージョンを下げる。前の記事のようにPHPの複数のバージョンを切り替えるようにしておく。インストールしてあったバイナリのMySQLとPostgreSQLの指定の方法がわからないので、こちらもソースからコンパイルしなおし。

次はページが真っ白になったり、ページが見つからなっている。mod_rewriteが動いていないことが判明。httpd.confでのパスの指定が間違えていた。単純なミス。

以上、一日テストサーバーの構築で潰れた。プログラムの修正は半日で済んだのに・・・。

CakePHP 1.3によるWebアプリケーション開発 オープンソース徹底活用

CakePHP辞典 Pocket詳解

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakaPHP。また同じことで悩んでいた

だめじゃないか。自分。また同じことで悩んしまうなんて。半日無駄にした。同じことで繰り返して悩むなんて、このブログの意味はないではないか。

CakePHP: The requested address AjaxURL was not found on this server

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHPでの多数レコードへのバッチ処理

現在、テストフェーズに入っているサイトで不具合発見。6万レコードのテーブルに対して再処理を行う必要があります。

CakePHPで開発しているので、すべてのレコードをfind(“all”)で取得してから処理するのでは、おそらくメモリのオーバーフローで止まることは確実です。そこで、レコードを分割して取得して処理することにします。

CakePHPのモデルに対するfindメソッドはよく使うのですが、意外とパラメータに関してはマニュアルに丁寧に説明してくれていません。しかし、

array(
	'conditions' => array('Model.field' => $thisValue), //条件の配列
	'recursive' => 1, //int
	'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
	'order' => array('Model.created', 'Model.field3 DESC'), //文字列か配列でのorder定義
	'group' => array('Model.field'), //GROUP BYするためのフィールド
	'limit' => n, //int
	'page' => n, //int
	'offset' => n, //int
	'callbacks' => true //false, 'before', 'after'が指定できます。
)

MySQLを使っているのであれば、limit,offsetは想像付くのですが、pageって何?っていうところでしょうか?

CakePHPのソースファイル(cake/libs/model/model.)のfind()の部分を読むとわかるのですが、page(ページ数)とlimit(表示レコード数)を指定すれば自動的にoffset(先頭からのレコード位置)を計算してくれるのでした。

他にマニュアルにないパラメータがあるかもしれませんので、CakePHPのソースは読んだ方がいいかもしれません。といいながら、callbacksは何をするのか自分はわかりませんが。


Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHP: The requested address AjaxURL was not found on this server

CakePHPではまったことの覚え書きです。CakePHPに興味なければ飛ばしてください。

サーバーにAjax関係をCakePHPで実現して、ファイルをアップしたとき、ブラウザのデバックを見るとAjaxのURLが404でエラーが返ってきました。URLを単独で実行すると

The requested address “AjaxのURL” was not found on this server.

とエラーになります。いろいろと検索してみると、

  • app/tmp/cache/modelsの下のファイルを削除する。
  • app/tmpのパーミッションを777にしろ。

など出てきますが、どうもうまくいきません。

結局、基本に戻ってajaxで呼び出されるアクションの

Configure::write(‘debug’, 0);

Configure::write(‘debug’, 3);

にデバッグモードにしてみると、何のことはない、このアクションのViewファイルが作成されていないだけでした。

こんなことで、3時間も無駄にしてしまいました。基本に戻ることが大事です。

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHPで勝手にログアウトされてしまう件

CakePHPで作成したサイトで、ログインしている状態で他のドメインへのリンクを押すと、戻ってきたときに勝手にログアウトされてしまいます。この件は、Googleで調べてみたら、ありました。同じことで悩まれていました。

対応方法の詳細は、ここから。ユーザーエージェントのチェックをしないようにするように設定するだけ。はまりそうなところで、このサイトで助かった。感謝!

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHPのfind()のマニュアルが新しくなった?

CakePHPでデータを取得するメソッドfind()のマニュアルですが、知らないうちに新しく更新されていた。気が付かなかっただけ? でも、これはありがたい。

CakePHPの ポケットリファレンスに書いてあるfind()のページだと

Model::($conditions, $fields, $order, $recursive)

となっていますが、新しいfind()では、

Model:find($type, $params)

なのです。$typeに'all''first''count''list''neighbors' または 'threaded' のいずれかを設定すると、

findAll(), findCount()の代わりに使えます。パラメータをだらだらつなげなくてもいいのがいい。'list''neighbors' って何ということで、まだわかっていませんので、これからマニュアルを読んでみます。まだ、英文の部分が残っているけど。

でも、そろそろCakePHPのポケットリファレンスの改訂版を出してくれないかな。内容が古くなっているけど、ささっと引けるので便利に使っています。

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE

CakePHPのformヘルパーのラジオボタンで、デフォルトを指定する。

ちょっとはCakePHPのformヘルパーではまったこと。覚え書きです。

formヘルパーのinputメソッドでラジオボタンを表示できます。

$groups = array(‘a’=>1, ‘b’=>2, ‘c’=>3);

$form->input(‘User/group_id’, array(‘options’=>$groups, ‘type’=>’radio’));

といった書き方です。

こここで、bをデフォルトの選択にしたいとします。

$form->input(‘User/group_id’, array(‘options’=>$groups, ‘type’=>’radio’, ‘checked’=>2));

なんてしてもダメのようです。

正解は、コントローラで

$this->data['User']['group_id']=’2′;

のように初期値を入れていかないといけないようです。

Bookmark this on Google Bookmarks
このエントリーをはてなブックマークに追加
Bookmark this on FC2 Bookmark
Bookmark this on Livedoor Clip
Share on GREE