Php 未找到自定义后端FormAction处理程序

Php 未找到自定义后端FormAction处理程序,php,backend,silverstripe,Php,Backend,Silverstripe,我的目标是在ModelAdmin中的DataObjects EditForm中,在“保存”和“删除”操作旁边添加自定义表单 设置: 通过updatecmactions我可以添加该按钮 class MyActionEventExtension extends DataExtension { public function updateCMSActions(FieldList $actions) { if($this->owner->canEdit(Member

我的目标是在ModelAdmin中的DataObjects EditForm中,在“保存”和“删除”操作旁边添加自定义表单

设置:

通过
updatecmactions
我可以添加该按钮

class MyActionEventExtension extends DataExtension {
    public function updateCMSActions(FieldList $actions) {

        if($this->owner->canEdit(Member::currentUser())) {
          $actions->push(FormAction::create('doMyAction', 'Action'));
        }
        return $actions;
    }
}
这个很好用

接下来,我为actions处理程序创建了一个
leftandmain扩展

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未找到”

请求的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\u 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\u many或many\u many关系网格字段上添加操作。。正因为如此,我会让这个问题悬而未决。也许某个时候会有更好的解决方案:)

这个问题的一个非常简单的答案(如果您可以选择)是使用更好的按钮模块:


它允许您定义模型上的操作,这从架构的角度来看有点可疑,但在Silverstripe和ModelAdmin的环境中也可以很好地工作。

对于这个问题,一个非常简单的答案(如果您可以选择)是使用更好的按钮模块:


它允许您定义模型上的操作,这从架构的角度来看有点可疑,但在Silverstripe和ModelAdmin的上下文中也可以很好地工作。

在将扩展添加到config.yml之后是否刷新?@wmk yep。我做了更多的研究,现在我的猜测是,我必须以某种方式扩展
GridField
s EditForm。。不确定在将扩展添加到config.yml后是否刷新?@wmk-yesp。我做了更多的研究,现在我的猜测是,我必须以某种方式扩展
GridField
s EditForm。。不确定谢谢,我现在运行一个操作,只在一个特定的ModelAdmin上提供。作为一种解决办法,这是可以的。。但我会尽快检查gridfield betterbuttons,如果这对我来说是一个解决方案,我会回来这里!谢谢,我现在运行一个操作,只在一个特定的ModelAdmin中提供。作为一种解决办法,这是可以的。。但我会尽快检查gridfield betterbuttons,如果这对我来说是一个解决方案,我会回来这里!