Twig は、高速、安全、柔軟な PHP テンプレート エンジンです。多くの組み込みフィルターとタグがあり、テンプレートの継承をサポートしているため、最も簡潔なコードを使用してテンプレートを記述することができます。その構文は、Python のテンプレート エンジン Jinjia および Django のテンプレート構文に非常に似ています。 たとえば、PHP で変数を出力してエスケープする必要がある場合、構文は複雑になります:
ただし、Twig を Yii Framework に統合するときに問題が発生することがあります。公式 Web サイトにはすでに Twig を統合するためのソリューションが記載されているため、ここでは詳しく説明しません。ただし、Twig は PHP 構文をサポートしていないため、一部の式で問題が発生します。たとえば、Form のビューを記述する場合、次のように記述することがよくあります:
passwordField($model,'password'); ?>
endWidget() ?>
;このような構文は twig では表現できないため、カスタマイズされたウィジェット タグをサポートし、必要なコードに自動的に解析できるように Twig の機能を拡張したいと考えています。 TokenParser と Node の合計 2 つのクラスが必要です。 コードはそのすぐ下にあります:
/**
* Yii フレームワークのパーサーウィジェットタグ
*
* {% beginwidget 'CActiveForm' as form %}
* フォームの内容
* {% endwidget %}
*
*/
class Yii_WidgetBlock_TokenParser extends Twig_TokenParser
{
/**
* トークンを解析し、ノードを返します。
*
* @param Twig_Token $token Twig_Token インスタンス
*
* @return Twig_NodeInterface Twig_NodeInterface インスタンス
*/
public function parse(Twig_Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
$name = $stream->expect(Twig_Token::STRING_TYPE);
if($stream->test(Twig_Token::PUNCTUATION_TYPE)){
$args = $this->parser->getExpressionParser() ->parseHashExpression();
}
else{
$args = new Twig_Node_Expression_Array(array(), $lineno);
}
$stream->expect(Twig_Token::NAME_TYPE);
$assign = $stream->expect(Twig_Token::NAME_TYPE);
$stream->expect(Twig_Token::BLOCK_END_TYPE);
$body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
$stream->expect(Twig_Token::BLOCK_END_TYPE);
return new Yii_Node_WidgetBlock(array(
'alias' => $name->getValue(),
'assign' => $assign,
), $body, $args, $lineno, > getTag());
}
/**
* このトークンパーサーに関連付けられたタグ名を取得します。
*
* @param string タグ名
*/
パブリック関数 getTag()
{
return 'beginwidget';
}
public function DecideBlockEnd(Twig_Token $token)
{
return $token->test('endwidget');
}
}
class Yii_Node_WidgetBlock は Twig_Node を拡張します
{
public function __construct($attrs, Twig_NodeInterface $body, Twig_Node_Expression_Array $args = NULL, $lineno, $tag)
{
$attrs = array_merge(array('value' =&g偽)、 $attrs);
$nodes = array('args' => $args, 'body' => $body);
親::__construct($nodes, $attrs, $lineno,$tag);
}
public functioncompile(Twig_Compiler $compiler)
{
$compiler->addDebugInfo($this);
$compiler->write('$context["'.$this->getAttribute('assign')- >getValue().'"] = $context["this"]->beginWidget("'.$this->getAttribute('alias').'",');
$argNode = $this- >getNode('args');
$compiler->subcompile($argNode)
->raw(');')
->raw("n");
$compiler->indent()->subcompile($this->getNode('body'));
$compiler->raw('$context["this"]->endWidget();');
}
}
?>