在 Twig 中,您可以使用函数getSource()获取模板的源。

但是有没有一种方法可以获取特定块的来源,而不使用{%verbatim%}(我希望模板可以工作,但也可以读取块的来源)

最佳答案

如果您是指真正的Twig来源,那么我为您提供了一些帮助

$twig->addFunction(new Twig_SimpleFunction('get_block_source', function(\Twig_Environment $environment, $name, $template_name = null) {
        if ($template_name === null) {
            foreach (debug_backtrace() as $trace) if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
                $template = $trace['object'];
                $template_name = $template->getSourceContext()->getName();
                break;
            }
        }
        if (preg_match('#{% block '.$name.' %}(.+?){% endblock %}#is', $environment->getLoader()->getSourceContext($template_name)->getCode(), $matches)) return $matches[0];
        return 'Block not found';

}, [ 'needs_environment' => true ]));

如果您不传递模板名称,则将找到当前模板名称
{{ get_block_source('bar2', 'test.html') }} {# prints block bar2 from test.html #}

{% block foo %}
    {{ 'Hello world' }}
{% endblock %}

{{ get_block_source('foo') }} {# print block foo from current template #}

请注意,现在不赞成使用getSource函数,这就是为什么我使用getSourceContext的原因

关于Twig getSource用于块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40284749/

10-11 12:26