Silverstripe:循环many_many,没有重复的同事页面

时间:2017-10-07 12:57:17

标签: silverstripe

我的一个网站有一个职员部分,以持有人/页面模式设置。

部门是数据对象。 员工档案是页面。

两者都是很多关系 - 员工档案可以有很多部门,而部门有很多员工档案。

在员工档案页面上,我想列出与员工档案相关联的所有部门的同事。

我可以列出所有同事的名字没有问题,但是如果一位同事分享了多个部门,那么他们也会出现每个部门的人名。例如。如果他们与当前的员工档案共享两个部门,他们会在同事列表中出现两次

我希望任何同事只能在同事列表中出现一次。

我已经尝试过GroupedList - 这可以实现它的目的,但是会复制列表中出现的每个同事实例的组,所以我得到的结果与没有该组的结果相同。

是否有人对如何在针对部门进行循环时仅显示唯一的StaffProfiles有任何想法?

1 个答案:

答案 0 :(得分:2)

这是实现目标的一种方式:

// Department.php
class Department extends DataObject
{
    private static $many_many = [
        'StaffProfilePages'  => 'StaffProfilePage'
    ];
}

// StaffProfilePage.php
class StaffProfilePage extends Page
{
    private static $belongs_many_many = [
        'Departments'  => 'Department'
    ];

    /**
     * Fetch all StaffProfilePages that aren't this one, and share
     * at least one department with this StaffProfilePage.
     *
     * @return DataList
     */
    public function Colleagues()
    {
        return StaffProfilePage::get()->filter(
            [
                'ID:not' => $this->ID,
                'Departments.ID' => $this->Departments()->column('ID')
            ]
        );
    }
}

然后像这样访问模板文件中的同事(确保在StaffProfilePage的上下文中):

<%-- StaffProfilePage.ss --%>
<% loop $Colleagues %>
    Hello I am {$Title} and I work with {$Up.Title}. <br />
<% end_loop %>

一些参考文献: https://docs.silverstripe.org/en/3/developer_guides/model/data_model_and_orm/#filtering-results https://docs.silverstripe.org/en/3/developer_guides/model/searchfilters/