0

我正在尝试在 Silverstripe 中填充四个菜单项。我已经设法在一个 div 中使用 li class="area{$Pos}" 用 SS 填充前两个菜单项。但是,第三个和第四个菜单项的 div 和 class 与前两个不同。我一直在搜索,但不确定如何使用 SS 在不同的 div(/second div> 和类中填充第三和第四个菜单项?对不起,我是新手,所以任何帮助将不胜感激。

这是我的代码。

<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>
4

2 回答 2

2

您已经在代码中使用了 $Pos 控件(请参阅文档),您也可以在“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 上的此代码段。

更新

不幸的是,silverstripe 似乎也不支持上述更复杂的条件。支持这个(如在文档中):

<% if MyBoolean || MyOtherBoolean %>

而这个不是:

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

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

向您用于检查当前位置的“页面”类添加函数:

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 %>

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

于 2011-07-19T12:46:07.277 回答
1

恕我直言,您不想在该位置上构建它,因为如果您想将其更改为第一个 div 中的 1-3 页和第二个 div 中的 4-5 页,则需要更改基础模板。

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

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

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

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

PS:显然,如果您更改 URL,您将需要更改您的模板,但这是我在实时项目中尽量避免的事情(断开的外部链接,...),而新的菜单条目很常见。

于 2011-07-18T21:25:20.713 回答