如何从Twig模板中检索所有变量?

Ste*_*big 39 php template-engine symfony twig

是否可以使用PHP检索Twig模板中的所有变量?

示例someTemplate.twig.php:

Hello {{ name }}, 
your new email is {{ email }}
Run Code Online (Sandbox Code Playgroud)

现在我想做这样的事情:

$template = $twig->loadTemplate('someTemplate');
$variables = $template->getVariables();
Run Code Online (Sandbox Code Playgroud)

$ variables现在应该包含"name"和"email".

我想这样做的原因是我正在使用CMS系统,我的用户动态设置我的枝条模板和变量,他们也通过API填充变量.

我想将默认值设置为未设置变量,因此我需要一个模板中存在的所有变量的列表...

dun*_*can 65

这对我在当前上下文中获取所有顶级键很有用:

<ol>
    {% for key, value in _context  %}
      <li>{{ key }}</li>
    {% endfor %}
</ol>
Run Code Online (Sandbox Code Playgroud)

感谢https://www.drupal.org/node/1906780

  • 或者直接使用`{{dump(_context | keys)}}` (7认同)
  • 还允许执行诸如`{%set variable ='foo'%} {{变量不为空?attribute(_context,variable):''}}` (2认同)
  • 很有用!感谢您发布! (2认同)

Vit*_*ian 17

2017年更新

可以使用{{ dump() }}过滤器.感谢您在评论中指出这一点!


过时的

这不可能.

您可以在树枝模板中查找这些变量并{{ dump(_context|keys) }}为其添加过滤器.它将检查变量是否已定义且不为空,如果不是 - 将用您的值替换它.

  • 如duncan的回答所述,它是*可能的. (3认同)

fel*_*ins 16

答案在2015年添加

在过去,这是不可能的.但是从1.5版本的dump()函数添加了.因此,您可以从当前上下文调用dump()获取所有变量,而不使用任何参数:

<pre>
    {{ dump(user) }}
</pre>
Run Code Online (Sandbox Code Playgroud)

但是,您必须在创建Twig环境时显式添加Twig_Extension_Debug扩展,因为dump()默认情况下不可用:

$twig = new Twig_Environment($loader, array(
    'debug' => true,
    // ...
));
$twig->addExtension(new Twig_Extension_Debug());
Run Code Online (Sandbox Code Playgroud)

如果你一直在使用Symfony,Silex等,dump()默认情况下可用.

编辑:

还可以dump()使用全局变量引用传递给模板的所有变量(在上下文之外)_context.这就是你要找的东西.它是一个将所有变量名称与其值相关联的数组.

您可以在Twig文档中找到一些其他信息.

但是对于这个特定的问题,最好在同一个伞形变量下收集你所说的所有这些自定义变量,这样检索它们就不会让人头痛.我将是一个叫做custom_variables或其他的数组.


19G*_*d85 8

如果您需要文本中的所有Twig元素,只需使用:

preg_match_all('/\{\%\s*(.*)\s*\%\}|\{\{(?!%)\s*((?:[^\s])*)\s*(?<!%)\}\}/i', $text, $matches);
Run Code Online (Sandbox Code Playgroud)

我有一个问题,WSIWYG编辑器在Twig变量中放置了HTML标签.我过滤它们:

public function cleanHTML($text)
{
    preg_match_all('/\{\%\s*(.*)\s*\%\}|\{\{(?!%)\s*((?:[^\s])*)\s*(?<!%)\}\}/i', $text, $matches);

    if (isset($matches[0]) && count($matches[0])) {
        foreach ($matches[0] as $match) {
            $clean_match = strip_tags($match);

            $text = str_replace($match, $clean_match, $text);
        }
    }

    return $text;
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

使用此表达式查找所有{{}}和{%%}

preg_match_all('/\{\%\s*([^\%\}]*)\s*\%\}|\{\{\s*([^\}\}]*)\s*\}\}/i', $text, $matches);
Run Code Online (Sandbox Code Playgroud)


Luk*_*nga 7

我这样做的方式是

<script>console.log({{ _context | json_encode | raw }});</script>
Run Code Online (Sandbox Code Playgroud)

然后我只使用DevTools检查我的控制台


mic*_*doo 6

我认为 19Gerhard85 的答案非常好,尽管它可能需要一些调整,因为它为我匹配了一些空字符串。我喜欢尽可能使用现有的函数,这是一种主要使用 twig 函数的方法。您需要访问应用程序的 twig 环境。

/**
 * @param $twigTemplateName
 * @return array
 */
public function getRequiredKeys($twigTemplateName)
{
    $twig = $this->twig;
    $source = $twig->getLoader()->getSource($twigTemplateName);
    $tokens = $twig->tokenize($source);
    $parsed = $twig->getParser()->parse($tokens);
    $collected = [];
    $this->collectNodes($parsed, $collected);

    return array_keys($collected);
}
Run Code Online (Sandbox Code Playgroud)

它唯一的自定义部分是递归函数,用于仅收集某些类型的节点:

/**
 * @param \Twig_Node[] $nodes
 * @param array $collected
 */
private function collectNodes($nodes, array &$collected)
{
    foreach ($nodes as $node) {
        $childNodes = $node->getIterator()->getArrayCopy();
        if (!empty($childNodes)) {
            $this->collectNodes($childNodes, $collected); // recursion
        } elseif ($node instanceof \Twig_Node_Expression_Name) {
            $name = $node->getAttribute('name');
            $collected[$name] = $node; // ensure unique values
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Maw*_*cel 5

在使用duncan的答案很长一段时间后,我终于找到了"正确"的方法来转储模板的所有树枝变量:

{% dump %}
Run Code Online (Sandbox Code Playgroud)

而已.模板中可用的所有变量都将被转储到探查器的转储部分,而不是像你的html中间那样{{ dump() }}.

如果你把内容dump()放入变量:

{% set d = dump() %}
Run Code Online (Sandbox Code Playgroud)

你将得到所有的变量,但在"转储就绪"的HTML中,所以解析它会很痛苦.

希望有所帮助.