time 2017/10/17
コンポーネントとビヘイビアの作成をしたので、ヘルパーの作り方も紹介しちゃいます。
ヘルパーは、呼んで字のごとく「ビューのコーディングの手助けをする」なので、「フォームから渡されたデータを『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要素を出力する簡単なヘルパー』の作り方でした。