我正在通过ModelAdmin
管理DataObject
,并且我添加了一个自定义按钮,因为我想在添加项目时执行自定义操作。
class InventoryAdmin extends ModelAdmin {
public function getEditForm($id = null, $fields = null) {
$form = parent::getEditForm($id, $fields);
$listField = $form->Fields()->fieldByName($this->modelClass);
if ($gridField = $listField->getConfig()->getComponentByType('GridFieldDetailForm'))
$gridField->setItemRequestClass('InventoryFieldDetailForm_ItemRequest');
return $form;
}
}
class InventoryFieldDetailForm_ItemRequest extends GridFieldDetailForm_ItemRequest {
private static $allowed_actions = array (
'edit',
'view',
'ItemEditForm'
);
public function ItemEditForm() {
$form = parent::ItemEditForm();
$formActions = $form->Actions();
$formActions->removeByName('action_doSave');
if ($actions = $this->record->getCMSActions()) {
foreach ($actions as $action) {
$formActions->push($action);
}
}
return $form;
}
public function doAddInventoryItem($data, $form) {
return Controller::curr()->redirect($this->getToplevelController()->Link());
}
}
但是,这在提交时有效,CMS 会返回到父级,并且偏移了大约 15 像素。主要问题是CMS UI从那时起变得无响应,直到刷新。
我应该重定向到什么才能访问父ModelAdmin
?
GridFieldDetailForm_ItemRequest
类具有函数getBacklink
,该函数应提供指向上一个屏幕的链接。
然后,可以使用 getToplevelController
获取控制器并设置以下标头以强制内容刷新。
$controller = $this->getToplevelController();
$controller->getRequest()->addHeader('X-Pjax', 'Content'); // Force a content refresh
return $controller->redirect($this->getBacklink(), 302); //redirect back to admin section
例如 https://github.com/silverstripe/silverstripe-framework/blob/3.6/forms/gridfield/GridFieldDetailForm.php#L607