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 %}