[cakephp]複数のボタンのどれが押されたかを判別する
連休は足の踏み場もない部屋を片付けて模様替えをしていたtanakaです。今日はCakePHPのコネタで、複数のボタンをフォームに設置する話を紹介します。
複数の送信ボタンが欲しい
例えば、更新フォームに更新ボタンと削除ボタンが欲しいとします。単にinput type="submit/image"なボタンを配置すると、サーバーサイドで、押されたボタンが判別できません。(例が強引ですみません。更新ボタンと、更新して戻るボタンとかでもかまいません。でも、この例であれば、削除ボタンをリンクにすればほぼ解決しますね。それはさておき)
2つのボタン
<?php e($form->submit('更新'));?>
<?php e($form->submit('削除'));?>
この2つのボタンのどちらが押されたかを判別するにはname属性を追加するといいでしょう。
<?php e($form->submit('更新'));?>
<?php e($form->submit('削除', array('name' => 'delete')));?>
するとコントローラでは
ところが、この削除ボタンがinput type="image"だと、
そこで、submitとimageの挙動の差を意識しなくても押されたボタンのname属性をチェックできるメソッドを作ります。
/**
* POSTメソッドでアクセスしてきたときに、submitボタンのname属性を取得する
* (押されたsubmitボタンのname属性が取得できる)
*/
function _getSubmitName()
{
if (empty($this->params['form'])) {
return false;
}
// foreach を使いつつ最初の要素しか使わない
foreach ($this->params['form'] as $key => $value) {
// input type="image" のときは _x などの文字列が付与される
preg_match('/^(.*?)(_[xy])?$/', $key, $matches);
return $matches[1];
}
}
このメソッドをAppControllerに書いて、フォームでPOSTされたときのname属性を取得することができます。(ただし、name属性に「_x」などと初めから付けないことが前提です。)
まとめ
地味ですが、フォームに複数のボタンを配置して、押されたボタンを判別する方法をご紹介しました。