yiiext/twig-rendererでWidgetを使いたい

追記 2012.03.15

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


ほぼ前のと同じですが、素直に this.beginWidgetでもうまくいきました。
前の{% set form = this.createWidget() %}...{{ form.run }}は何かの役に立つかもしれないので残しておきます。

サンプルコード

ポイント

  • void を利用して {% do %}でコントローラー pageTile, breadcrumbs に代入
  • Controller#setBreadcrumbs を追加する
  • this.beginWidget の 戻り値を form に代入する
  • this.endWidget は{% do %} void中 に書く

protected/views/site/login.twig

{% do this.setPageTitle(App.name~' - Login') %}
{% do this.setBreadcrumbs({0:'Login'}) %}

<h1>Login</h1>

<p>Please fill out the following form with your login credentials:</p>

<div class="form">

{% set form = this.beginWidget('system.web.widgets.CActiveForm', {
    'id':'login-form',
    'enableClientValidation':true,
    'clientOptions':{
        'validateOnSubmit':true,
    },
}) %}

    <p class="note">Fields with <span class="required">*</span> are required.</p>

    <div class="row">
        {{ form.labelEx(model,'username')|raw }}
        {{ form.textField(model,'username')|raw }}
        {{ form.error(model,'username')|raw }}
    </div>

    <div class="row">
        {{ form.labelEx(model,'password') |raw}}
        {{ form.passwordField(model,'password')|raw }}
        {{ form.error(model,'password')|raw }}
        <p class="hint">
            Hint: You may login with <tt>demo/demo</tt> or <tt>admin/admin</tt>.
        </p>
    </div>

    <div class="row rememberMe">
        {{ form.checkBox(model,'rememberMe')|raw }}
        {{ form.label(model,'rememberMe')|raw }}
        {{ form.error(model,'rememberMe')|raw }}
    </div>

    <div class="row buttons">
        {{ C.html.submitButton('Login') |raw }}
    </div>

{% do this.endWidget %} 
</div><!-- form -->


void はphpコードが必要なとき多用するかもしれない。contactページではこんな感じで使います。すみません {% do ... %} でお願いします。

<?php $this->widget('CCaptcha'); ?>
↓
{{ void(this.widget('CCaptcha')) |raw }}
↓
{% do this.widget('CCaptcha') %}