我写了一个自定义的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标记中解析表达式locate并将其写入我的TagNode编译器?
我尝试将表达式解析为一个新字符串,但是当我在编译时松开上下文时:
$parameters = $this->parser->getEnvironment()->tokenize($attribute_value);
或者有没有办法将参数值解析为表达式?像这样:
$value = $parser->getExpressionParser()->parseExpression();
非常感谢你的帮助!
答案 0 :(得分:1)
您需要解析表达式而不是字符串,因此您的变量(甚至函数调用,字符串,计算或其他)将被解释:
而不是:
// 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'));
请查看this answer以了解有关主题的详细信息。