填充不同<div> </div>中的菜单项

时间:2011-07-17 23:45:51

标签: php content-management-system silverstripe

我正在尝试在Silverstripe中填充四个菜单项。我已经设法在一个div中使用li class =“area {$ Pos}”填充了前两个菜单项。但是,第三个和第四个菜单项与前两个菜单项在不同的div和class中。我一直在搜索但不确定如何使用SS来填充不同div中的第三和第四个菜单项(/ second div&gt;和class?抱歉,我是新手,所以任何帮助都会受到赞赏。

这是我的代码。

<div id="top">
<ul class="sf-menu">
     <% control Menu(1) %>
       <li id="area{$Pos}">
        <a href="#a">$MenuTitle</a>
           <% if Children %>
                 <ul><% control Children %>
                        <li>
                           <a href="#aa">$MenuTitle</a>

                         <% if Children %>
                            <ul>
                            <% control Children %>
                                 <li>
                                 <a href="#aa">$MenuImg.SetSize(20,20) $MenuTitle</a>
                                  </li>
                            <% end_control %>
                            </ul>
                        <% end_if %>
                       </li>
                   <% end_control %>

                </ul><% end_if %>

          </li>
         <% end_control %>

</ul>
</div>

<div id="test" >
<ul class="sf-menu sf-vertical">
      <li id="area3">
      <a href="#a">Area 3</a>
      </li>

      <li id="area4">
      <a href="#">Area 4</a>
        <ul class="show_left">
          <li>
           <a href="#">Store one</a>

          </li>
          <li>
           <a href="#">Store Two</a>

          </li>

       </ul>
    </li>
</ul>
</div>

2 个答案:

答案 0 :(得分:2)

您已在代码中使用$ Pos Control(see the docs),您也可以在“if”块中使用它。 这应该是诀窍(未经测试):

请注意此代码段无法正常工作。请参阅下面的更新

<% control Menu(1) %>
<% if Pos == 1 || Pos == 2 %>
<div>render items 1 and 2 here</div>
<% end_if %>
<% end_control %>

<% control Menu(1) %>
<% if Pos == 3 || Pos == 4 %>
<div>render items 3 and 4 here</div>
<% end_if %>
<% end_control %>

请注意,不支持<% if Pos < 3 %>语法。 为了更清洁地做同样的事情,请参考ssbits上的this snippet

<强>更新

不幸的是,silverstripe似乎也不支持更复杂的条件。 这个支持(as in the docs):

<% if MyBoolean || MyOtherBoolean %>

而这个不是:

<% if MyInteger == 1 || MyInteger == 2 %>

所以,最好的解决方案似乎是我指向你的第二个解决方案(上面的ssbits上的片段)。 在您的情况下,这可以如下所示:

将函数添加到您用于检查当前位置的“Page”类中:

public function InFirstDiv() {
  return ($this->iteratorPos == 1 || $this->iteratorPos == 2);
}
public function InSecondDiv() {
  return ($this->iteratorPos == 3 || $this->iteratorPos == 4);
}

然后,在模板中调用它们:

<% control Menu(1) %>
<% if InFirstDiv %>
<div>render items 1 and 2 here</div>
<% end_if %>
<% end_control %>

<% control Menu(1) %>
<% if InSecondDiv %>
<div>render items 3 and 4 here</div>
<% end_if %>
<% end_control %>

看起来不太聪明 - 但这次应该工作:)

答案 1 :(得分:1)

恕我直言,你不想在这个位置上构建这个,因为如果你想把它改为第一个中的1-3个页面和第二个div中的4-5页,你需要更改底层模板。 / p>

相反,我会创建2个页面(可能是重定向页面 - 您可以在CMS中选择它们),在该页面下添加要在模板中显示的页面。所以你在CMS中会有这样的东西:

  • 重定向页面/ foo
    • 第1页
    • 第2页
  • 重定向页面/栏
    • 第3页
    • 第4页

然后,您可以在模板中使用<% control ChildrenOf(foo) %>(或bar)访问两个不同地区的网页。

注意:如果您遇到模板错误,请务必将您的页面置于开发模式,并将?showtemplate=1附加到您的网址。这将显示已编译的模板文件,您可以在其中找到实际错误。

PS:显然,如果你更改了URL,你需要更改你的模板,但这是我试图在现场项目中避免的东西(破坏的外部链接......),而新菜单条目很常见。