如何在 GridFieldDetailForm_ItemRequest 子类上实现表单?

How do I implement a Form on a GridFieldDetailForm_ItemRequest subclass?

我想创建一个自定义的 GridField 操作,它将在弹出窗口中打开一个表单。这是我拥有的:

<?php
class CustomItemRequest extends GridFieldDetailForm_ItemRequest
{
    private static $allowed_actions = array(
        'edit',
        'view',
        'ItemEditForm',
        'customaction',
        'CustomForm',
    );


    public function customaction($request) {
        return $this->CustomForm()->forTemplate();
    }

    public function CustomForm()
    {
        $fields = new FieldList(
            TextField::create('Name', 'Your Name')
        );
        $actions = new FieldList(
            FormAction::create('doCustomAction')
        );
        $form = new Form($this, 'CustomForm', $fields, $actions);
        return $form;
    }

    public function doCustomAction($data, $form, $request)
    {

    }
}

在 GridFieldConfig 上,我像这样设置自定义请求处理程序:

$config->getComponentByType('GridFieldDetailForm')
       ->setItemRequestClass('CustomItemRequest');

然后我使用自定义 GridField_ColumnProvider 连接所有内容,该自定义 GridField_ColumnProvider 将 link 呈现到 GridField。我使用一些自定义 Javascript 在弹出窗口中加载表单:

$('.cms a.my-custom-link').entwine({
    onclick: function (e) {
        e.preventDefault();
        var dialog = $('<div class="custom-dialog"/>');
        dialog.ssdialog({iframeUrl: this.attr('href'), height: 300});
        dialog.ssdialog('open');
    }
});

到目前为止,一切正常。我可以单击 GridField 中的 action-link,然后在弹出窗口中打开表单。但是,路由似乎存在问题,因为表单在提交时将其操作添加到当前的 GridField 操作中。这导致 URL 像这样:

http://localhost/admin/modeladmin/CustomDataObject/EditForm/field/CustomDataObject/item/1/admin/modeladmin/CustomDataObject/EditForm/field/CustomDataObject/item/1/CustomForm

这会触发以下错误:

Action 'admin' isn't available on class CustomItemRequest.

在这种情况下如何使表单路由工作?我是否需要自定义控制器而不使用 GridFieldDetailForm_ItemRequest

嗯,这个问题其实还是比较容易解决的。

而不是:

public function customaction($request) {
    return $this->CustomForm()->forTemplate();
}

你应该做的:

public function customaction($request) {
    return $this->renderWith('MyCustomTemplate');
}

然后 MyCustomTemplate.ss 应该是这样的:

<!doctype html>
<head>
    <% base_tag %>
</head>
<body>
    $CustomForm
</body>
</html>

关键部分是包含<% base_tag %>,这样相对的Form-Action URL就可以正常工作了。