几年前,我创建了一个SilverStripe网站,并为Page.php添加了太多字段。我现在正在重做其中的一些但是不能重新启动项目 - 现在在SilverStripe 3.1.10上。
我想为页面子类整理UI,它不需要所有继承的字段,只需要一些扩展。
此扩展程序的外观示例
class NoClutter extends Extension {
public function updateCMSFields(FieldList $fields) {
$fields->removeFieldFromTab("Root.Main", "MenuTitle");
$fields->removeFieldFromTab("Root.Main", "Workflow");
}
}
config.yml
RedirectorPage:
extensions:
- NoClutter
这适用于SiteTree
中添加的字段的所有类(例如 MenuTitle 字段),但不适用于Page
中添加的字段(例如工作流程字段)。如果扩展程序位于UserDefinedForm
,则工作流程也会被删除。但如果扩展名在RedirectorPage
上,则无效。另一方面, MenuTitle 在两个类中都被删除。我的猜测是关于订单的。我的项目是After: 'framework/','cms/'
,希望我可以像项目中的NoClutter
一样进行扩展。
我如何实现这一目标或如何解决问题?
答案 0 :(得分:2)
您需要在$this->extend('updateCMSFields', $fields)
Page
功能的末尾添加getCMSFields()
。
class Page extends SiteTree {
// ...
public function getCMSFields() {
// call updateCMSFields after adding your fields
SiteTree::disableCMSFieldsExtensions();
$fields = parent::getCMSFields();
SiteTree::enableCMSFieldsExtensions();
// ...
$this->extend('updateCMSFields', $fields);
return $fields;
}
}
$this->extend('updateCMSFields', $fields)
声明将调用您的代码updateCMSFields()
函数的位置。
在updateCMSFields()
Page
功能中添加自定义字段之前,您遇到的问题是getCMSFields()
。因此,您尝试在添加 Workflow 字段之前将其删除。这是因为updateCMSFields扩展钩子在父SiteTree
getCMSFields()
函数中声明。
UserDefinedForm
通过调用$this->extend('updateCMSFields', $fields)
底部的getCMSFields()
来解决此问题。在调用SiteTree::disableCMSFieldsExtensions()
以使扩展挂钩工作之前,需要parent::getCMSFields()
。