0

Silverstripe に 4 つのメニュー項目を設定しようとしています。1 つの div で li class="area{$Pos}" を使用して、最初の 2 つのメニュー項目に SS を設定することができました。ただし、3 番目と 4 番目のメニュー項目は、最初の 2 つとは異なる div とクラスにあります。私は検索してきましたが、SS を使用して 3 番目と 4 番目のメニュー項目を別の 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 %>

したがって、最善の解決策は、私が指摘した 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 ページ、2 番目の div で 4 ~ 5 ページに変更する場合は、基になるテンプレートを変更する必要があるため、この位置でこれを構造化する必要はありません。

代わりに、テンプレートに表示するページを追加する 2 つのページ (おそらくリダイレ​​クト ページ - CMS で選択できます) を作成します。したがって、CMS には次のようなものがあります。

  • ページをリダイレクト /foo
    • ページ1
    • ページ2
  • ページをリダイレクト /bar
    • 3ページ目
    • ページ4

テンプレートで<% control ChildrenOf(foo) %>(またはbar) を使用して、2 つの異なる地域のページにアクセスできます。

注: テンプレート エラーが発生した場合は、必ずページを開発モードに?showtemplate=1して、URL に追加してください。これにより、実際のエラーを見つけることができるコンパイル済みのテンプレート ファイルが表示されます。

PS: URL を変更する場合は、明らかにテンプレートを変更する必要がありますが、新しいメニュー エントリはかなり一般的ですが、ライブ プロジェクト (外部リンクの破損など) ではこれを避けようとしています。

于 2011-07-18T21:25:20.713 に答える