表題のとおり、先日とあるWebアプリをCakePHP 1.3 へバージョンアップしました。やはりそのときにつまずいた点が多々あったのでメモしておきます。
まずは公式ドキュメントに目を通しておくことをオススメします。
1, $cakeDebug
まず最初にエラーに気付いたのは$cakeDebugです。
<?php echo $cakeDebug; ?>
まあ公式ドキュメントによると単純に廃止になっただけのようなので、諦めて削除しました。
2, renderElement → $this->element
例えば
<?php echo $this->renderElement("menu")?>
Viewでエレメントを挿入するときは以下のように変更しました。
<?php echo $this->element("menu")?>
「renderElement」という書き方は廃止されています。
3, $session->flash()
$session->flash() はecho つけないでダメになりました。
つまり
<?php $session->flash();?>
1.2はこれで良かったのですが、以下のように変更しました。
<?php echo $session->flash();?>
もちろん、Cake自体の変更点は他にもいっぱいあるので、上記はほんの一部であることをご理解ください。
CakePHPは自身のフレームワークを活用したコードをサーバー側で実行するシェル機能があります。ブラウザのHTTPリクエストに頼らず実行でき、バッチ処理などに活用できます。忘れないうちにメモっておこう。
/path/to/app/vendors/shells/batch.php
にファイルを作る。「batch.php」としたが名前は何でも良い。
<?php
class BatchShell extends Shell {
var $uses = array('Model');//モデルを使用する場合指定しておく
function main() {
//ここにコードを書く
}
}
?>
デフォルトでは、main()メソッドが実行されます。
次にシェルスクリプトを用意。
/path/to/sh/batch.sh
#!/bin/sh
/usr/local/bin/php /path/to/cake/console/cake.php batch -app /path/to/app
シェルスクリプトはあらかじめ実行権限を付けておく。
スクリプト中のパスはサーバーに合わせて適時変更します。
あとはLinuxの場合、cronで実行するように設定する。
スクリプト中の以下のコマンドを直接cronで設定しても動くと思う。
/usr/local/bin/php /path/to/cake/console/cake.php batch -app /path/to/app
参考
CakePHP製のPC+携帯混合のWebサイトで、404のエラー画面が、携帯サイトでもPCと同じでかくてたくさんの画像いっぱいのエラー画面になって問題になりました。
原因を調べていたら、携帯版でもエラー画面はPC用レイアウトとして使っていた「default.ctp」を使用してしまうことが判明(携帯版では「mobile.ctp」を使用していた)。
そこで、CakePHPで404のエラー画面を別のレイアウトで表示するように変更してみた。
<?php
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->layout = "simple";
parent::error404($params);
}
}
?>
携帯でもPCでも表示できるような簡単なHTMLでレイアウトファイル「app/views/layouts/simple.ctp」を作成する。これで携帯版でもPCばりの画像が出なくなり、シンプルなエラー画面になりました。
参考
CakePHP 1.2 のCheatSheetを発見。1.1用は見たことありましたが、1.2用は初見のような気がします。
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
情報元:某有名巨大掲示板より
ついこの間 1.2Rc4リリースのエントリーを書いたと思ったら、すぐにStableがリリースされてました…
はまったのでメモ。
某Webアプリを「スパゲッティPHPスクリプト+SQLite」から「CakePHP+MySQL」の環境に移植作業をしてました。ある情報を一覧表示したときの並び順が、移植元のアプリと違うのでorder句にあれこれ試してみてもうまくいきません。
しょうがないのでGoogle先生に聞いてみた。どうやら、DBMSによってNULLの値が上に来たり下に来たりするとのこと。昇順ソートの場合、SQLiteでは下に来て、MySQL上に来るらしい。こいつが原因だ(つーか常識?)。
上記エントリーを参考にしました。いつもありがとうございます。
答えとしてはorder by 句に ‘IS NULL ‘を追加でOK。具体的なSQL例文は以下のとおり
SELECT * FROM HOGETABLE ORDER BY priority IS NULL, priority;
CakePHP風には
$order = array('Model.priority IS NULL','Model.priority');
$alldata = $this->Model->findAllByFlag('1', null, $order);
こんな感じでしょうか。
いつの間にか、CakePHP 1.2RC4 がリリースされてました。公式サイトからダウンロードできます。早速ダウンロードして、現在進行中の案件にてアップグレード。今のところ目立ったエラーは出てません。正式版はいつリリースされるのやら。
CakePHPの公式ドキュメントサイトであるbook.cakephp.org の日本語ページがところどころ表示されなくてちょっと困り中。ここ2~3日同じ状態で放っておけば直るだろうと思っていたが、改善されない。
FireFoxでアクセスすると、「自動転送がループしています」とのことで、きっと無限にリダイレクトをしているような感じです。SEOでURLに日本語タイトルをぶち込んでるのが悪いような。早くなんとかしてほしいっす。
CakePHP のアソシエーションがよくわからないので、困った。ドキュメント何度も読んでもわからない。
こういった場合は習うより慣れろ。事例を見ながら、「こうかな?」って思ったものを当てはめて、トライ&エラーですね。
以下のエントリーが参考になりました。
特に ECWorks Blogさんの図が大変役に立ちました。
CakePHPでサイト共通の文言やパラメータをどのファイルに記述すべきか?
CakePHPでコードを書いていると、サイト共通や全体で使用する文言やパラメータなどが結構出てきて、コピペで対応してましたが、なんとなく無駄&メンテナンス大変と感じてきました。
CakePHPはまだ初心者なので、どこのファイルに記述すべきか、ちょっと悩んだのでGoogle先生に聞いてみた。
【CakePHP】独自の定数の書き方 | ねねとまつの小部屋
ありました。きちんとまとめられています。素敵です。
ブロガーな皆様には感謝です。困って検索すれば答えがわかる。