Как построить меню с определенными страницами
В 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()}
в том месте, где должно появиться меню
Примечание: в этом примере это должно быть в пределах, чтобы работать