【发布时间】:2020-08-06 20:08:04
【问题描述】:
目标:
我有一个名为“事件”的数据对象。这是在“EventsAdmin”(扩展 ModelAdmin)的 managed_model 中。编辑事件时,我想要一个名为“审核”的记录选项卡,它有几个字段和两个按钮:“批准”和“拒绝”。这两个按钮分别调用一个执行相关操作的操作。
事件扩展 DataObject
public function getCMSFields() {
$fields = parent::getCMSFields();
$eventStatus = $fields->dataFieldByName("EventStatus")
->setTitle('Current Status')
->setDisabled(true);
$approveButton = FormAction::create('doApproveEvent', _t('SiteBlockAdmin.Approve', 'Approve'))
->setUseButtonTag(true)
->addExtraClass('btn-outline-success font-icon-check-mark-circle');
$rejectButton = FormAction::create('doRejectEvent', _t('SiteBlockAdmin.Reject', 'Reject'))
->setUseButtonTag(true)
->addExtraClass('btn-outline-danger font-icon-cancel-circled');
$fields->addFieldsToTab('Root.Moderation', [
$eventStatus,
$approveButton,
$rejectButton
]);
return $fields;
}
这可以很好地显示按钮。但他们什么都不做。所以我想弄清楚他们如何插入动作方法 doApproveEvent 和 doRejectEvent (以及他们应该去哪里)
我确实找到了引导我通过 updateFormActions() 将按钮添加到 CMS 页面底部的操作栏的文档。但这不是我想要的,因为我在按钮上方添加的其他字段是批准/拒绝过程的一部分。这是此方法的代码。除非按钮不在我尝试创建的进程的逻辑位置,否则这很好用。
class CMSActionButtonExtension extends DataExtension
{
public function updateFormActions(FieldList $actions)
{
$record = $this->owner->getRecord();
if (!$record instanceof Event || !$record->exists()) {
return;
}
$approveButton = FormAction::create('doApproveEvent', _t('SiteBlockAdmin.Approve', 'Approve'))
->setUseButtonTag(true)
->addExtraClass('btn-outline-success font-icon-check-mark-circle');
$rejectButton = FormAction::create('doRejectEvent', _t('SiteBlockAdmin.Reject', 'Reject'))
->setUseButtonTag(true)
->addExtraClass('btn-outline-danger font-icon-cancel-circled');
$actions->push($approveButton);
$actions->push($rejectButton);
}
public function doApproveEvent($data, $form) {
$record = $this->owner->getRecord();
// Approve logic
}
public function doRejectEvent($data, $form) {
$record = $this->owner->getRecord();
// Reject logic
}
}
上面的扩展附加到GridFieldDetailForm_ItemRequest
extension.yml
SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest:
extensions:
- My\Namespace\CMSActionButtonExtension
有趣的是,如果我在页面上同时拥有两组按钮,那么 updateFormActions 选项会起作用,而我想要的选项仍然不起作用。尽管按钮具有相同的标记并且位于完全相同的表单标签内。我认为这与 Silverstripe 加载主内容面板和 DOM 的方式有关。
对实现这一目标有什么想法吗?有人在我可以查看的模块中看到添加到主 CMS 面板的按钮吗?我找到了 5 年前的 this 帖子,但它是针对 SS3 的,答案对我不起作用。
【问题讨论】:
-
我假设 CMSActionButtonExtension 附加到表单或网格域组件?您能否还包括您使用的 config.yml?
-
@Zauberfisch 是的,没错。确切地说是 GridFieldDetailForm_ItemRequest。我已经用配置更新了我的帖子。
标签: silverstripe silverstripe-4