2

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

Typoscript1 代码是:

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

例如我有这个页面结构:

  • 站点1
  • 站点2
  • 站点3
    • 站点4
    • 站点5
    • 站点6
  • 站点7

我想要一个只包含 Site1、Site6、Site7 的菜单。

我需要页脚中的那个菜单。

4

3 回答 3

0

我找到了一种创建具有已定义页面的菜单的方法,方法是在每个页面中添加一个复选框,以便我可以选择要在菜单中显示的页面。

首先编辑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>
于 2014-01-03T12:43:48.797 回答
0

谢谢你这个好主意。我什至不会称其为解决方法。对于 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()}

在菜单应该出现的位置

旁注:在此示例中,它必须在范围内才能工作

于 2014-02-28T16:44:22.153 回答
0

我认为最好的解决方案已经在演示包中。您可以创建一个不希望在页面菜单上显示为普通页面的页面 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 的最佳解决方案。并且页面加载时间会因为重定向而增加。但是您不必扩展某些代码,并且可以在准备好后使用其他解决方案。

于 2014-03-01T12:33:45.113 回答