tjtjtjのメモ

自分のためのメモです

yiiext/twig-rendererでビューテンプレートを継承したい

追記 2012.03.15

やだなーと思っていた{{void(...)}}ですが、{%do...%}で書くべきと気がつき、修正しました。


yiiのスケルトンappでは ページレイアウトの大枠を layouts/main.php、内部のカラム構造を layouts/column1.php, column2.php に実装しています。Twig ではこれをテンプレート継承で実装します。yiiext/twig-rendererというかTwigを使うならやはりテンプレート継承を使って実装したいところ。
yiiのスケルトンappからの書き換えはおもったより簡単です。こちらが参考になりました。

サンプルコード

親テンプレート

子に委譲するところをblockにする

protected/views/layouts/main.twig のごく一部

    <?php echo $content; ?>
↓↓↓↓↓↓↓
    {% block container %}
    {% endblock container %}
子テンプレート

親の上書きしたいブロックを実装する。{{content|raw}}にはコントローラで$this->render()した結果をはめ込みます。ここはyii風。

protected/views/layouts/column1.twig

{% extends 'views/layouts/main.twig' %}

{% block container %}
<div class="container">
    <div id="content">
    {% block content %}
    {{content|raw}}
    {% endblock content %}
    </div><!-- content -->
</div>
{% endblock container %}

protected/views/layouts/column2.twig

{% extends 'views/layouts/main.twig' %}

{% block container %}
<div class="span-19">
    <div id="content">
        {% block content %}
        {{content|raw}}
        {% endblock content %}
    </div><!-- content -->
</div>
<div class="span-5 last">
    <div id="sidebar">
    {% do this.beginWidget('zii.widgets.CPortlet', {
        'title':'Operations',
    }) %}
    {% do this.widget('zii.widgets.CMenu', {
        'items':this.menu,
        'htmlOptions':{'class':'operations'}
    }) %}
    {% do this.endWidget %}
    </div><!-- sidebar -->
</div>
{% endblock container %}