如何使用已定义的页面构建菜单

时间:2013-12-12 10:06:57

标签: typoscript2 neoscms

在TYPO3 CMS中,您可以非常轻松地构建包含已定义页面的菜单。这在Neos和Typoscript2中是如何工作的?

Typoscript1代码是:

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

例如,我有这个页面结构:

  • 站点1
  • 站点2
  • Site3
    • Site4
    • Site5
    • Site6
  • Site7

我想要一个仅包含Site1,Site6,Site7的菜单。

我需要页脚中的菜单。

3 个答案:

答案 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的最佳解决方案。由于重定向,页面加载时间会增加。但是,您不必扩展某些代码,并且在准备就绪时可以使用其他解决方案。