首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Twig:选择某些块并渲染它们

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

Stack Overflow用户
提问于 2011-09-28 13:00:03
回答 4查看 19.5K关注 0票数 21

我正在将twig模板引擎集成到PHP应用程序中。特别是,我想使用twig引擎来呈现表单。

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

代码语言:javascript
复制
(...)
{% 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 %}

(...)

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

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

代码语言:javascript
复制
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();

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-28 16:36:07

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

完整示例:

代码语言:javascript
复制
$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;
票数 24
EN

Stack Overflow用户

发布于 2016-01-13 23:24:37

如果您正在使用Symfony,并且希望仍然能够访问全局变量(appapp.user等),那么这非常有效:

代码语言:javascript
复制
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));
}

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

票数 5
EN

Stack Overflow用户

发布于 2013-04-15 03:45:43

这太棒了!我还想补充说,有一个hasBlock函数,它允许您在尝试进行模板渲染之前进行验证。这允许您验证模板是否按预期构建,或者在我的示例中具有可选的块。值得一提的是,这里有一个来自我的控制台应用程序的示例,它发送通知电子邮件

代码语言:javascript
复制
        $templateContent = $this->getContainer()->get('twig')->loadTemplate('FTWGuildBundle:AuctionNotification:notificationEmail.html.twig');
        $body = $templateContent->renderBlock('body', array('siteDomain' => $siteClient->getSiteDomain(), 'staticContentDomain' => $siteClient->getStaticContentDomain(), 'batch' => $batch->getNotifications(), 'auction_notification_lockout_period' => $this->getContainer()->getParameter('auction_notification_lockout_period')));
        $subject = ($templateContent->hasBlock("subject")
            ? $templateContent->renderBlock("subject", array('batchSize' => $batch->getSize(), 'batch' => $batch))
            : "Auction House Notifications");
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7578526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档