Intereting Posts
Эхо-результаты сложного запроса INNER JOIN с несколькими таблицами Солить с хешированной версией пароля пользователя так же безопасно, как солить с заранее определенной строкой? Лог ошибок при попытке входа в систему с помощью Laravel 5.2 PHP – Не удалось открыть поток: нет такого файла или каталога Свойство ckeditor для изменения размера изображения Изменение значения элемента узла XML в PHP и сохранение файла Создать возврат каретки в строке PHP? как сделать php Outlook.Application работать и отправлять почту? Как обновить данные с помощью PHP MYSQL в Android # 1193 – Неизвестная системная переменная 'lc_messages' при попытке войти в phpmyadmin сессия никогда не должна истекать сама по себе PHP-SDK Facebook auth сохраняет перенаправление Передача нескольких значений для одной и той же переменной GET в URL-адресе Вызов неопределенной функции mysql_query () В лаке не хватает кеша, куки?

Twig: выбор определенных блоков и их рендеринг

Я перехожу к шаблону шаблонов в 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 block для получения всех блоков:

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

Оказывается, следует использовать $template->renderBlock('blockname', array('test' => 'test')); вместо. Это сделает рендеринг twig, который блокирует, а затем возвращает строку, содержащую разметку для этого блока. Затем можно использовать эхо, чтобы отобразить его или вставить в другие шаблоны.

Полный пример:

 $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; 

Отлично! Я также хотел добавить, что есть функция 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"); 

Если вы используете 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 за то, что указали мне в правильном направлении.

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

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