Silverstripe 如何在GridFieldDetailForm\u ItemRequest子类上实现表单?

Silverstripe 如何在GridFieldDetailForm\u ItemRequest子类上实现表单?,silverstripe,Silverstripe,我想创建一个自定义的GridField操作,它将在弹出窗口中打开一个表单。以下是我所拥有的: <?php class CustomItemRequest extends GridFieldDetailForm_ItemRequest { private static $allowed_actions = array( 'edit', 'view', 'ItemEditForm', 'customaction',

我想创建一个自定义的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)
    {

    }
}
然后,我用一个定制的
GridField\u 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');
    }
});
$('.cms a.my-custom-link')。纠缠({
onclick:函数(e){
e、 预防默认值();
变量对话框=$('');
ssdialog({iframeUrl:this.attr('href'),高度:300});
dialog.ssdialog(“打开”);
}
});
到目前为止,一切正常。我可以单击GridField中的action链接,表单将在弹出窗口中打开。但是,由于表单在提交时将其操作添加到当前GridField操作中,因此路由似乎存在问题。这会产生如下URL:

<!doctype html>
<head>
    <% base_tag %>
</head>
<body>
    $CustomForm
</body>
</html>
http://localhost/admin/modeladmin/CustomDataObject/EditForm/field/CustomDataObject/item/1/admin/modeladmin/CustomDataObject/EditForm/field/CustomDataObject/item/1/CustomForm

这会触发以下错误:

操作“admin”在类CustomItemRequest上不可用。


在这种情况下,如何使表单路由工作?我是否需要一个自定义控制器,而根本不使用
GridFieldDetailForm\u 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>

$CustomForm
关键部分是包含
,这样相对表单操作URL就可以正常工作