如何在Silverstripe中的页面模板中显示many_many对象

Bar*_*vet 5 php silverstripe

我们的网站有一个名为"TrailNotice"的对象,它与页面类型"TrailSection"有很多关系.

class TrailNotice extends DataObject {

  private static $many_many = array(
    'TrailSections' => 'TrailSection'
  );
Run Code Online (Sandbox Code Playgroud)

这允许通过CMS中的复选框在多个TrailSections中应用单个TrailNotice:

$fields->addFieldToTab('Root.Main', new CheckboxSetField('TrailSections', 'Applies to which trail sections?', DataObject::get('TrailSection')->map('ID', 'Title')));
Run Code Online (Sandbox Code Playgroud)

如何在TrailSection页面控制器中显示附加到TrailSection的TrailNotices?

我从以下代码开始:

class TrailSection_Controller extends Page_Controller {

  public function TrailNotices(){
    $TrailNotices = DataObject::get('TrailNotice');
    return $TrailNotices;
  }
Run Code Online (Sandbox Code Playgroud)

但这将获得所有TrailNotice对象.如何过滤它们以便只显示附加到TrailSection的TrailNotices?

wmk*_*wmk 7

您需要在两种方式上定义many_many,然后您可以从两侧访问它.一方有一个$many_many

class TrailNotice extends DataObject {

  private static $many_many = array(
    'TrailSections' => 'TrailSection'
  );
Run Code Online (Sandbox Code Playgroud)

另一方面你必须定义 $belongs_many_many

class TrailSection extends DataObject {

  private static $belongs_many_many = array(
    'TrailNotices' => 'TrailNotice'
  );
Run Code Online (Sandbox Code Playgroud)

然后在您的模板中,您可以调用关系列表并循环遍历它:

<% loop $TrailNotices %>
    $Title
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

看到 资料图 所有可能的关系(感谢@nightjar提供图形).