Php SilverStripe(3.6.1)-使用一个模板显示两个数据对象中的一个

Php SilverStripe(3.6.1)-使用一个模板显示两个数据对象中的一个,php,silverstripe,Php,Silverstripe,我有一个站点,它有两个完全相同布局的登录页(一个缩略图、一个摘要段落、一个标题和一个到详细页面的链接)。登陆页面为网络研讨会和新闻,仅供参考。在管理模型中,两者都作为单独的数据对象进行管理 最简单的方法是创建2个登录页类型,并在每个类型中引用相应的数据对象(即WebinarLandingPage.php和NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我只希望有一个登录页类型来区分要呈现的数据对象 问题是,我不确定如果不依赖页面url或页面标题,或者您可以检

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

最简单的方法是创建2个登录页类型,并在每个类型中引用相应的数据对象(即WebinarLandingPage.php和NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我只希望有一个登录页类型来区分要呈现的数据对象


问题是,我不确定如果不依赖页面url或页面标题,或者您可以检查站点树的哪个部分,这些内容很容易更改,从而破坏代码,这怎么可能。这是一个更好的方式来做这样的事情吗

您可以将两个数据对象作为关系添加到单个
LandingPage
类中

例如

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

另一种方法是让
Webinar
News
对象使用相同的抽象/父类,以便您可以定义两个对象之间共享的一些默认函数

然后使用登陆页面(CMS)上的下拉字段设置要使用的对象。(例如,获取扩展上述基类的所有对象)

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

例如


您可以将这两个数据对象作为关系添加到单个
LandingPage
类中

例如

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

另一种方法是让
Webinar
News
对象使用相同的抽象/父类,以便您可以定义两个对象之间共享的一些默认函数

然后使用登陆页面(CMS)上的下拉字段设置要使用的对象。(例如,获取扩展上述基类的所有对象)

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

例如

LandingPage-> has_many -> Webinar(Object)
LandingPage-> has_many -> News(Object)
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);
    }
}