[cakephp]複数のボタンのどれが押されたかを判別する

[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')));?>

するとコントローラでは$this->params['form']['delete']というキーの有無を調べることで、削除ボタンが押されたかどうかをチェックすることができます。

ところが、この削除ボタンがinput type="image"だと、$this->params['form']['delete_x']と$this->params['form']['delete_y']でボタンの押された座標が取得できるようになります。しかし、押されたボタンのname属性を調べたいときには、その挙動は不要です。

そこで、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」などと初めから付けないことが前提です。)

まとめ

地味ですが、フォームに複数のボタンを配置して、押されたボタンを判別する方法をご紹介しました。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ