Dan*_*oap 4 php parsing templates twig
对于我们正在开发的自定义CMS,我们希望使用twig模板(因为这是我们的前端构建的).模板可以使用twig提供的"默认"功能集(例如包括,块,标签,函数,您可以命名),但我们也希望为页面提供某些"小部件".
例如,模板可能如下所示:
<h1>{{ 'our_products'|translate }}</h1>
{{ widget_search(widget_parameters) }}
Run Code Online (Sandbox Code Playgroud)
所有函数调用widget_都是我们特殊的CMS小部件.
在后端,我们希望编辑人员填写我们的小部件所需的参数.因此,对于包含widget_search例如的模板,应该向他们显示输入字段,他们可以在其中输入搜索词,但是他们不应该更改任何其他内容.对于每种页面类型,我们将创建一个由我们的前端开发人员手工制作的模板.
我现在的问题是:我们如何分析树枝模板并提取所有函数调用的列表,以便我们可以构建后端GUI(无需渲染后端的模板)?
我调查了Twig_Parser但是我不确定如何利用它?特别是,如果它包含其他文件会发生什么?这会被解析器解决吗?
(因为后端GUI是面向公众的网站的单独应用程序(但他们都知道模板文件),我们不能简单地渲染模板,因为前端可能注册了后端根本无法执行的Twig函数. )
在渲染之前,Twig代码是:
对您有用的对象是Node_Module:您可以递归地遍历它以非常容易地查找所有函数(或任何其他函数).
示例(使用原生Twig函数,因为我没有您的函数):
<?php
require("vendor/autoload.php");
$env = new \Twig_Environment(new \Twig_Loader_Array(array()));
$template = "
<h1>{{ 'our_products'|upper }}</h1>
{{ max([1,random(),random()]) }}
";
$tree = $env->parse($env->tokenize($template));
$functions = array();
listFunctionCalls($tree, $functions);
function listFunctionCalls($node, array &$list) {
if ($node instanceof \Twig_Node_Expression_Function) {
$name = $node->getAttribute('name');
if (!in_array($name, $list)) {
$list[] = $name;
}
}
if ($node) {
foreach ($node as $child) {
listFunctionCalls($child, $list);
}
}
}
var_dump($functions);
Run Code Online (Sandbox Code Playgroud)
给出以下结果:
$ php test.php
array(2) {
[0]=>
string(3) "max"
[1]=>
string(6) "random"
}
Run Code Online (Sandbox Code Playgroud)
你可以用树做任何事情,享受!