SilverStripe (3.6.1) - 使用一个模板显示 2 个数据之一 objects
SilverStripe (3.6.1) - Use one template to display one of 2 data objects
我的网站有 2 个布局完全相同的登录页面(1 个缩略图、一个摘要段落、一个标题和一个 link 到详细信息页面)。登录页面是网络研讨会和新闻,供参考。两者都在管理模型中作为单独的数据 object 进行管理。
最简单的方法是制作 2 种着陆页类型并在每种类型中引用相应的数据 object(即 WebinarLandingPage.php 和 NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我希望只有一种着陆页类型可以区分要呈现的数据 object。
问题是,我不确定在不依赖页面 url 或页面标题的情况下如何实现,或者您可以检查您所在的站点树的哪个部分,可以轻松更改的内容和从而破解代码。这是解决此类问题的更好方法吗?
您可以将两个 DataObject 添加到一个 LandingPage
class 作为关系。
例如
LandingPage-> has_many -> Webinar(Object)
LandingPage-> has_many -> News(Object)
但是,这限制了您必须在 LandingPage
中为要添加的每个附加对象定义关系。
另一种方法是让 Webinar
和 News
对象都使用相同的抽象/父对象 class,这样您就可以定义一些在两个对象之间共享的默认函数。
然后使用 LandingPage
(CMS) 上的 DropDown 字段来设置要使用的对象。 (例如,获取上面提到的扩展基 class 的所有对象)。
然后您可以使用 LandingPage
中的自定义函数从 class 中获取所有对象,这些对象已通过 CMS 在 DropDown 字段中设置。
例如
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);
}
}
我的网站有 2 个布局完全相同的登录页面(1 个缩略图、一个摘要段落、一个标题和一个 link 到详细信息页面)。登录页面是网络研讨会和新闻,供参考。两者都在管理模型中作为单独的数据 object 进行管理。
最简单的方法是制作 2 种着陆页类型并在每种类型中引用相应的数据 object(即 WebinarLandingPage.php 和 NewsLandingPage.php)。但我知道这不是最可扩展的方式。如果可能的话,我希望只有一种着陆页类型可以区分要呈现的数据 object。
问题是,我不确定在不依赖页面 url 或页面标题的情况下如何实现,或者您可以检查您所在的站点树的哪个部分,可以轻松更改的内容和从而破解代码。这是解决此类问题的更好方法吗?
您可以将两个 DataObject 添加到一个 LandingPage
class 作为关系。
例如
LandingPage-> has_many -> Webinar(Object)
LandingPage-> has_many -> News(Object)
但是,这限制了您必须在 LandingPage
中为要添加的每个附加对象定义关系。
另一种方法是让 Webinar
和 News
对象都使用相同的抽象/父对象 class,这样您就可以定义一些在两个对象之间共享的默认函数。
然后使用 LandingPage
(CMS) 上的 DropDown 字段来设置要使用的对象。 (例如,获取上面提到的扩展基 class 的所有对象)。
然后您可以使用 LandingPage
中的自定义函数从 class 中获取所有对象,这些对象已通过 CMS 在 DropDown 字段中设置。
例如
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);
}
}