2014-12-02 39 views
0

我写了一个定制的树枝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(); 

如何可以解析表达式在\繁体定位ig_Token :: STRING_TYPE标记并将其写入我的TagNode编译器中?

我尝试解析表达式作为新的字符串,但是当我失去编译时,它的背景:

$parameters = $this->parser->getEnvironment()->tokenize($attribute_value); 

还是有方法来解析参数值作为体现在哪里?像这样:

$value = $parser->getExpressionParser()->parseExpression(); 

非常感谢您的帮助!

回答

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,你需要subcompile它:

$compiler->subcompile($this->getNode('value')); 

请检查this answer有关主题的详细信息。

+0

谢谢!我现在明白需要将参数值解析为一个表达式,然后将其在我的'Node'中进行子编译。 但是,是否有可能解析表达式在“...”模式?例如:'“{{myVar.myProp}}”'?使用类似'$ stream-> skipToken('''); $ value = $ parser-> getExpressionParser() - > parseExpression(); $ stream-> skipToken(''');'? – aprovent 2014-12-03 10:05:12

+0

您可以使用'“#{myVar.myProp}”'进行字符串插值。 – 2014-12-03 10:06:58