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