2017-01-12 4 views
1

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

Теперь я хочу указать параметр в меню навигации, чтобы я знал, что с места, где он сгенерирован, эти небольшие отличия.

Я попытался следующий код, но переменная не знаю, в шаблоне меню навигации:

{% set menuType = 'user' %} 
{% include 'MyBundle:nav.html.twig' with menuType %} 

Также попробовал:

{% include 'MyBundle:nav.html.twig' with {'menuType': 'user'} %} 

В обоих случаях прутик генерируется ошибка, {{menuType} } не существует?

ответ

1

Удивительно, но я подумал, что можно было бы сделать так, как вы, чтобы передать простую переменную, кажется, что только массивы принимаются в качестве переданных значений. (В то время как два примера include doc массивы, это конкретно не уточнено.)

В вашем случае, вы должны написать это так:

{% set menuType = 'user' %} 
{% include 'MyBundle:nav.html.twig' with {menuType:menuType} only %} 

Примечание: Я добавил ключевое слово only, чтобы отключить доступ к контексту. Без этого вам не нужно передавать переменную к включенным шаблонам, так как они будут иметь к ним доступ. (Это хорошая практика, чтобы отключить его.)

Вот Twigfiddle с некоторыми испытаниями и свалки: https://twigfiddle.com/gtnqvv

{% set menuType = 'user' %} 
{% set vars = {'foo': 'bar'} %} 
{% set z = 'bob' %} 

{# vars dumps ommitted here, see the fiddle. #} 

{#% include '1.html.twig' with menuType only %#} 
{% include '1.html.twig' with {menuType:menuType} only %} 
{% include '2.html.twig' with vars only %} 
{% include '3.html.twig' with {z:z} only %} 
{#% include '3.html.twig' with z only %#} 

Первые и последние комментируемые линии не работают, как вы знаете, здесь ошибка:

Uncaught TypeError: Argument 1 passed to Twig_Template::display() must be of the type array, string given

вторые работы, как вы хотите, вы просто должны сделать это массив. (Странно в любом случае)

Третья строка - это тест от документа Twig, а четвертый - тест с другим именем переменной, чтобы быть уверенным.

0

Я использую это в своем коде и работает для меня. Вар foo используется в baz.html.twig непосредственно:

{% set foo = 'foo' %} 
{{ include ('MyBundle:bar:baz.html.twig') }} 

В прута документы он говорит:

Included templates have access to the variables of the active context. [...] The context is passed by default to the template but you can also pass additional variables

+0

Обратите внимание, что хорошая практика отключает доступ к контексту с помощью ключевого слова 'only'. – Veve

+0

@ Виве, почему это должно быть хорошей практикой? – DarkBee

0

Я создал образец twigfiddle для вас здесь:

https://twigfiddle.com/fpzv26

Вам нужно что-то например:

{% set vars = { 'menuType' : 'user'} %} 
{% include 'MyBundle:nav.html.twig' with vars %} 
+0

В twigfiddle мне пришлось сократить длину имени файла шаблона. Я жаловался на лимит в 21 символ, поэтому я использовал «nav.html.twig». –

+0

Он не позволяет передавать переменную, которая не является массивом, например, типом меню Tom's. – Veve

+0

Справа @Veve, я видел ваше сообщение. На самом деле, когда я делал свой трюк, я тоже это заметил. Я думал, что исходный пост OP тоже должен работать, поэтому я пошел к twigfiddle. Я нашел то же самое, что и ты. Он должен быть массивом. Надеюсь, ОП это понимает. –

0

До тех пор, пока переменная доступна или включена в родительский шаблон, она доступна для любого включенного или дочернего шаблона.

Пример: Контроллер:

return $this->render('CmsBundle:EmailBulk:edit.html.twig', array(
      'entity' => $entity, 
      'form' => $editForm->createView(), 
      'tokens' => $tokens 
     )); 

Затем edit.html.twig:

{% block body -%} 
    <div class="panel panel-default animated fadeIn delay-400"> 
     <div class="panel-heading"> 
      blah blah blah 
     </div> 
     <div class="panel-body"> 
      {{ include('CmsBundle:EmailBulk:form.html.twig') }} 
     </div> 
    </div> 
{% endblock %} 

'форма' переменный от контроллера доступен для прилагаемого шаблона form.html.twig

+0

Это работает от контроллера. Но когда я определяю новую переменную {% set menuType = 'user'%} в родительской ветке, она не передается дочерней ветке. – Tom