Как построить меню с определенными страницами

В TYPO3 CMS вы можете легко создать меню с определенными страницами. Как это работает в Neos и Typoscript2?

Код Typoscript1 был:

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

Например, у меня есть эта структура страницы:

  • site1
  • site2
  • site3
    • Site4
    • Site5
    • Site6
  • Site7

И я хочу меню, которое содержит только Site1, Site6, Site7.

Мне нужно это меню в нижнем колонтитуле.

3 ответа

Решение

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

Начните с редактирования NodeTypes.yaml и расширить Page Тип узла, чтобы иметь это дополнительное свойство

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

После этого создайте FooterMenu Тип узла в том же файле.

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

Создайте файл опечатки.

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

редактировать Root.ts2 файл и добавить в Page объект

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

Не в последнюю очередь, создать 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>

Я думаю, что лучшее решение уже в демонстрационном пакете. Вы можете создать страницу FooterMenu, которую вы не хотите показывать как обычную страницу в меню страницы. Добавьте свои страницы меню в качестве дочерних узлов ярлыков в дерево страниц / узлов.

Затем добавьте эту опечатку в свой root.ts2

metaMenu = Menu {
    entryLevel = 2
    templatePath = 'resource://Vendor.PackageName/Private/Templates/TypoScriptObjects/FooterMenu.html'
    maximumLevels = 1
    startingPoint = ${q(site).children('footermenu').get(0)}
}

Создайте шаблон для меню:

{namespace neos=TYPO3\Neos\ViewHelpers}
<f:render section="itemList" arguments="{items: items}" />

<f:section name="itemList">
<nav class="nav" role="navigation">
    <ul class="nav nav-pills">
        <f:for each="{items}" as="item" iteration="menuItemIterator">
            <li class="{item.state}">
                <neos:link.node node="{item.node}">{item.label}</neos:link.node>
            </li>
        </f:for>
    </ul>
</nav>
</f:section>

Последнее, что вам нужно сделать, это поместить footerMenu в шаблон страницы:

<div class="footer">
    {parts.footerMenu -> f:format.raw()}
</div>

Единственный недостаток этого решения - вы должны использовать ярлыки, и я думаю, что это не лучшее решение для SEO. И время загрузки страницы будет увеличено из-за перенаправления. Но вам не нужно расширять какой-то код и вы можете использовать другое решение, когда оно будет готово.

Спасибо за эту прекрасную идею. Я бы даже не назвал это обходным путем. С neos мы должны думать по-разному... и это решение действительно великолепно и интуитивно понятно!

У меня были некоторые головокружительные моменты, потому что я не понимал, как работает Neos...

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

Если кто-то хочет узнать, как он может добавить это исправление в шаблон, пользователи не смогут его удалить:

Добавьте в свой Route.ts2

page = Page {
    head{ ... }
    body{
     //...

         parts.footermenu = Vendorname.Sitename:FooterMenu

    //...
    }
}

Например, в файле шаблона (Vendorname.Sitename/Private/Templates/Page/Default.html):

{parts.footermenu -> f:format.raw()}

в том месте, где должно появиться меню

Примечание: в этом примере это должно быть в пределах, чтобы работать

Другие вопросы по тегам