通过 DataObject 上的派生方法在模板中过滤

Filtering in template via derived method on DataObject

我有两个数据对象 parentchild,其中 parent 有很多 children。 Child 有几个 boolean 描述其状态,只有在特定状态下才应显示在此特定页面上。

在我的模板中有:

<% with $Parent %>
<% if $Child %><h1>Children</h1>
    <% loop $Child %>
        <p>$Child.Title</p>
    <% end_loop %>
<% end_if %>
<% end_with %>

但是这显然会显示所有 Children,我可以在上面放一个过滤器:

<% $Child.Filter('Show', '1') %>

但是我不能为过滤器做多个项目(至少我能弄清楚),所以我想我会在 DataObject 上创建一个函数,这将是要显示的派生布尔值它,但是这不是我可以过滤的东西。

实现我想要做的事情的最佳方法是什么?

假设这些是我们的 ChildParent classes:

Child

class Child extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(1024)',
        'Awesome' => 'Boolean',
        'Fun' => 'Boolean'
    );

    private static $has_one = array(
        'Parent' => 'Parent'
    );
}

Parent

class Parent extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(1024)'
    );

    private static $has_many = array(
        'Children' => 'Child'
    );
}

我们可以将函数添加到 Parent class 到 return 各种过滤的 Children 列表:

class Parent extends DataObject {
    private static $has_many = array(
        'Children' => 'Child'
    );

    public function getAwesomeChildren() {
        return $this->Children()->filter('Awesome', true);
    }

    public function getAwesomeFunChildren() {
        return $this->Children()->filter(array(
            'Awesome' => true,
            'Fun' => true
        ));
    }
}

在我们的模板中我们可以调用:

<% if $AwesomeChildren %>
    <h1>Children</h1>
    <% loop $AwesomeChildren %>
        <p>$Title</p>
    <% end_loop %>
<% end_if %>