【问题标题】:Custom backend FormAction handler not found未找到自定义后端 FormAction 处理程序
【发布时间】: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


【解决方案1】:

这个问题的一个非常简单的答案(如果你可以选择的话)是使用 Better Buttons 模块:https://github.com/unclecheese/silverstripe-gridfield-betterbuttons#creating-a-custom-action

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

【讨论】:

  • 谢谢,我现在正在运行一个动作,仅在一个特定的 ModelAdmin 上提供。作为一种解决方法,这没关系.. 但我会尽快检查 gridfield-betterbuttons,如果这对我来说是一个解决方案,请回到这里!
猜你喜欢
  • 2015-06-23
  • 2013-08-26
  • 2016-01-09
  • 2013-12-26
  • 1970-01-01
  • 2016-03-31
  • 2020-03-11
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多