问题描述
在 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;
}
}