SilverStripe(3.6.1) - 使用一个模板显示2个数据对象之一

时间:2018-01-04 14:21:15

标签: php silverstripe

我的网站有2个着陆页,布局完全相同(1个缩略图,摘要段落,标题和指向详细信息页面的链接)。登陆页面是网络研讨会和新闻,供参考。两者都在管理模型中作为单独的数据对象进行管理。

最简单的方法是制作2种着陆页类型,并在每种类型中引用相应的数据对象(即WebinarLandingPage.php和NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我想只有一个登陆页面类型,以区分要渲染的数据对象。

问题是,我不确定如果不依赖于页面网址或页面标题,或者您可以检查您所在的网站树的哪个部分,可以轻松更改的内容,从而破坏代码。这是一个更好的方式去做这样的事情?

1 个答案:

答案 0 :(得分:2)

您可以将两个DataObjects作为关系添加到单个LandingPage类中。

E.g。

LandingPage-> has_many -> Webinar(Object)
LandingPage-> has_many -> News(Object)

但是,这限制了您必须在LandingPage中为要添加的每个其他对象定义关系。

另一种方法是让WebinarNews对象使用相同的抽象/父类,这样就可以定义一些在两个对象之间共享的默认函数。

然后使用LandingPage(CMS)上的DropDown字段设置要使用的Object。 (例如,获取扩展上述基类的所有对象)。

然后,您可以使用LandingPage中的自定义函数来获取已通过CMS在DropDown字段中设置的类中的所有对象。

E.g。

class LandingObject {}
class Webinar extends LandingObject {}
class News extends LandingObject {}

class LandingPage extends Page
{
    private static $db = array(
        LandingObject => 'Varchar(19)'
    ); //Populated by list of DataObject ClassNames that extends LandingObject

    public function getCMSFields()
    {
        $fields = parent::getCMSFields();
        $fields->addFieldsToTab(
            DropdownField::create( 'LandingObject', 'Landing Object', ClassInfo::subclassesFor('LandingObject') );
        );
    }

    public function getLandingObject() {
        return DataObject::get($this->LandingObject);
    }
}