关于页面类型的 SilverStripe 最佳实践

SilverStripe best practice regarding pagetypes

假设您有两种页面类型:PageHomePage。显然 Page 将作为所有页面的基本页面类型,而 HomePage 仅作为主页。对于每个基本页面,您都需要自定义 header 照片,对于主页 none.

按照最佳实践,理想的设置是什么?

页面扩展 sitetree 并具有 header

的 ImageUpload 字段

HomePage 扩展 Page 并禁用 header

的 ImageUpload 字段

页面扩展 sitetree 并具有 header

的 ImageUpload 字段

主页扩展 sitetree,没有任何额外的 CMS 字段

您可以创建另一种继承 Page 的页面类型。我们称它为 "BasicPage".

HomePage直接继承Page。

BasicPage也是直接继承Page。

然后,将图像 "has_one" 关系附加到 BasicPage。

我避免在我的站点树中创建 "Page" 类型的页面。我倾向于主要使用 "Page" 就好像它是一个抽象类型一样。您将遇到的问题是,您将在 Page 中塞入大量共享功能,然后有一天,您将需要创建一种新的页面类型,其外观或功能集与大多数页面截然不同您之前开发的类型。当这种情况发生时,您将受制于从 Page 继承的所有内容,这将阻碍您和您的应用程序。您和您的应用程序都会变慢。

我是这样做的:

Page.php

每个 Page 和任何扩展 Page 的页面都将继承图片上传字段。

class Page extends SiteTree {

    private static $has_one = array(
        'Image' => 'Image'
    );

    public function getCMSFields()
    {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Main', UploadField::create('Image'), 'Content');
        return $fields;
    }

}

首页Page.php

然后在您不希望图片上传字段的任何页面上调用 $fields->removeByName('Image');

class HomePage extends Page {

    private static $db = array();

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        $fields->removeByName('Image');

        return $fields;
    }
}