我写了一个自定义的Twig TagTokenParser让我在我的模板中写这个:
{% tag "tagtype" argument1="value1" argument2="value3" %}{% endtag %}
它有效,但我想输入动态属性值:
{% tag "tagtype" argument1="{{ myVar.myProp }}" argument2="value3" %}{% endtag %}
以下是我如何编写我的TagTokenParser:
while (!$stream->test(Twig_Token::BLOCK_END_TYPE)) {
if ($stream->test(Twig_Token::NAME_TYPE)) {
// Read the attribute name
$name = $stream->next()->getValue();
// Read the "="
$stream->expect(Twig_Token::OPERATOR_TYPE, '=');
// Read the attribute value
$token = $stream->expect(Twig_Token::STRING_TYPE);
$value = $token->getValue();
如何解析位于 \Twig_Token::STRING_TYPE 令牌中的表达式并将其写入我的 TagNode 编译器?
我尝试将表达式解析为新字符串,但是当我在编译它时丢失上下文时:
$parameters = $this->parser->getEnvironment()->tokenize($attribute_value);
或者有没有办法将参数值解析为表达式? 像这样:
$value = $parser->getExpressionParser()->parseExpression();
非常感谢您的帮助!
你需要解析一个表达式而不是一个字符串,所以你的变量(甚至是函数调用、字符串、计算或其他什么)将被解释:
而不是:
// Read the attribute value
$token = $stream->expect(Twig_Token::STRING_TYPE);
$value = $token->getValue();
您应该使用:
$value = $parser->getExpressionParser()->parseExpression();
然后,您将能够使用:
{% tag "tagtype" argument1=myVar.myProp argument2="value3" %}{% endtag %}
警告:在TokenParser
中,$value
变量将不包含变量的值,而是一个可编译的表达式,该表达式将在运行时从上下文中检索变量的值。
所以,在你的Node
中,而不是使用 $value
,你需要对它进行子编译:
$compiler->subcompile($this->getNode('value'));
请查看此答案以获取有关该主题的详细信息。