typoscript2neoscms

How to build a menu with defined pages


In TYPO3 CMS you could build a menu with defined pages very easy. How does this work in Neos and Typoscript2?

Typoscript1 Code was:

Menu1 = HMENU
Menu1 {
    special = directory
    special.value = 1,6,7
    wrap = <div class="somemenu">|</div>
}

For example i have this page structure:

And i want a menu which only contains Site1, Site6, Site7.

I need that menu in the footer.


Solution

  • I have found a way to create a menu with defined pages, by adding a checkbox in every page so I can select which pages I want to show in the menu.

    Start by editing NodeTypes.yaml and extend the Page nodetype to have this extra property

    ui:
      inspector:
        groups:
          'footernav':
            label: 'Footer Menu'
    properties:
      'footermenu':
        type: boolean
        defaultValue: FALSE
        ui:
          label: 'Show in footer?'
          inspector:
            group: 'footernav'
    

    After that create a FooterMenu nodetype in the same file.

    'Vendor.Site:FooterMenu':
      superTypes: ['TYPO3.Neos.NodeTypes:Menu']
      ui:
        label: 'Footer Menu'
        group: 'structure'
    

    Create it's typoscript file.

    prototype(Vendor.Site:FooterMenu) < prototype(TYPO3.Neos.NodeTypes:Menu) {
        entryLevel = 1
        templatePath = 'resource://Neos.Bootsite/Private/Templates/TypoScriptObjects/FooterMenu.html'
    }
    

    Edit Root.ts2 file and add in the Page object

    footermenu = ${q(node).property('footermenu')}
    

    Last but not least, create FooterMenu.html

    {namespace neos=TYPO3\Neos\ViewHelpers}
    <ul>
        <f:render section="itemsList" arguments="{items: items}" />
    </ul>
    
    <f:section name="itemsList">
        <f:for each="{items}" as="item">
            <f:if condition="{item.node.properties.footermenu}">
                <neos:link.node node="{item.node}">{item.label}</neos:link.node>
            </f:if>
            <f:if condition="{item.subItems}">
                <f:render section="itemsList" arguments="{items: item.subItems}" />
            </f:if>
        </f:for>
    </f:section>