2012年2月24日

Yii Framework: PHP用テンプレートエンジンTwigを使ったコードサンプル

Twig に関しては こちら を参考にしてください。
Yii で Twig を利用するにあたって、はじめは twig-view-renderer を使っていたのですが、yiiext / twig-renderer のほうがバージョンが新しいこともあって、こちらを使うことにしました。

DL 後 ETwigViewRenderer.php を protected/extensions 下に設置。次に fabpot / Twig から最新の Twig を DL して、lib 下の Twig ディレクトリをまるごと protected/vendors 下に移動。

今回使ったそれぞれのバージョンは以下になります。
  • Twig view renderer - v1.1.2
  • Twig - v1.6.0

あとは protected/config/main.php で諸々の設定をしてあげます。Twig view renderer の README や ETwigViewRenderer.php の中身を見ると設定の例が載っています。

とりあえず Twig 自体触りたてなのと、Yii で Twig を使った情報がほとんどなかったので、わからない箇所が多々ありましたが、デフォルトの layouts/column1.php, column2.php, main.php と GiiのCrud Generator で生成したものを Twig に変換したものが以下になります。
わからなかった箇所
  • オプションで 'autoescape' => true とするとすべての HTML タグが変換されてしまう ( ので、手動エスケープで対処 )
  • ビューでオブジェクトのプロパティを設定できない (のでコントローラに書いている )
  • 「CActiveForm ウィジェットの値を $form に代入する」ということがビューではできない (ので CHtml::form() で代用)
  • CHtml::link() を使うと URLに 0%5Bid%5D みたいなものが付いてしまう (ので$this->createUrl で代用)
  • layouts/column2.twig の CPortlet ウィジェットがどうしてもエラーになる (ので省略)
  • Yii::app() は App. で呼び出せるが Yii::getVersion() の呼び出し方がわからない

便利そうだなと思う箇所
  • オプションで CHtml::link()を link() で呼び出せるように設定できる

とりあえず、現段階では Yii の機能も Twig の機能も殺してしまっている感じなので、もう少し勉強したあとで、また再度試してみたいと思います。


追加補足
CHtml::link() で 0%5Bid%5D が付いてしまう件は記述間違いでした。正しくは以下。
echo C.Html.link(data.id|e, {0: 'id', 'id': data.id}); ( 0 を付ける形になります)

Yii::getVersion() などの呼び出し方はコメントで答えを頂きました。参考にしてください。

CActiveForm ウィジェットの件は こちら こちらで解決できました。コメント側で表現されているやり方のほうが良さそうに見えました。

layouts/column2.twig の CPortlet ウィジェットの件も、同じような形で表現して解決できました。column2.html のコードを更新しましたので、参考にしてみてください。

ビューでオブジェクトのプロパティを設定できない件は Controller.php で public setBreadcrumbs($value) { $this->breadcrumbs = $value; } とすることで解決しました (menuプロパティも同様) 。

参考リンク

3 件のコメント:

  1. ETwigViewRenderer の forum に書き込まれていたのでこちらに記事が書かれているかもと思いやってきました。
    protected/config/main.php の globals に

    'viewRenderer'=>array(
    'class'=>'ext.etwigviewrenderer.ETwigViewRenderer',
    'globals' => array(
    'Yii' => 'Yii',
    ),
    ),

    Yii を加えて {{ Yii.getVersion }} で呼び出せましたよ。

    返信削除
    返信
    1. なるほど!ありがとうございます!
      globalsとfunctionsはすごく使えそうだなと思いました
      ただ、多く設定した場合のパフォーマンスが気になりますが

      削除
  2. もひとつ。
    {% set form = this.createWidget() %} すればwidgetをあきらめなくてもいいかも知れません。

    返信削除