如何在GridFieldDetailForm_ItemRequest子类上实现Form?

时间:2016-05-04 09:19:10

标签: silverstripe

我想创建一个自定义的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的链接。我使用一些自定义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

1 个答案:

答案 0 :(得分:1)

嗯,问题实际上很容易解决。

而不是:

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 %>,以便相对的表单 - 操作URL可以正常工作。