Twig:选择某些块并渲染它们

F21*_*F21 19 php symfony twig

我正在将twig模板引擎集成到PHP应用程序中.特别是,我想使用树枝引擎来渲染表单.

看看symfony2如何使用twig渲染表单小部件,他们有一个巨大的模板文件,其中包含所有小部件,如下所示:

(...)
{% block password_widget %}
{% spaceless %}
    {% set type = type|default('password') %}
    {{ block('field_widget') }}
{% endspaceless %}
{% endblock password_widget %}

{% block hidden_widget %}
    {% set type = type|default('hidden') %}
    {{ block('field_widget') }}
{% endblock hidden_widget %}

{% block email_widget %}
{% spaceless %}
    {% set type = type|default('email') %}
    {{ block('field_widget') }}
{% endspaceless %}
{% endblock email_widget %}

{% block test_widget %}
{% spaceless %}
   <div>
     {{test}}
   <div>
{% endspaceless %}
{% endblock test_widget %}

(...)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何从这个模板中"抓取"块并渲染它们?

到目前为止,我能够加载模板,并调用get块来获取所有块:

twig = new \Twig_Environment($loader, array('cache' => 'cache'));
$template = $twig->loadTemplate('view\form_div_layout.html.twig');
//var_dump($template->getBlocks()); //try getting all blocks
$template->displayBlock('test_widget', array('test' => 'test'));
echo $template->render();
Run Code Online (Sandbox Code Playgroud)

不幸的是,在这种情况下,我无法呈现'test_widget'块.我该怎么做才能从模板中检索'test_widget'块然后将其插入到不同的模板中以呈现整个表单?

F21*_*F21 24

事实证明,应该使用$template->renderBlock('blockname', array('test' => 'test'));.这将使twig呈现阻塞,然后返回包含该块标记的字符串.然后可以使用echo显示它或将其插入到其他模板中.

完整示例:

$loader = new \Twig_Loader_Filesystem(array('/my-template-root'));
$twig = new \Twig_Environment($loader, array('debug' => true));
$template = $twig->loadTemplate('view\form_div_layout.html.twig');
$result = $template->renderBlock('blockname', array('test' => 'test'));
echo $result;
Run Code Online (Sandbox Code Playgroud)

  • 第二个参数是出现在模板中的变量数组.例如,`{{test}}`. (2认同)

Sky*_*123 5

如果您正在使用Symfony和希望能仍然可以访问全局变量(appapp.user,等),然后这个伟大工程:

private function renderBlock($template, $block, $params = [])
{
    /** @var \Twig\Environment $twig */
    $twig = $this->get('twig');
    /** @var \Twig\TemplateWrapper $template */
    $template = $twig->load($template);

    return $template->renderBlock($block, $twig->mergeGlobals($params));
}
Run Code Online (Sandbox Code Playgroud)

我刚刚添加了它在我的控制器上有一个私有功能。效果很好。感谢@F21 为我指明了正确的方向。

  • 改用`load()`,它不是@internal,不像`loadTemplate()` (4认同)