获取SilverStripe页面的所有子项,但某些页面类型除外

Dej*_*can 3 silverstripe

我正在处理SilverStripe页面类型,该类型旨在获取父导航项的所有子项,除了可能是页面类型的任何子项PDFTemplate.我习惯于获取所有子元素,但是当根据模板类型排除特定孩子时,我不知道如何继续.

这是获取父导航项的子项的函数:

<% if $Children %>
    <div class=“Centers-Links-Area”>
        <% loop $Children %>
            <div class="Centers-Ex-Block clearfix">
                <a href="$Link">
                    <% if $CentersSubpageImage %>
                        <img class="image" src="$CentersSubpageImage.URL" />
                    <% end_if %>
                    <p>$H1</p>
                </a>
            </div>
        <% end_loop%>
    </div>
<% end_if %>
Run Code Online (Sandbox Code Playgroud)

我想要做的是,如果任何一个孩子是页面类型PDFTemplate,我想完全隐藏"Centers-Links-Area"div.我可以在哪里放置if语句来根据页面类型进行检查?

Jon*_*ono 5

<% loop $Children %>
    <% if $ClassName != "PDFTemplate" %>
        (your link html goes here)
    <% end_if %>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)


Tur*_*erj 5

虽然Jono的答案涵盖了类名的完全匹配(听起来它适用于您的确切场景),但它不处理继承情况,其中另一个类扩展PDFTemplate并且您希望阻止任何版本的PDFTemplate显示(这可能是一个有效的问题一些)

下面是扩展各种类的页面模板的示例

- Page
  - HomePage
  - PDFTemplate
    - SpecialPDFTemplate
  - ContactPage
Run Code Online (Sandbox Code Playgroud)

Jono的回答不会阻止SpecialPDFTemplate显示为$ClassName != 'PDFTemplate'将通过.

为了防止这种情况,我们可以使用一个功能Object::is_a().这是扩展的所有类的实例函数Object,可以像$is_a('PDFTemplate')在模板中一样使用.

你的代码片段看起来像这样:

<% if $Children %>
    <div class=“Centers-Links-Area”>
        <% loop $Children %>
            <% if not $is_a('PDFTemplate') %>
            <div class="Centers-Ex-Block clearfix">
                <a href="$Link">
                    <% if $CentersSubpageImage %>
                        <img class="image" src="$CentersSubpageImage.URL" />
                    <% end_if %>
                    <p>$H1</p>
                </a>
            </div>
            <% end_if %>
        <% end_loop%>
    </div>
<% end_if %>
Run Code Online (Sandbox Code Playgroud)

同样,虽然Jono的答案没有错,但这是一个用例,它们可能会影响某些人.

  • 很棒的提示,这可能会更好,具体取决于您的设置.将它添加到我的工具包中. (2认同)