我想创建一个自定义的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
?
答案 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可以正常工作。