我的网站有2个着陆页,布局完全相同(1个缩略图,摘要段落,标题和指向详细信息页面的链接)。登陆页面是网络研讨会和新闻,供参考。两者都在管理模型中作为单独的数据对象进行管理。
最简单的方法是制作2种着陆页类型,并在每种类型中引用相应的数据对象(即WebinarLandingPage.php和NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我想只有一个登陆页面类型,以区分要渲染的数据对象。
问题是,我不确定如果不依赖于页面网址或页面标题,或者您可以检查您所在的网站树的哪个部分,可以轻松更改的内容,从而破坏代码。这是一个更好的方式去做这样的事情?
答案 0 :(得分:2)
您可以将两个DataObjects作为关系添加到单个LandingPage
类中。
E.g。
LandingPage-> has_many -> Webinar(Object)
LandingPage-> has_many -> News(Object)
但是,这限制了您必须在LandingPage
中为要添加的每个其他对象定义关系。
另一种方法是让Webinar
和News
对象使用相同的抽象/父类,这样就可以定义一些在两个对象之间共享的默认函数。
然后使用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);
}
}