SilverStripe可以在扩展上创建


SilverStripe canCreate on an Extension

对于必须始终在网站上的页面(只有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制作简单的单页网站