【发布时间】:2021-08-10 07:24:24
【问题描述】:
在DataObjects 中,getCMSFields 方法会自动创建所有适当的 CMS 字段(称为脚手架)。但是,在扩展 SiteTree(即 Pages)的类中不会发生这种情况。
如何在 Pages 中使用此表单字段脚手架?
【问题讨论】:
标签: silverstripe scaffolding silverstripe-4
在DataObjects 中,getCMSFields 方法会自动创建所有适当的 CMS 字段(称为脚手架)。但是,在扩展 SiteTree(即 Pages)的类中不会发生这种情况。
如何在 Pages 中使用此表单字段脚手架?
【问题讨论】:
标签: silverstripe scaffolding silverstripe-4
除了按照您在自己的答案中的建议调用 DataObject::getCMSFields() 之外,还可以直接实例化 scafolder:
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', 'My 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;
}
}
【讨论】: