如何解析枝条自定义标签参数
问题描述:
我写了一个定制的树枝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();
非常感谢您的帮助!
答
您需要解析表达式,而不是一个字符串,所以你的变量(或者甚至是一个函数调用,一个字符串,计算或其他)将被解释:
相反的:
// 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有关主题的详细信息。
谢谢!我现在明白需要将参数值解析为一个表达式,然后将其在我的'Node'中进行子编译。 但是,是否有可能解析表达式在“...”模式?例如:'“{{myVar.myProp}}”'?使用类似'$ stream-> skipToken('''); $ value = $ parser-> getExpressionParser() - > parseExpression(); $ stream-> skipToken(''');'? – aprovent 2014-12-03 10:05:12
您可以使用'“#{myVar.myProp}”'进行字符串插值。 – 2014-12-03 10:06:58