2016-05-04 16 views
1

我想創建一個自定義的GridField操作,它將在彈出窗口中打開一個窗體。下面是我有:如何在GridFieldDetailForm_ItemRequest子類上實現表單?

<?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

那麼,這個問題其實很容易解決。

相反的:

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按其應有的方式工作。