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

时间:2015-04-15 01:16:41

标签: php silverstripe

我们的网站有一个名为" TrailNotice"与页面类型有很多关系" TrailSection"。

class TrailNotice extends DataObject {

  private static $many_many = array(
    'TrailSections' => 'TrailSection'
  );

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

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

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

我从以下代码开始:

class TrailSection_Controller extends Page_Controller {

  public function TrailNotices(){
    $TrailNotices = DataObject::get('TrailNotice');
    return $TrailNotices;
  }

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

3 个答案:

答案 0 :(得分:7)

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

class TrailNotice extends DataObject {

  private static $many_many = array(
    'TrailSections' => 'TrailSection'
  );

另一方面,您必须定义$belongs_many_many

class TrailSection extends DataObject {

  private static $belongs_many_many = array(
    'TrailNotices' => 'TrailNotice'
  );

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

<% loop $TrailNotices %>
    $Title
<% end_loop %>

请参阅infographic了解所有可能的关系(感谢@nightjar提供图片)。

答案 1 :(得分:3)

你必须在你的TrailSection模型中实现$ belongs_many_many,就像这样:

class TrailSection extends DataObject {

  private static $belongs_many_many = array(
    'TrailNotices' => 'TrailNotice'
  );

}

然后你可以简单地将$ TrailNotices循环到TrailSection.ss模板中,而不对你的控制器做任何事情:

<% loop $TrailNotices %>
    $Title<br>
<% end_loop %>

您可以在Stephen的链接Dataobject Relationship Management

中查看Mentor示例

答案 2 :(得分:0)

SilverStripe存储了许多关系RelationList,可以使用$this->RelationName()(在这种情况下为$this->data()->TrailNotices())访问该对象。 RelationList是DataList的子类,所以你可以像对DataObject::get()那样对它进行过滤来过滤列表。

class TrailSection_Controller extends Page_Controller {

  public function TrailNotices(){
    $TrailNotices = $this->data()->TrailNotices();
    return $TrailNotices;
  }

有关SilverStripe的ORM和DataObject关系的更多信息,请参阅帮助部分Dataobject Relationship Management和(较新的内容)SilverStripe Lessons