CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP2]Jqueryが正しく動かないのはhiddenVarsのせいだった

Jqueryで動的にフォームを取得していろいろやっていたが、どうもうまく動かなくなった。
値が正しくとれなかったり、undefinedになったり、動きがめちゃくちゃになってしまった。

スポンサードリンク

スポンサードリンク

原因はフォームにCakePlusのこれだった。

echo $this->FormHidden->hiddenVars();

画面遷移が複雑になって、複数の画面で入力しなければならなくなったので、hiddenVars()でフォームデータの持ち回りをするようにしたのだが、これが良くなかった。
このメソッドはdataの中身をhiddenで書き出してくれるんだが、タグにidを出している。で、画面に表示するパーツも同じidになってしまうので、同じページ内でidが重複してしまって値が正しくとれないのが原因だった。
確認画面とかで見えるパーツが一つも必要ない時ならいいけど、今回のように複数の画面での入力には使わないほうが無難。
一応、hiddenVars()にhidden出力したいデータのみセットして渡せば出力の選択は可能です。

追記
FormhiddenHelperを改造してみた。
$this->Form->fieldsに出力したフォームの一覧が入ってくるっぽいので、このリストに入ってくるものは出力を除外するようにしてみました。
具体的にはFormhiddenHelperの_createHidden()を以下のように改造します。
そして、$this->Form->end();の直前にecho $this->FormHidden->hiddenVars();を出力します。

    function _createHidden( $data, $parent_key = null ){
        if( is_array( $data ) ){

            foreach( $data as $key => $val ){
                $parent_key_arr = ( isset($parent_key) ) ? $parent_key . '.' . $key : $key ;
                self::_createHidden( $val, $parent_key_arr );
            }

        }else{
            //すでに出力済みなら出力しない
            if(array_key_exists($parent_key,$this->Form->fields)){
                return ;
            }
            if(in_array($parent_key,$this->Form->fields)){
                return ;
            }
            $this->hidden_output .= $this->Form->hidden( $parent_key )."\n";
        }
    }

一応、大丈夫っぽいけど、ちゃんと精査してないので自己責任で使ってください。
時間ができたらプッシュしてみようかな?

参考
https://github.com/ichikaway/cakeplus/tree/2.0

スポンサードリンク
スポンサードリンク

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