在 Silverstripe 中,如何像在 DataObjects 中一样自动为 Pages 创建 CMS 字段?

问题描述

DataObjects 中,getCMSFields 方法自动创建所有适当的 CMS 字段(称为脚手架)。但是,在扩展 SiteTree(即 Pages)的类中,这不会发生。

如何在 Pages 中使用此表单字段脚手架?

解决方法

除了像您在自己的答案中建议的那样调用 DataObject::getCMSFields() 之外,还可以直接实例化一个脚架:

public function getCMSFields() {
        // with tabs
        $scaffolder = new FormScaffolder($this);
        $scaffolder->restrictFields = ['Title','Content'];
        $scaffolder->tabbed = true;
        $fields = $scaffolder->getFieldList();
        $fields->addFieldToTab('Root.Main',[
            new MySpecialFieldWithCustomOptions('Links','My Links',$foobar),]);
        return $fields;
}
public function getCMSFields() {
        // without tabs
        $scaffolder = new FormScaffolder($this);
        $scaffolder->restrictFields = ['Title','Content'];
        $fields = $scaffolder->getFieldList();
        $fields->push(
            new MySpecialFieldWithCustomOptions('Links',$foobar)
        );
        return $fields;
}

这将适用于任何 DataObject($this 必须是 DataObject 的一个实例)。 Pages 是 DataObjects 的一个子类。
restrictFields 是可选的,如果没有提供,它会做所有能找到的字段。

,

我们回到 DataObject 并获取脚手架字段:

use SilverStripe\ORM\DataObject;
use Page;

class MyPage extends Page 
{
    private static $db = [
        'MyField' => 'Varchar',];

    private static $has_one = [
        'MyRelation' => 'MyClass',];

    public function getCMSFields()
    {
        // fields from Page class
        $fields = parent::getCMSFields();
        // fields from DataObject class.
        $fieldRepository = DataObject::getCMSFields();

        $fields->addFieldsToTab(
            'Root.MyExtraFields',[
                $fieldRepository->dataFieldByName('MyField'),$fieldRepository->dataFieldByName('MyRelationID'),]
        );

        return $fields;

    }
}