如何解决在 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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。