获取 SilverStripe 页面的所有子页面,特定页面类型除外

Get all children of a SilverStripe page except those of a certain page type

我正在开发 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 %>

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

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

虽然 Jono 的回答涵盖了 class 名称的精确匹配(听起来它适用于您的确切场景),但它不处理另一个 class 扩展 PDFTemplate 的继承情况并且您想阻止 PDFTemplate 任何版本 显示(这对某些人来说可能是一个有效的问题)

下面是扩展各种classes

的页面模板示例
- Page
  - HomePage
  - PDFTemplate
    - SpecialPDFTemplate
  - ContactPage

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

为了防止这种情况,我们可以利用函数 Object::is_a()。这是扩展 Object 的所有 classes 上的实例函数,可以像模板中的 $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 %>

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