我的一个网站有一个职员部分,以持有人/页面模式设置。
部门是数据对象。 员工档案是页面。
两者都是很多关系 - 员工档案可以有很多部门,而部门有很多员工档案。
在员工档案页面上,我想列出与员工档案相关联的所有部门的同事。
我可以列出所有同事的名字没有问题,但是如果一位同事分享了多个部门,那么他们也会出现每个部门的人名。例如。如果他们与当前的员工档案共享两个部门,他们会在同事列表中出现两次
我希望任何同事只能在同事列表中出现一次。
我已经尝试过GroupedList - 这可以实现它的目的,但是会复制列表中出现的每个同事实例的组,所以我得到的结果与没有该组的结果相同。
是否有人对如何在针对部门进行循环时仅显示唯一的StaffProfiles有任何想法?
答案 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/