在TYPO3 CMS中,您可以非常轻松地构建包含已定义页面的菜单。这在Neos和Typoscript2中是如何工作的?
Typoscript1代码是:
Menu1 = HMENU
Menu1 {
special = directory
special.value = 1,6,7
wrap = <div class="somemenu">|</div>
}
例如,我有这个页面结构:
我想要一个仅包含Site1,Site6,Site7的菜单。
我需要页脚中的菜单。
答案 0 :(得分:0)
通过在每个页面中添加一个复选框,我找到了一种创建定义页面菜单的方法,以便我可以选择要在菜单中显示的页面。
首先编辑NodeTypes.yaml
并扩展Page
nodetype以获得此额外属性
ui:
inspector:
groups:
'footernav':
label: 'Footer Menu'
properties:
'footermenu':
type: boolean
defaultValue: FALSE
ui:
label: 'Show in footer?'
inspector:
group: 'footernav'
之后在同一文件中创建FooterMenu
nodetype。
'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>
答案 1 :(得分:0)
谢谢你这个好主意。我甚至不称它为变通方法。对于neos,我们必须以不同的方式思考......而且这个解决方案非常棒且直观!
我有一些令人头疼的时刻因为我不理解neos的工作方式......
我通常想在布局/模板中添加导航修复等基本元素。 我不明白这个footermenu会显示为您可以在登录时动态添加的元素。
如果有人想知道如何将此修复程序添加到模板中,那么用户就无法将其删除:
添加你的Route.ts2
page = Page {
head{ ... }
body{
//...
parts.footermenu = Vendorname.Sitename:FooterMenu
//...
}
}
在您的模板文件中,例如(Vendorname.Sitename /专用/模板/页/ default.html中):
{parts.footermenu -> f:format.raw()}
在菜单出现的位置
旁注:在这个例子中,它必须在...才能工作
答案 2 :(得分:0)
我认为最佳解决方案已经在演示包中。您可以创建一个您不想要的页面FooterMenu,以便在页面菜单上显示为普通页面。将菜单页面作为子快捷方式节点添加到页面/节点树。
然后在root.ts2中添加此typoscript
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的最佳解决方案。由于重定向,页面加载时间会增加。但是,您不必扩展某些代码,并且在准备就绪时可以使用其他解决方案。