Сначала вы должны проверить, доступны ли данные для более чем двух первых уровней:
вставьте <f:debug title="mainnavigation">{mainnavigation}</f:debug>
в ваш шаблон.
Затем проверьте ваши шаблоны, готовы ли они отображать более двух уровней.
Я могу представить, что ваши шаблоны показывают первый уровень, для второго уровня вызывается частичное, но это частичное не вызывает себя при необходимости.
За исключением случаев, когда вам нужна некоторая разметка, зависящая от уровня (например, 'class="level1"
), вы можете создавать меню, складывая уровни друг в друге (давая сложенные ul
с). Таким образом, у вас либо рекурсивный вызов со сложенными меню с одинаковой разметкой, либо вы определяете частичное для каждого уровня с индивидуальной разметкой (или вы определяете переменную, которая содержит текущий уровень, и вызываете частичный рекурсивный вариант).
еще хуже: оба уровня записаны в одном файле шаблона, частичное (или раздел) не используется.
Я бы изменил это на:
(Я остался с одним файлом и вместо дополнительных частичек я называю раздел, который может быть в том же файле)
<f:section name="MainNavigation">
<f:if condition="{menu}">
<ul class="navbar-nav">
<f:for each="{menu}" as="item">
<f:render section="subLevel" arguments="{item:item}" />
</f:for>
</ul>
</f:if>
</f:section>
<f:section name="subLevel">
<f:if condition="{item.spacer}">
<f:then>
<li class="dropdown-divider"></li>
</f:then>
<f:else>
<li class="nav-item{f:if(condition: item.active, then:' active')}{f:if(condition: item.children, then:' dropdown dropdown-hover')}">
<a href="{item.link}" id="nav-item-{item.data.uid}" class="nav-link{f:if(condition: item.children, then:' dropdown-toggle')}"{f:if(condition: item.target, then: ' target="{item.target}"')} title="{item.title}"{f:if(condition: item.children, then:' aria-haspopup="true" aria-expanded="false"')}>
<f:if condition="{theme.navigation.icon.enable} && {item.icon}">
<span class="nav-link-icon">
<f:if condition="{item.icon.0.extension} === svg">
<f:then>
<bk2k:inlineSvg image="{item.icon.0}" width="{theme.navigation.icon.width}" height="{theme.navigation.icon.height}" />
</f:then>
<f:else>
<f:image image="{item.icon.0}" alt="{item.icon.0.alternative}" title="{item.icon.0.title}" width="{theme.navigation.icon.width}" height="{theme.navigation.icon.height}" />
</f:else>
</f:if>
</span>
</f:if>
<span class="nav-link-text">{item.title}<f:if condition="{item.current}"> <span class="sr-only">(current)</span></f:if></span>
</a>
<f:if condition="{item.children}">
<ul class="dropdown-menu" aria-labelledby="nav-item-{item.data.uid}">
<f:for each="{item.children}" as="child">
<f:render section="subLevel" arguments="{item:child}" />
</for>
</ul>
</f:if>
</li>
</f:else>
</f:if>
</f:section>
Обратите внимание измененная разметка для проставки на первом уровне!
Дальнейшие изменения могут произойти, поскольку я не сравнивал код, а сосредоточился на создании чистой разметки.
Увеличение «параметра» для рекурсии.
для увеличения значения (level1
, level2
, level3
...) вам нужен помощник вида в TYPO3 предыдущей версии 9:
этот viewhelper может быть реализован в typoscript:
lib.math = TEXT
lib.math {
current = 1
prioriCalc = 1
}
, затем вы можете изменить начальный вызов в разделе SubLevel
на:
<f:render section="subLevel" arguments="{item:item,level:1}" />
Теперь у вас есть переменная жидкости level
со значением 1
.
рекурсивный вызов должен быть изменен на:
<f:render section="subLevel" arguments="{item:child,level:{f:cObject(typoscriptObjectPath:'lib.math', data:'{level}+1')}}" />
для увеличения значений 2
, 3
, 4
...