是否可以为 silverstripe 中的新页面设置默认小部件,或者让子页面最初从其父页面继承其小部件?整个侧边栏被我正在处理的站点中的自定义小部件占据,默认情况下,选择少数几个出现在客户端将创建的(许多)新页面上会很好。他们仍然应该可以选择删除它们或添加任何其他人。
我已经搜索了文档,但没有发现任何迹象表明这是可能的。
是否可以为 silverstripe 中的新页面设置默认小部件,或者让子页面最初从其父页面继承其小部件?整个侧边栏被我正在处理的站点中的自定义小部件占据,默认情况下,选择少数几个出现在客户端将创建的(许多)新页面上会很好。他们仍然应该可以选择删除它们或添加任何其他人。
我已经搜索了文档,但没有发现任何迹象表明这是可能的。
默认小部件应该很容易做到我们可以在 SiteConfig 中添加一个小部件区域,您可以在其中设置默认值,然后在 Page 中使用 populateDefaults 将小部件从 SiteConfig 复制到新页面:
文件mysite/code/mysiteSiteConfigDecorator.php
class mysiteSiteConfigDecorator extends DataObjectDecorator {
public function extraStatics() {
return array(
'has_one' =>array(
'DefaultWidgets' => 'WidgetArea'
),
);
}
public function updateCMSFields(FieldSet &$fields) {
$fields->removeByName('Theme');
$fields->addFieldToTab('Root', new Tab('DefaultWidgetsTab', _t('SiteConfig.DefaultWidgetsTab', 'Default Widgets for new Pages')));
$fields->addFieldToTab("Root.DefaultWidgetsTab", new WidgetAreaEditor("DefaultWidgets"));
}
}
文件mysite/_config.php
...
Object::add_extension('SiteConfig', 'mysiteSiteConfigDecorator');
...
文件mysite/code/Page.php
class Page extends SiteTree {
public static $has_one = array(
'Sidebar' => 'WidgetArea'
);
public function populateDefaults() {
parent::populateDefaults();
if ($this->Sidebar()) {
$widgetArea = new WidgetArea();
$widgetArea->write();
$this->SidebarID = $widgetArea->ID;
} else {
$widgetArea = $this->Sidebar();
}
$siteConfig = SiteConfig::current_site_config();
if ($siteConfig && $siteConfig->DefaultWidgets() && $siteConfig->DefaultWidgets()->Widgets()->exists()) {
foreach ($siteConfig->DefaultWidgets()->Widgets() as $widget) {
$widget->ID = 0;
$widget->write();
$widgetArea->Widgets()->add($widget);
}
}
}
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->addFieldToTab("Root.Content.Widgets", new WidgetAreaEditor("Sidebar"));
return $fields;
}
}
...
然而,从父母那里应对并不那么容易。但如果你愿意,你也可以只检查当前页面是否有小部件,如果没有,则显示父小部件,如下所示:
class Page extends SiteTree {
...
public function SidebarForTemplate() {
if ($this->Sidebar())
return $this->Sidebar();
elseif ($this->Parent())
return $this->Parent()->SidebarForTemplate();
return false;
}
...
}
然后在模板中使用 $SidebarForTemplate