Почему мой DataProcessing \ MenuProcessor не показывает уровень 3 и уровень 4 для моего дерева страниц - PullRequest
0 голосов
/ 14 января 2019

Я использую Bootstrap_package v10 и Typo3 9, процессор меню не показывает уровни 3 и 4 для моего дерева страниц.

Я использую оригинальные шаблоны из пакета начальной загрузки, код ниже:

10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
10 {
    levels = 5
    special = directory
    special.value = 26969
    expandAll = 1
    includeSpacer = 1
    as = mainnavigation
    dataProcessing {
        10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
        10 {
            references.fieldName = nav_icon
            as = icon
            if {
                isTrue.stdWrap.cObject = COA
                isTrue.stdWrap.cObject {
                    10 = TEXT
                    10.value = 1
                    10.if.isTrue = {$page.theme.navigation.icon.enable}
                    20 = TEXT
                    20.value = 1
                    20.if.isTrue = {$page.theme.navigation.dropdown.icon.enable}
                }
            }
        }
    }
}

и это код жидкости:

<f:section name="MainNavigation">
    <f:if condition="{menu}">
        <ul class="navbar-nav">
            <f:for each="{menu}" as="item">
                <f:if condition="{item.spacer}">
                    <f:then>
                        </ul>
                        <ul class="navbar-nav">
                    </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:if condition="{child.spacer}">
                                            <f:then>
                                                <li class="dropdown-divider"></li>
                                            </f:then>
                                            <f:else>
                                                <li>
                                                    <a href="{child.link}" class="dropdown-item{f:if(condition: child.active, then:' active')}"{f:if(condition: child.target, then: ' target="{child.target}"')} title="{child.title}">
                                                        <f:if condition="{theme.navigation.dropdown.icon.enable} && {child.icon}">
                                                            <span class="dropdown-icon">
                                                                <f:if condition="{child.icon.0.extension} === svg">
                                                                    <f:then>
                                                                        <bk2k:inlineSvg image="{child.icon.0}" width="{theme.navigation.dropdown.icon.width}" height="{theme.navigation.dropdown.icon.height}" />
                                                                    </f:then>
                                                                    <f:else>
                                                                        <f:image image="{child.icon.0}" alt="{child.icon.0.alternative}" title="{child.icon.0.title}" width="{theme.navigation.dropdown.icon.width}" height="{theme.navigation.dropdown.icon.height}" />
                                                                    </f:else>
                                                                </f:if>
                                                            </span>
                                                        </f:if>
                                                        <span class="dropdown-text">{child.title}<f:if condition="{child.current}"> <span class="sr-only">(current)</span></f:if></span>
                                                    </a>
                                                </li>
                                            </f:else>
                                        </f:if>
                                    </f:for>
                                </ul>
                            </f:if>
                        </li>
                    </f:else>
                </f:if>
            </f:for>
        </ul>
    </f:if>
</f:section>

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

Заранее спасибо за любую помощь.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

Сначала вы должны проверить, доступны ли данные для более чем двух первых уровней:
вставьте <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 ...

0 голосов
/ 14 января 2019

Ваш шаблон Fluid показывает только 2 уровня. По умолчанию в пакете Bootstrap у вас есть двухуровневое меню. Если вы хотите иметь больше, вам нужно настроить шаблон, чтобы отображать больше уровней. Вот рендеринг уровня 2 в вашем шаблоне:

<f:for each="{item.children}" as="child">
    <f:render section="subLevel" arguments="{item:child}" />
</f:for>

Если вы хотите визуализировать уровень 3, вам нужно перейти в раздел subLevel и проверить, есть ли дочерние элементы для каждого item, установленного вами в arguments. Пример:

<f:if condition="{item.children}">
    <ul>
        <f:for each="{item.children}" as="level3Item">
             ...
        </f:for>
    </ul>
</f:if>

Вы должны иметь немного CSS для 5 уровней. :)

Я надеюсь, что смогу вам помочь.

0 голосов
/ 14 января 2019

По умолчанию MenuProcessor не раскрывает все уровни. Он покажет только ветку, на которой вы находитесь, до уровня ниже уровня, на котором вы находитесь. Если вы хотите показать все уровни для всех веток, вам нужно добавить expandAll = 1 в вашу конфигурацию:

10 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
10 {
  levels = 5
  expandAll = 1
  ...
}
...