Helper中からさらにテンプレートを呼び出したいとき
流儀としてはHelperの中で、echoとかでHTMLタグをベタ出力するのが流行なんでしょうか?Railsやったこと無いのでよく分かりません。
ともあれ、Helper中からさらにテンプレートを呼び出したいとき・・・なんですが、Akelosの流儀かどうか分からないのですが出来たのでc⌒っ*゚ー゚)っφ メモメモ...。
要点は、AkActionControllerのrender()メソッドを呼び出す点です。このため、HelperのクラスはAkActionViewHelperを継承して $this->_controller を利用可能になっている必要があります。
AkActionController#render() :
function render($options = null, $status = 200) { ... }
$options は連想配列になります。どういったキーが設定されているのか、に応じて、内部的にAkActionControllerが実装している
- AkActionController#renderFile()
- AkActionController#renderText()
- AkActionController#renderTemplate()
- AkActionController#renderAction()
- AkActionController#renderPartial()
- AkActionController#renderPartialCollection()
などを切り替えて呼び出しています。
$options['partial']が指定されているとrenderPartial()になります。さらに$options['collection']が指定されていると、renderPartialCollection()になります。すみません、renderPartialCollectionについてはよく分かりません。
AkActionController#renderPartial() :
function renderPartial( $partial_path = null, $object = null, $local_assigns = null, $status = null) { ... }
さて、renderPartial()は4つの引数をとります。AkActionController#render()の$objectで指定した引数がどうマッピングされるのかを以下に示します。
$options = array( 'partial' => 'foo/bar', 'object' => ..., 'locals' => array('a' => 123, ...), 'status' => 200, ); $controller->render($options, 200); →render()内部: renderPartial( $objects['partial'], @$objects['object'], @$objects['locals'], @$objects['status']);
- 'partial' : 'コントローラ名'/'テンプレート名' or 'テンプレート名'。'テンプレート名'は実際のファイル名は"_"で始まりますが、Partialとして指定するので、"_"を省略します。
- 'object' : すみません、これよく分かんないです。AkActionView#renderPartial()まで辿ると、上書きされるっぽいです。
- 'locals' : ローカルにバインドする変数(変数名 => 変数 の連想配列)
- 'status' : ステータスコード
実際のコード例
app/helpers/foo_helper.php : fooコントローラのhelper
<?php class FooHelper extends AkActionViewHelper { function like_symfony_component() { return $this->_controller->render(array( 'partial' => 'foo/partial_sample', 'locals' => array( 'key1' => 123, 'key2' => "Hello, World", ) )); } }
'partial'キーですが、コントローラ名を省略すると現在のコントローラ名が仮定される・・・っぽいです、多分。
app/views/foo/_partial_sample.tpl :
<h2>Like symfony's component</h2> <?php echo $key1 ?> <?php echo $key2 ?>
最後にばれてしまいましたが、ようするにsymfonyのcomponent相当をAkelosでやるには・・・と探索していただけの話です。componentってsymfony独特なんでしょうか?partialとhelperだけは結構辛いモノがあるように感じます。