ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

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だけは結構辛いモノがあるように感じます。