如何在 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就可以正常工作了。
我想创建一个自定义的 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就可以正常工作了。