Silverstripe 中的自定义导航菜单

Custom Navigation Menu in Silverstripe

我今天正在学习 Silverstripe CMS,运行 遇到了一个我找不到答案的问题。

我有一个 CSS 驱动的下拉菜单,其中包含三个主要标题。标题本身不是链接,但 children 是。

我遇到的问题是我阅读菜单的方式是从页面层次结构生成的。我的主菜单标题不是页面,那么如何从它开始,然后在每个标题下放置正确的页面链接?

我正在使用此代码动态生成菜单

<nav class="seven columns u-right-align main-nav">
      <ul style="position: relative; z-index: 10000">
                <% loop $Menu(1) %>
                    <li>$MenuTitle
                     <% if $LinkOrSection == section %>
                        <% if $Children %>
                              <ul>
                                 <% loop $Children %>
                                     <li><a href="$Link">$MenuTitle</a></li>
                                 <% end_loop %>
                             </ul>
                        <% end_if %>
                   <% end_if %>
               </li>
            <% end_loop %>
        </ul>
  </nav>

预期布局...

<nav class="seven columns u-right-align main-nav">
    <ul style="position: relative; z-index: 10000">
        <li>About <!--  I do not know where to create this title in SS -->
            <ul>
                <li><a href="">Annual Meeting</a></li>
                <li><a href="">History</a></li>
                <li><a href="">Society Calendar</a></li>
            </ul>
        </li>
    </ul>
</nav>

嗯,因为您不知道 "About" 部分标题放在哪里 - 默认情况下,这不是内置在 SilverStripe 中。您必须为其添加 "RedirectorPage" 并重定向到第一个 Child。

幸好其他人也遇到了这个问题还有some page types that do the trick for you.

您可以重复使用已有的模板。

上面链接的页面类型在 Controller 的 init() 方法中具有重定向到第一个 child 的功能,这很容易:

function  init() {
    parent::init();

    if($this->Children()->Count()){
        Controller::redirect($this->Children()->First()->AbsoluteLink());
    }
}

所以这取决于您是使用默认值手动重定向 RedirectorPage 还是想要更高级的内容。