Цель:
У меня есть DataObject под названием «Событие». Это управляемая_модель для «EventsAdmin» (расширяющая ModelAdmin). При редактировании события мне нужна вкладка в записи под названием «Модерация», которая имеет несколько полей и две кнопки: «Утвердить» и «Отклонить». Эти две кнопки вызывают действие, каждая из которых выполняет соответствующие действия.
Событие расширяет 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 (И где они должны go)
Я нашел документы, которые побудили меня добавить кнопки на панель действий внизу страницы CMS через updateFormActions (). Но это не то, что я хочу, поскольку другие поля, которые я добавляю над кнопками, являются частью процесса утверждения / отклонения. Вот код этого метода. Это отлично работает, если кнопки не находятся в логическом месте для процесса, который я пытаюсь создать.
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 лет go, но он для SS3, и ответ у меня не работает.