Twig: выбор определенных блоков и рендеринг их - PullRequest
19 голосов
/ 28 сентября 2011

Я интегрирую шаблонизатор веточек в приложение PHP. В частности, я хотел бы использовать движок веток для рендеринга форм.

Посмотрев на то, как symfony2 использует ветки для визуализации виджетов форм, у них есть огромный файл шаблона, который содержит все виджеты примерно так:

(...)
{% 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, чтобы получить все блоки:

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' из шаблона, а затем вставить его в другой шаблон для отображения всей формы?

Ответы [ 4 ]

23 голосов
/ 28 сентября 2011

Оказывается, вместо этого следует использовать $template->renderBlock('blockname', array('test' => 'test'));.Это заставит веточку визуализировать этот блок, а затем вернет строку, содержащую разметку для этого блока.Затем можно использовать 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;
3 голосов
/ 13 января 2016

Если вы используете Symfony и хотите иметь возможность иметь доступ к глобальным переменным (app, app.user и т. Д.), То это прекрасно работает:

private function renderBlock($template, $block, $params = array())
{
    /** @var \Twig_Environment $twig */
    $twig = $this->get('twig');
    /** @var \Twig_Template $template */
    $template = $twig->loadTemplate($template);

    return $template->renderBlock($block, $twig->mergeGlobals($params));
}

Я только что добавил, что это имеетприватная функция на моем контроллере.Работает отлично.Спасибо @ F21 за указание в правильном направлении.

3 голосов
/ 14 апреля 2013

Это здорово! Я также хотел добавить, что есть функция hasBlock, которая позволяет выполнять проверку перед попыткой рендеринга шаблона. Это позволяет проверить шаблон, построенный как положено, или в моем случае иметь дополнительные блоки. Для примера, вот пример из одного из моих консольных приложений, который отправляет уведомления по электронной почте

        $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");
0 голосов
/ 19 апреля 2014

Примечание: hasBlock не будет работать, если шаблон расширяет или встраивает родительский блок.

см https://github.com/twigphp/Twig/issues/450

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...