CakePHPを使っていて、form->inputの自動生成が原因でSecurityComponentにブロックされてしまったので解決策をメモします。
環境
- PHP 5.3.3
- CakePHP 1.3.13
現象
CakePHPにおいて、HTMLのformを作るときにはFormHelperがありますが、inputのフィールド名が_idで終わると強制的にtype="select"にしてくれます。
<?= $form->create('Post');?>
...
<?= $form->input('Post.comment_id');?> <!--ここ-->
...
<?= $form->end();?>
...
<div class="input select">
<label for="PostCommentId">Comment</label>
<select name="data[Post][comment_id]" id="PostCommentId"></select>
<!--自動的にドロップダウンリストになる!(が、optionがない。。。)-->
</div>
...
問題
しかし、強制的にドロップダウンリストになってしまう影響で、SecurityComponentを使ったときにPostデータが正しく送れなくなりました。
原因としては、ドロップダウンリストのoptionが設定されていないため、SecurityComponentのPostデータチェック(改竄検知)に引っかかっていました。
解決策
inputのフィールド名が_idで終わっている項目に関して、typeを直接指定することで正しくデータ送信ができました。
今回はtype="text"を表示したかったので'type'=>'text'を記述します。
<?= $form->create('Post');?>
...
<?= $form->input('Post.comment_id', $options => array('type' => 'text'));?> <!--今回はtype="text"を表示させたい-->
...
<?= $form->end();?>
...
<input name="data[Post][comment_id]" type="text" id="PostCommentId"><!--正しくデータ送信できた。-->
...
これで正しくデータが送信されました。
振り返って
今回、フィールド名が_idで終わると自動的にドロップダウンリストを出力するのを初めて知りました。
しかし、基本typeは指定したほうが良いと感じました。