【发布时间】:2023-03-20 17:07:01
【问题描述】:
为了学习,我创建了自己的 TransTokenParser(解析 {% trans %} 和 {% trans with %})-> 解析器本身运行良好,除了后一种变体:trans with。
解析器读出分配的变量,但自动转义 " 和 ',因此它们不会显示(变量在没有 ' 或 " 的情况下直接从解析器中出来)。
例如,我们在树枝中有这个块:
{% trans with {'{test}': coolFunctionWhichReturnsString('testParameter')} %}
UNIQUE_TRANS_ID
{% endtrans %}
这个块可以用 trans 和诸如此类的东西很好地解析,但是将 'with' 之后的部分变成这样:{{test}: coolFunctionWhichReturnsString(testParameter)}
我尝试在 Twig_Environment 中设置参数
new Twig_Environment(..., ['autoescape' => false])
我尝试在 twig 下的 config.yml 中设置一个全局变量:
autoescape: false
这两种解决方案都没有反映 twig -> php 行为的变化。 (它将自动转义设置为 false,如在此处初始化 twig 环境时的 var_dump 中所示:
array (size=13)
'debug' => boolean true
'charset' => string 'UTF-8' (length=5)
'base_template_class' => string 'Twig_Template' (length=13)
'strict_variables' => boolean true
'autoescape' => boolean false
这是我的代码:
/**
* @return array
* @throws \Twig_Error_Syntax
*/
private function parseVariant(): array
{
$stream = $this->parser->getStream();
$trans = null;
$json = null;
//SIMPLE VARIANT trans
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE, '');
if (null !== $stream->nextIf(\Twig_Token::BLOCK_END_TYPE)) { //%} TRANS_LITERAL
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE, '');
$trans = $stream->expect(\Twig_Token::TEXT_TYPE)->getValue();
} elseif (null !== $stream->nextIf(\Twig_Token::NAME_TYPE, 'with')) { // {% trans with {} %} TRANS_LITERAL
$stream->next();
$json = implode($this->getInlineParams());
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);
$stream->nextIf(\Twig_Token::BLOCK_END_TYPE);
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);
$trans = $stream->expect(\Twig_Token::TEXT_TYPE)->getValue();
//die();
}
// {% endtrans %}
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);
$stream->expect(\Twig_Token::BLOCK_START_TYPE);
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);
$stream->expect(\Twig_Token::NAME_TYPE);
$stream->nextIf(\Twig_Token::PUNCTUATION_TYPE);
$endLine = $stream->expect(\Twig_Token::BLOCK_END_TYPE)->getLine();
return [$json, $trans, $endLine];
}
问题在于 $json,在这种情况下指的是:
$json = implode($this->getInlineParams());
获取内联参数:
protected function getInlineParams(): array
{
$stream = $this->parser->getStream();
$params = [];
while (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
$params[] = $this->parser->getStream()->next()->getValue();
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
return $params;
}
编辑:使用 ExpressionParser 会引发错误,因为键/值没有 "" 或 ''..
另一个编辑:我已经尝试在 twig 中修改运行时和初始化后的“转义符”扩展,包括所有策略 - 没有任何帮助
有什么建议吗? 提前致谢。
【问题讨论】:
-
我没有太多时间来回答这个问题,我可以在星期一仔细看看。无论如何,在这一点上,我建议你看看
IncludeToken,看看here - 我相信你可以在那里得到一些灵感 -
Twig 绑定变量键的语法如下
{% set object = { (key1): "a string", (key2): some_function(3) } %}其中key1和key2是保存字符串的变量。坚持使用这种语法可能更容易。 -
@NicolaiFröhlich 这不是 OP 面临的问题。当
twig将模板编译成PHP进行渲染时,问题就出现了 -
首先,感谢参与 cmets 部分并试图找到解决方案的所有人。 @DarkBee:期待周一的回复!我会查看您引用的链接。 @ NicolaiFröhlich 请假设我根本无法编辑树枝-> 因此将树枝文件更改为任何格式都不适用。 :)
-
我想知道你为什么不看看 twig-bridge-bundle,它应该包含原始的 trans Node 东西。