对于必须始终在网站上的页面(只有1个,而不是更多,如主页),我想做一个扩展。该页面应该在我运行dev/build时创建,并且不能在CMS中创建,删除,取消发布或存档。但是可以编辑。
除了canCreate
函数外,一切似乎都很好。当它在(n)(数据)扩展上时,这个函数似乎对CMS没有多大作用。当我在…/admin/pages/add我仍然可以随心所欲地创建页面。
如果我移动canCreate
到主页类,它确实工作。但我想在我的扩展:-)
class OnePage extends DataExtension
{
public function requireDefaultRecords()
{
if($this->canCreate()) {
$page = $this->owner;
$page->Title = $this->owner->className;
$page->write();
$page->publish('Stage', 'Live');
$page->flushCache();
}
}
public function canCreate($member = null)
{
return $this->owner->get()->count() == 0;
}
public function canDeleteFromLive($member = null)
{
return false;
}
public function canArchive($member = null)
{
return false;
}
}
class HomePage extends Page
{
private static $extensions = [
'OnePage'
];
}
我这样做是正确的还是我错过了什么?
编辑
canCreate
方法工作得很好,所以我可以这样解决它;
class HomePage extends Page
{
public function canCreate($member = null)
{
return $this->get()->count() == 0;
}
}
这有预期的效果,像一个魅力。然而,问题是如何将canCreate
方法放在扩展中。这应该也可以,对吧?
好吧,$this->owner->get()
不行。$this->owner
总是返回实际对象,而不是DataList。它应该像这样工作:
public function canCreate() {
$className = $this->owner->ClassName;
return $className::get()->count() == 0;
}
BTW:如果你打算发布这个模块请考虑另一个名字,我已经发布了https://github.com/wernerkrauss/silverstripe-onepage/使用SiteTree制作简单的单页网站