【发布时间】:2015-07-24 17:20:19
【问题描述】:
我的目标是将自定义 FormAction 添加到 ModelAdmin 内的 DataObjects EditForm 中,在“保存”和“删除”操作旁边。
设置:
使用updateCMSActions,我可以添加该按钮。
class MyActionEventExtension extends DataExtension {
public function updateCMSActions(FieldList $actions) {
if($this->owner->canEdit(Member::currentUser())) {
$actions->push(FormAction::create('doMyAction', 'Action'));
}
return $actions;
}
}
这很好用。
在this answer on stackoverflow 之后,我为动作处理程序创建了一个LeftAndMainExtension。
class MyActionLeftAndMainExtension extends LeftAndMainExtension {
private static $allowed_actions = array(
'doMyAction'
);
public function doMyAction($data, $form) {
// Do stuff.
// ... I never get here.
// Return stuff
$this->owner->response->addHeader(
'X-Status',
rawurlencode('Success message!')
);
return $this->owner->getResponseNegotiator()
->respond($this->owner->request);
}
}
对应的config.yml文件如下所示:
LeftAndMain:
extensions:
- MyActionLeftAndMainExtension
TheDataObject:
extensions:
- MyActionEventExtension
问题:
当我点击按钮时,响应显示“404 Not Found”。
请求的 URL 始终相同:
http://localhost/admin/model-admin-url-slug/TheDataObject/EditForm/field/TheDataObject/item/878/ItemEditForm
我找到了一些其他解决方案,建议扩展 ModelAdmins GridField。遗憾的是,这不是一个选项,因为我需要该操作的 DataObject 有很多关系,这意味着它的 EditForm 也出现在其他 DataObjects EditForms(嵌套)中。
我真的没有想法了。我是否错过了 ModelAdmin 中的某些内容?我创建的只是实现了基本的静态变量,所以我没有在这里发布。
任何帮助都会很棒!
更新:
我最终在我的 ModelAdmin 上提供了一个 getEditForm 方法。
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('MyAdminForm_ItemRequest');
}
return $form;
}
并扩展GridFieldDetailForm_ItemRequest:
class MyAdminForm_ItemRequest extends GridFieldDetailForm_ItemRequest {
private static $allowed_actions = array (
'edit',
'view',
'ItemEditForm'
);
public function ItemEditForm() {
$form = parent::ItemEditForm();
$formActions = $form->Actions();
// Adds all FormActions provided by the model's `getCMSActions` callback
if ($actions = $this->record->getCMSActions()) {
foreach ($actions as $action) {
$formActions->push($action);
}
}
return $form;
}
public function doAction($data, $form) {
// do stuff here
}
}
遗憾的是,这并没有在 has_many 或 many_many 关系网格字段上添加操作。因此,我将保持问题的开放和未回答。 也许有时会有更好的解决方案.. :)
【问题讨论】:
-
在你的 config.yml 中添加扩展后你刷新了吗?
-
@wmk 是的。我做了更多的研究,现在我的猜测是,我必须以某种方式扩展
GridFields EditForm? ..不确定
标签: php backend silverstripe