LoginSignup
0
0

More than 5 years have passed since last update.

$form->inputのselect自動生成とSecurityComponentのチェックについて

Posted at

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は指定したほうが良いと感じました。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0