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

时间:2017-05-24 03:14:21

标签: php templates filter silverstripe

我有两个数据对象parentchildparent有许多child人。 Child有几个boolean来描述它的状态,只有在特定状态下才会显示在此特定页面上。

在我的模板中,我有:

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

然而,这显然会显示所有Child ren,我可以对其进行过滤:

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

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

什么是达到我想要做的最佳方式?

1 个答案:

答案 0 :(得分:4)

说这些是我们的ChildParent类:

儿童

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

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

<强>父

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

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

我们可以向Parent类添加函数以返回各种已过滤的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 %>