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要素を出力する簡単なヘルパー』の作り方でした。