ホームページ  >  記事  >  バックエンド開発  >  Yii フレームワークでの PHP テンプレート エンジン Twig の使用例_PHP チュートリアル

Yii フレームワークでの PHP テンプレート エンジン Twig の使用例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:28:17836ブラウズ

Twig は、高速、安全、柔軟な PHP テンプレート エンジンです。多くの組み込みフィルターとタグがあり、テンプレートの継承をサポートしているため、最も簡潔なコードを使用してテンプレートを記述することができます。その構文は、Python のテンプレート エンジン Jinjia および Django のテンプレート構文に非常に似ています。 たとえば、PHP で変数を出力してエスケープする必要がある場合、構文は複雑になります:

コードをコピーします コードは次のとおりです:


< ;?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?>

しかし、Twig では次のように書くことができます:
コードをコピー コードは次のとおりです:

{{ var }}
{{ var|エスケープ }}
{{ var|e }} {# 変数をエスケープするショートカット #}

配列を走査します:
コードをコピーします コードは次のとおりです:

{% for user in users %}
* { { user.name }}
{% else %}
ユーザーが見つかりませんでした。
{% endfor %}

ただし、Twig を Yii Framework に統合するときに問題が発生することがあります。公式 Web サイトにはすでに Twig を統合するためのソリューションが記載されているため、ここでは詳しく説明しません。ただし、Twig は PHP 構文をサポートしていないため、一部の式で問題が発生します。たとえば、Form のビューを記述する場合、次のように記述することがよくあります:

コードをコピーします コードは次のとおりです。 :

beginWidget('CActiveForm'); ?>
ログイン


  • label($model,'password'); ?>

    passwordField($model,'password'); ?>


error($model,'password'); ?>

endWidget() ?>

;このような構文は twig では表現できないため、カスタマイズされたウィジェット タグをサポートし、必要なコードに自動的に解析できるように Twig の機能を拡張したいと考えています。 TokenParser と Node の合計 2 つのクラスが必要です。 コードはそのすぐ下にあります:



コードをコピーします コードは次のとおりです:

/*
* このファイルは Twig の拡張子です
*
* (c) 2010 lfyzjck
*/

/**
* 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();');
}
}
?>


次に、Twig が初期化される文法解析クラスを追加します:
コードをコピーします コードは次のとおりです:

$twig->addTokenParser(new Yii_WidgetBlock_TokenParser);

その後、それを小枝テンプレート これは書かれています:
コードをコピーします コードは次のとおりです:

{% beginwidget 'CActiveForm' as form %}


  • {{ form.label (モデル, 'ユーザー名' ) }}
    {{ form.textField(モデル, 'ユーザー名') }}


  • {{ form.label(model, 'パスワード') }}
    {{ form.passwordField (model, 'password') }}


{% endwidget %}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/802218.html技術記事 Twig は、高速、安全、柔軟な PHP テンプレート エンジンであり、多くの組み込みフィルターとタグがあり、テンプレートの継承をサポートしているため、最も簡潔なコードを使用してテンプレートを記述することができます。彼の言語...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。