CakePHP まとめて『hidden』要素を出力する簡単なヘルパーを作ってみる

コンポーネントとビヘイビアの作成をしたので、ヘルパーの作り方も紹介しちゃいます。

ヘルパーは、呼んで字のごとく「ビューのコーディングの手助けをする」なので、「フォームから渡されたデータを『hidden』要素にする」ヘルパーを作りたいと思います。
ひとつずつ『hidden』を書くより一気に出力できたほうが楽ですからね^^

ヘルパーは、『AppHelper』クラスを継承して作成します。

▼『AppHelper』クラスを継承

class FormArrHelper extends AppHelper {
    public $name = 'FormArr';
}

あとはいつも通り、CakePHPの命名規則に従い、『/app/views/helpers』に保存します。
これでヘルパーとして使用できるようになります。

準備ができたところで、メソッドの実装をします。
ヘルパー内から他のヘルパーを使用することができるので、『hidden』要素の生成自体は『Formヘルパー』のメソッドを使用しています。
注意点は、ヘルパー内で他のヘルパーを使用するときは、『$this->ヘルパー名』となるぐらいです。

▼作成したヘルパーにメソッドを実装する

class FormArrHelper extends AppHelper {
    public $name    = 'FormArr';
    public $helpers = array('Form');

    /**
     *    渡されたフォームデータの全てをhiddenにした文字列を生成する
     *
     *    @return    hiddenの文字列
     */
    public function allHidden() {
        return $this->_arrHidden($this->data);
    }

    /**
     *    渡されたフォームデータの指定されたデータをhiddenにした文字列を生成する
     *
     *    @param     string    指定したいデータまでのキーを『.(ドット)』でつなげた文字列
     *
     *    @return    hiddenの文字列
     */
    public function givenHidden($keyName) {
        $nameArr = explode('.', $keyName);

        if(count($nameArr) == 2) {
            $givenData[$nameArr[0]][$nameArr[1]] = $this->data[$nameArr[0]][$nameArr[1]];
        } else {
            $givenData[$nameArr[0]] = $this->data[$nameArr[0]];
        }

        return $this->_arrHidden($givenData);
    }

    /**
     *	渡された配列を元にhiddenを生成する
     *
     *    @param     array    hiddenを生成したい配列
     *
     *    @return    hiddenの文字列
     */
    protected function _arrHidden($arr) {
        if(!is_array($arr)) return;

        $hdn = null;

        foreach($arr as $fKey => $fItem) {
            foreach($fItem as $sKey => $sItem) {
                if(is_array($sItem)) {
                    // 配列データならもう一度foreach
                    foreach($sItem as $tKey => $tItem) {
                        // hidden要素の作成
                        $hdn .= $this->Form->hidden("$fKey.$sKey.$tKey");
                    }
                } else {
                    // 配列データじゃなければ、そのままhidden要素の作成
                    $hdn .= $this->Form->hidden("$fKey.$sKey");
                }
            }
        }

        return $hdn;
    }
}

あとは、コントローラーでメンバ変数『$helpers』に作成したヘルパーを指定するだけで使用することができます。

▼コントローラー

class PostsController extends AppController {
    public $name  = 'Posts';
    public $users = array('Post');
    public $helpers = array('FormArr');

    public function index() {
        /*
         *    処理は省略します
         */
    }
}

▼ビュー

<?php echo $formArr->allHidden(); ?>

▼出力結果

<input id="PostText" type="hidden" value="test" name="data[Post][text]">
<input id="PostRadio" type="hidden" value="radio3" name="data[Post][radio]">
<input id="PostCheckbox1" type="hidden" value="1" name="data[Post][checkbox][1]">
<input id="PostCheckbox2" type="hidden" value="2" name="data[Post][checkbox][2]">
<input id="PostCheckbox3" type="hidden" value="0" name="data[Post][checkbox][3]">

配列のデータもちゃんと『hidden』要素になっていますので、通常のフォームなら何も意識せずに『$formArr->allHidden();』を使用するだけで『hidden』要素を出力することができます。

以上が、『まとめてhidden要素を出力する簡単なヘルパー』の作り方でした。

コメントは受け付けていません。