2
votes

Pourquoi mon DataProcessing \ MenuProcessor n'affiche pas le niveau 3 et le niveau 4 pour mon arborescence de pages

J'utilise Bootstrap_package v10 et Typo3 9, le processeur de menu n'affiche pas le niveau 3 et 4 pour mon arbre de page.

J'utilise les modèles originaux du package bootstrap, le code est ci-dessous: p >

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

et voici le code fluide:

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}
                }
            }
        }
    }
}

Le fluide appelle un enfant de page mais je ne sais pas s'il est récursif ou pas pour qu'il puisse afficher tous les niveaux, que me manque-t-il là, il semble que je suis le premier à avoir ce problème?

Merci d'avance pour toute aide.


0 commentaires

4 Réponses :


1
votes

Par défaut, MenuProcessor ne développe pas tous les niveaux. Il affichera uniquement la branche sur laquelle vous vous trouvez jusqu'au niveau inférieur au niveau auquel vous vous trouvez. Si vous souhaitez afficher tous les niveaux de toutes les branches, vous devez ajouter expandAll = 1 à votre configuration:

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


2 commentaires

merci pour la réponse, maintenant, j'ai ajouté expandAll = 1, mais cela n'a pas résolu le problème.


Dans ce cas, vous devriez essayer la suggestion de @ BerndWilkeπφ pour déboguer la variable et vérifier votre modèle.



2
votes

Vous devez d'abord vérifier si les données sont disponibles pour plus que les deux premiers niveaux:
insérez un {mainnavigation} f: debug> dans votre modèle.

Inspectez ensuite vos modèles pour savoir s'ils sont prêts à afficher plus de deux niveaux.
J'imagine que vos modèles montrent le premier niveau, pour le deuxième niveau un partiel est appelé, mais ce partiel ne s'appelle pas lui-même si nécessaire.
Sauf si vous avez besoin d'un balisage spécifique au niveau (par exemple, 'class = "level1" ), vous pouvez créer des menus en empilant les niveaux les uns dans les autres (donnant des ul s empilés). Donc, soit vous avez un appel récursif avec des menus empilés du même balisage, soit vous définissez un partiel pour chaque niveau avec un balisage individuel (ou vous définissez une variable qui contient le niveau actuel et appelez le partiel récursif).


c'est encore pire: les deux niveaux sont écrits dans le même fichier modèle, aucun partiel (ou section) n'est utilisé.

Je le changerais en:
(Je suis resté avec un seul fichier et au lieu d'un partiel supplémentaire, j'appelle une section, qui peut être dans le même fichier)

<f:render section="subLevel" arguments="{item:child,level:{f:cObject(typoscriptObjectPath:'lib.math', data:'{level}+1')}}" />

Remarque le changement balisage pour l'espaceur au premier niveau!
D'autres changements pourraient survenir car je n'ai pas comparé le code mais concentré sur la création d'un balisage propre.


Augmentation d'un "paramètre" pour la récursivité.

pour une valeur croissante ( level1 , level2 , level3 ...) vous avez besoin d'un viewhelper dans TYPO3 version antérieure 9:
ce viewhelper peut être réalisé en typoscript:

<f:render section="subLevel" arguments="{item:item,level:1}" />

alors vous pouvez changer l'appel initial de la section SubLevel en:

lib.math = TEXT
lib.math {
  current = 1
  prioriCalc = 1
}

Vous avez maintenant une variable fluide level avec la valeur 1.

l'appel récursif doit être changé en:

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

pour augmenter les valeurs 2 , 3 , 4 ...


6 commentaires

J'ai ajouté le code fluide pour le menu au premier message, je ne sais pas vraiment s'il s'agit d'un appel récursif, comment puis-je le déboguer pour le savoir?


J'ai amélioré ma réponse avec une solution à un fichier.


Merci beaucoup, cela m'a sauvé la vie.


Puis-je améliorer votre code pour ajouter une classe de niveau, par exemple

    ...
      ?


      alors vous avez besoin d'un paramètre supplémentaire qui doit être augmenté à chaque appel récursif. Le calcul est intégré dans le fluide depuis TYPO3 9, avec les versions antérieures, vous avez besoin d'un viewhelper pour calculer le niveau suivant (voir la réponse modifiée)


      Oh c'est génial, j'aime vraiment cette version 9, merci pour la réponse à améliorer.



0
votes

Votre modèle Fluid n'affiche que 2 niveaux. Par défaut, dans le package Bootstrap, vous avez un menu à 2 niveaux. Si vous voulez en avoir plus, vous devez ajuster le modèle pour rendre plus de niveaux. Voici le rendu du niveau 2 dans votre template:

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

Si vous souhaitez rendre le niveau 3, vous devez aller dans la section subLevel et vérifier s'il y a enfants de chaque élément que vous définissez dans arguments . Exemple:

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

Vous devriez avoir du CSS pour 5 niveaux bien sûr. :)

J'espère pouvoir vous aider.


0 commentaires

0
votes

Pour les niveaux au-delà de 2, je trouve qu'il est beaucoup plus facile d'intégrer typoscript dans votre setup.typoscript.

lib.textmenu {

# We define the first level as text menu.
 1 = TMENU

 # The first level of this menu. 0 is rootline. -1 is 1 level up from rootline. 1 is 1 level down from rootline
entryLevel = 0

# UID's to exclude from the menu.  Change this for each subsite, but will require a new template on each subsite.
excludeUidList = 21

 # Turn spacers on, I use them to do sections of my menu.
 1.SPC = 1
 1.SPC.allWrap = <li class="a nav-item dropdown text-light bg-secondary SPC">|</li>

# Expand the whole menu - ie a sitemap
1.expAll = 1

# We define the normal state ("NO").
1.NO = 1
1.NO.wrap = <li class="nav-item NO">|</li>
1.NO.linkWrap = <li class="nav-item NO">|</li>
1.NO.ATagParams = class="nav-item dropdown NO"

# We define the active state ("ACT").
1.ACT = 1
1.ACT.wrapItemAndSub = <li class="nav-item active ACT">|</li>

# Get level 2 to get the format from level 1
2 <.1

# Do some customization for level 2
2.CUR = 1
2.CUR.wrapItemAndSub = <li class="nav-item dropdown active level2CUR">|</li>
2.CUR.ATagParams = class="active text-white"

# Make Levels 3 to 6 the same as level 1. I'll leave it to you to study all the typoscript wrapping.
3 < .1
4 < .1
5 < .1
6 < .1
}


0 commentaires