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


SilverStripe best practice regarding pagetypes

假设您有两种页面类型:页面主页。显然,页面将作为所有页面的基本页面类型,主页仅用于主页。对于每个基本页面,你都想要一个自定义的标题照片,而对于主页,则没有。

在最佳实践中,理想的设置是什么?

页面扩展sitetree,并具有标题的ImageUpload字段

主页扩展Page并禁用标题的ImageUpload字段

页面扩展sitetree,并具有标题的ImageUpload字段

主页扩展sitetree而不需要任何额外的CMS字段

我就是这样做的:

Page.php

每个Page和任何扩展Page的页面都将继承Image upload字段。

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;
    }
}

主页.php

然后在任何不需要图像上传字段的页面上,只需调用$fields->removeByName('Image');

class HomePage extends Page {
    private static $db = array();
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->removeByName('Image');
        return $fields;
    }
}

您可以创建另一个继承page的页面类型。让我们称之为"BasicPage"。

主页直接继承Page。

BasicPage也直接继承Page。

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

我避免在我的网站树中创建"页面"类型的页面。我倾向于把"Page"当作抽象类型来使用。你会遇到的问题是,你会在Page中填充很多共享功能,然后有一天,你需要创建一个新的页面类型,它的外观或功能集与你以前开发的大多数页面类型截然不同。当这种情况发生时,您将被从Page继承的所有东西所困扰,这将阻碍您和您的应用程序。您和您的应用程序都将减慢速度。