Twig 如何向自定义细枝添加变量';令牌解析器?
我想制作自定义的细枝标记,类似于include标记,但从json文件中获取变量。也就是说,在twig模板中,我写{%section“header”%},它包括头文件,并将config.json文件中的变量仅附加到此模板。如何做到这一点Twig 如何向自定义细枝添加变量';令牌解析器?,twig,Twig,我想制作自定义的细枝标记,类似于include标记,但从json文件中获取变量。也就是说,在twig模板中,我写{%section“header”%},它包括头文件,并将config.json文件中的变量仅附加到此模板。如何做到这一点 在写这个问题之前,我读了几遍,但没有找到任何具体的解决方案如何解决我的问题好的,我已经创建了一个小模型,应该可以帮助您在这条道路上走得更远 MyNode.php 小枝 {%mynode%} {{injected_variable.glossary.title}{
在写这个问题之前,我读了几遍,但没有找到任何具体的解决方案如何解决我的问题好的,我已经创建了一个小模型,应该可以帮助您在这条道路上走得更远 MyNode.php 小枝
{%mynode%}
{{injected_variable.glossary.title}{{{#打印示例词汇表}
{%endmynode%}
可能重复“否”,这不是启动节点的好教程。要向节点传递参数,我建议您查看节点,$name=$stream->expect(Twig_Token::name_TYPE)->getValue()代码>我同意这是一个很棒的教程。这对于创建自定义标记非常有帮助。我遇到的问题是,找不到向解析器添加变量的方法。不是从模板(比如{%include with{'foo':'bar'}%}),而是在解析或编译节点时从其他源插入,您希望能够在定义的节点内使用外部变量吗?非常感谢!
<?php
namespace Namespace\Base\Twig\Node;
class MyNode extends \Twig_Node {
private static $nodeCount = 1;
/**
* @param \Twig_Node_Expression $annotation
* @param \Twig_Node_Expression $keyInfo
* @param \Twig_NodeInterface $body
* @param integer $lineno
* @param string $tag
*/
public function __construct(\Twig_NodeInterface $body, $lineno, $tag = null) {
parent::__construct(['body' => $body,], array(), $lineno, $tag);
}
public function compile(\Twig_Compiler $compiler) {
$i = self::$nodeCount ++;
$json_data = json_decode(file_get_contents(__DIR__ . '/../../../../files/tmp/file.json'), true);
$compiler
->addDebugInfo($this)
->write('$context[\'injected_variable\'] = '.var_export($json_data, true).';') //add data to context
->subcompile($this->getNode('body')) //compile everything in between the node
->write('unset($context[\'injected_variable\']);'); //clean context afterwards
}
}
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
<!DOCTYPE html>
<html>
<head></head>
<body>
{% mynode%}
{{ injected_variable.glossary.title }} {# prints example glossary #}
{% endmynode %}
</body>
</html>