2014-12-02 44 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