すごくハマったのでメモ。
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。
