すごくハマったのでメモ。
CakePHPでフォームのPOSTデータをコントローラで受ける場合、bakeのコードは
if (!empty($this->data)) { // POSTされた場合の処理 }
こうなっていますが、フォームのデフォルト値をコントローラで設定したり、フォームのsubmitボタンごとに処理を分けたい時などのために、僕は次のようにPOSTの判定を行なっています。
ビュー
$this->Form->create(); $this->Form->input("janken", array("options" => array( "1" => "グー", "2" => "チョキ", "3" => "パー", ))); // ちょっと変な例ですが $this->Form->submit("じゃんけん", array("name" => "submit")); $this->Form->submit("過去の戦績", array("name" => "search")); $this->Form->submit("戦績の消去", array("name" => "clear")); $this->Form->end();
コントローラ
if (isset($this->params['form']['submit'])) { // submitが押された場合の処理 } elseif (isset($this->params['form']['search'])) { // searchが押された場合の処理 } elseif (isset($this->params['form']['clear'])) { // clearが押された場合の処理 } else { // おまけ。フォームの初期値 $this->data['Model名']['janken'] = 1; }
通常これ自体は問題ないと思うのですが・・・
今回ハマったのはこのフォームをjQuery(javascript)で送信しようと思ったら出来なかったことなのです。
フォームにsubmitというnameの要素があるとsubmit()が効かない
「javascriptでsubmitできない?」を見てわかったのですが、フォームにsubmitというnameを持つ要素があるとそちらを参照してしまうために、submit()が効かないようです。
別の名前searchなどでは問題が無いので、今後はsubmitという名前を使わないように気を付けないと。少なくともjavascriptで送信したい場合はσ(^_^; )
一応ソースのサンプルです。
<?PHP echo $this->Html->scriptStart(array("inline" => false)); ?> $(function(){ // じゃんけんが変更されたら $("#jankenのID").change(function(){ $("#フォームのID").submit(); }); }); <?PHP echo $this->Html->scriptEnd(); ?> $this->Form->create(); $this->Form->input("janken", array("options" => array( "1" => "グー", "2" => "チョキ", "3" => "パー", ))); // ちょっと変な例ですが $this->Form->submit("じゃんけん", array("name" => "create")); $this->Form->submit("過去の戦績", array("name" => "search")); $this->Form->submit("戦績を消去", array("name" => "clear")); $this->Form->end();
これでOK。