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

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

Код Typoscript1 был:

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

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

  • Сайт1
  • Сайт2
  • Site3
    • Site4
    • Сайт5
    • Сайт6
  • Сайт7

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

Мне нужно это меню в футере.


person Jürgen Kleiß    schedule 12.12.2013    source источник
comment
Я не уверен, что вы подразумеваете под определенными страницами. Не могли бы вы уточнить, чего вы хотите достичь?   -  person Janus Tøndering    schedule 12.12.2013
comment
Мы хотим создать меню выбранных страниц. Итак, он хочет выбрать несколько узлов и создать из них меню — без магии.   -  person pgampe    schedule 13.12.2013


Ответы (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'

Создайте его файл typoscript.

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>
person barcasal    schedule 03.01.2014
comment
Очень хорошее решение. У меня было только 2 дополнения. Я объединил с ответом Юргена, поэтому у меня есть назначенный узел нижнего колонтитула, поэтому определите мою навигацию нижнего колонтитула. (эта часть: startPoint = ${q(site).children('footermenu').get(0)}) И вдобавок к этому я добавил навигацию нижнего колонтитула в тип узла страницы, таким образом, мне не нужно возиться с элементами контента. :) - person Panade; 18.10.2014
comment
@barcasal Если вы поместите файл шаблона в папку NodeTypes вместо папки TypoScriptObjects, вам не нужно указывать путь в TS, потому что это место по умолчанию, и Neos будет искать его автоматически. - person Reinis; 05.10.2015

спасибо за эту хорошую идею. Я бы даже не назвал это обходным путем. С 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()}

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

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

person kapale    schedule 28.02.2014

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

Затем добавьте этот typeoscript в свой 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. И время загрузки страницы будет увеличено из-за редиректа. Но вам не нужно расширять какой-то код, и вы можете использовать другое решение, когда оно будет готово.

person Jürgen Kleiß    schedule 01.03.2014