2014-02-14 4 views
4

Я строю навигацию с помощью VHS Menu ViewHelper. Ниже приведен весь код. Мой вопрос, вероятно, очень основной жидкости.В TYPO3 Fluid, как мне получить доступ к переменной изнутри цикла foreach?

Внутри области действия, как мне получить доступ к переменной, которая существует за пределами этой области, или как передать ее в эту область?

EDIT: Я обновил свой код, чтобы не использовать тире в именах переменных, а также присвоить разные имена v: page.menu с as = "menuLevel0".


Полный код:

{namespace v=Tx_Vhs_ViewHelpers} 
<ul id="nav" class="grid-full classic"> 
    <v:page.menu as="menuLevel0" expandAll="1" useShortcutData="1" levels="4" classHasSubpages="parent" classFirst="first" classLast="last"> 
     <f:for each="{menuLevel0}" as="itemLevel0" iteration="iterLevel0"> 
      <li class="{itemLevel0.class} level0 nav-{iterLevel0.cycle} level-top"> 
       <a href='{itemLevel0.link}' class='level-top'><span> 
        <f:if condition="{itemLevel0.nav_title}"><f:then>{itemLevel0.nav_title}</f:then><f:else>{itemLevel0.title}</f:else></f:if> 
       nav-{iterLevel0.cycle}</span> 
       </a> 
       <f:if condition="{itemLevel0.hasSubPages}"> 
        <f:then> 
         <v:page.menu as="menuLevel1" expandAll="1" classHasSubpages="parent" classFirst="first" classLast="last"> 
          <ul class="level0"> 
           <f:for each="{menuLevel1}" as="itemLevel1" iteration="iterLevel1"> 
            <li class="{itemLevel1.class} level1 nav-{iterLevel0.cycle}-{iterLevel1.cycle}"> 
             <a href='{itemLevel1.link}' class='level-top'><span> 
              <f:if condition="{itemLevel1.nav_title}"><f:then>{itemLevel1.nav_title}</f:then><f:else>{itemLevel1.title}</f:else></f:if> 
              nav-{menuLevel0.iterLevel0.cycle}-{iterLevel1.cycle} 
             </span></a> 
            </li> 
           </f:for> 
          </ul> 
         </v:page.menu> 
        </f:then> 
       </f:if> 
      </li> 
     </f:for> 
    </v:page.menu> 
</ul> 
+0

Я только заметил, что он не работает только для первого элемента основного раздела. – Urs

+0

, и он работает с page.menu.directory, см. Https://github.com/FluidTYPO3/vhs/issues/479 – Urs

+0

У вас, похоже, есть неправильное представление о том, как обращаться к переменным из родительской области. Вам действительно не нужно использовать '' {menuLevel0.iterLevel0.cycle} ''. '' {iterLevel0.cycle} '' достаточно. – Cedric

ответ

0

Вы пробовали не использовать то же имя varibale для итераторов в обоих ваших Foreach петель?

+0

Я пробовал это сейчас, кажется, не имеет значения. На самом деле, во втором разделе переменная, которая прошла, уже имеет другое имя (parent-iter vs. iter) – Urs

1

Не используйте «-» в переменной-названии! Вместо этого используйте CamelCase:

<f:render section="layer2" arguments="{uid: curPage.uid, parentIter: iter.cycle}" /> 
2

В жидкости переменные являются и должны быть привязаны к блокам, которые вы используете.

В то время как вы используете наши v:page.menu ViewHelpers, вы должны понимать область видимости немного дальше:

  1. Используйте разные имена для переменных во вложенных областях: {levelOneIterator} и {levelTwoIterator} являются хорошими примерами такого поведения
  2. As эмпирическое правило: используйте имена переменных lowerCamelCased. Это предотвращает флюиды от неправильного разбора ваших вар-имен.

Причина, почему ваш код не работает:

Вы присваиваете {iter} переменную. Поэтому жидкость не анализирует имя переменной tash-ified, поскольку оно сначала обнаруживает необработанный идентификатор. Черты имеют особое значение в жидкости, и вы можете столкнуться с некой гоночной обстановкой.

Для того, чтобы это немного дальше:

`` ` {Foo-бар} // отголоски "Баз" {Foo-бар} // отголоски "Бинг", как бар vaiable является читать в первую очередь, и "foo-" разве переменную в текущей области

`` `

Обновление:

Доступ к переменным из родительской области не требует префикса вашего var-call. В дочернем for-loop вы можете получить доступ к родительской итерации, просто вызвав var.

<f:for each="{iterable}" as="iterableItem iteration="iteratorRoot"> {iteratorRoot.index} <!-- Echoes the current, zero-indexed iteration --> <f:for each="{iterableItem}" as="subItem" iteration="iterationChild"> <!-- STILL echoes the current, zero-indexed iteration --> {iteratorRoot.index} <!-- Echoes the current, zero-indexed sub iteration --> {iterationChild.index} </f:for> </f:for>

Пока вы даете разные имена итераторам, вы можете получить доступ к ним в любой области их инициирующего именем. То же самое касается псевдонимов (as = "name") с именами переменных.

+0

Еще раз спасибо, Седрик. Я обновил свой вопрос выше. Я добираюсь туда. Но все же я не вижу, как я могу получить доступ к родительской области (или что-то вроде глобальной переменной) или передать требуемую переменную из родительской области в область дочерних элементов, чтобы использовать ее. Это должно быть возможно, не так ли? – Urs

+0

Я также попробовал '' и в области child '{menuLevel0iter}' - но, разумеется, область не является глобальной – Urs

1

В контроллере

public function listAction() { 
    $events = $this->eventsRepository->getEventsList(); 
    $this->view->assign('eventsList', $events); 
} 

В View File вы можете получить доступ, как это.

<f:for each="{eventsList}" as="events"> 
    <tr> 
     <td> {events.event_id} </td>   
     <td> <f:link.external uri="{events.event_link}" target="_blank">{events.event_link}</f:link.external></td> 
     <td><f:format.date format="d-m-Y">{events.event_date}</f:format.date></td> 
    </tr> 
</f:for>