CakePHP
割と軽量なPHP4/PHP5のフレームワーク、CakePHPで嵌った点などを書いておきます。
DEBUGレベルが0以外の時にAJAX呼び出ししたレンダリング結果にまでデバッグメッセージが含まれる (1.1.10.3825)
こちらのチケットでも指摘されています。解決策として、アクション内で
$this->render(); exit();すると良いと書かれていますが、効いてないようです。
HtmlHelper::dateTimeOptionTagの引数
日本語マニュアルの記述は間違っていて(20061114現在)、正しくは、
HtmlHelper::dateTimeOptionTag(
$tagName,
$dateFormat = 'DMY',
$timeFormat = '12',
$selected = null,
$selectAttr = null,
$optionAttr = null,
$showEmpty = true
)
となります。
dateTimeOptionTag ($tagName, $dateFormat= 'DMY', $timeFormat= '12', $selected=null, $optionAttr=null)ではselectAttrが抜けていますね。
Htmlヘルパを拡張してradioにlabelタグを付ける
標準では<label for="">タグはtags.ini.phpを弄っても出力できないため、ExtendedHtmlHelper(←Helper)を/app/views/helpers/extended_html.phpに作成し、 ヘルパ関数labeled_radio; 引数はradioと同じ)を書きました。 また、tags.ini.phpを/app/config/にコピーし、
labeled_radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%s">%s</label>"を加えます。
あとはExtendedHtmlHelperをHtmlHelperのコピペを交えつつ適当に書くだけですが、実際に走らせてみるとControllerでvar $helpers=array('Html', 'ExtendedHtml');としてもView中で$extended_htmlが使えません。ソースを確認すると、ここはcamel casedな$extendedHtmlが正しかったようです。
複数のモデルを扱うコントローラでscaffoldのview, editが正常に動作しない
var $uses;が定義されていると、Scaffoldはindex以外正常に動作しないようです。 ticket#1605にもなっています。
habtm (has and belongs to many)関係のmultiple selectで無選択を保存しても関係が削除されない
たとえばタグを扱うとき、Post (posts) >- (posts_tags) -< Tag (tags) というリレーションを作成します。HtmlHelperのselectTagでmultipleを指定すれば簡単に$this->dataに結果を取り込んでsaveできます。しかし今まであった関係を削除するには空欄を選択する必要があり、すべて非選択にして保存した場合は$this->data['Tag']がそもそも作成されないため、何も削除されません。
対症療法的解決策ですが、
if (!isset($this->data['Tag'])) $this->data['Tag'] = array();をsaveの前に書くことで、すべて非選択にした場合でも正しく関係が削除されるようになります。
Validation
Railsライクなvalidation[CakePHP Wiki]
Modelにエラーメッセージとvalidation(emptyかどうかなどの単純なものから、メソッドを定義する複雑なものまで)を扱う方法です。
AppModel, ErrorHelperを定義するだけで使えるようです。
