2016-11-28 50 views
3

我在我的系統中的一些定製路由:與自定義表單上傳現場要求現場()的自定義實現

--- 
Name: mysiteroutes 
--- 
Director: 
    rules: 
    'create//$Action': 'CreateController' 

其中有一個自定義的控制器來創建表單:

class CreateController extends Page_Controller{ 

    private static $allowed_actions = array(
     'submit' 
    ); 

    public function link($action = null) { 
     return $this->join_links('create/', $action); 
    } 

    public function index() { 
     $form = Form::create(
      $this, 
      '', 
      FieldList::create(
       TextField::create('Name', 'Name'), 
       $upload = new UploadField('Upload', 'Upload') 
      ), 
      FieldList::create(
       FormAction::create('submit', 'Submit')->setAttribute('class', 'btn btn-success') 
      ), 
      RequiredFields::create('Name') 
     ); 
     if($this->request->isPost()) return $form; 
     return $this->customise(array('Form'=>$form))->renderWith(array("Create", "Page"));  
    } 

    public function submit($data, $form = null) { 
     $params = $this->getRequest()->params(); 
     var_dump($params); 
    } 
} 

當我試着在控制器上上傳一個叫Field()的東西,然後失敗,因爲它不在那裏。我可以添加它並正確調用它,但是我不知道應該放入什麼內容。我已經瀏覽了UploadField.php中的Field()函數,但是有很多代碼可能不應該被複制。

我應該如何管理我的自定義控制器中的文件上傳,或者我可以以某種方式將其轉發到核心框架?

回答

1

UploadField預計會有一個基於表單名稱的路由,在你的情況下爲''。 如果要將表格的名稱更改爲form,則會調用form/field/Upload/upload。它的作用是獲得form,然後獲取名稱Uploadfield,並在該類上調用方法upload

不幸的是,你正在使用的形式(我向您展示了在前面的答案:()的方式不支持此

我們可以解決這個問題是這樣。

CreateController

class CreateController extends Page_Controller 
{ 
    private static $allowed_actions = [ 
     'form' 
    ]; 

    public function link($action = null) 
    { 
     return $this->join_links('create', $action); 
    } 

    public function index() 
    { 
     return $this->renderWith(array("Create", "Page"));  
    } 

    public function form() 
    { 
     return UploadForm::create($this, 'form', 'submit'); 
    } 

    public function submit($data, $form = null) 
    { 
     $params = $this->getRequest()->params(); 
     var_dump($params); 
    } 
} 

// create an extra class for the form to keep your controller clean 
class UploadForm extends Form 
{ 
    public function __construct($controller, $name, $action) 
    { 
     $fields = FieldList::create(
      TextField::create('Name', 'Name'), 
      UploadField::create('Upload', 'Upload') 
     ); 

     $actions = FieldList::create(
      FormAction::create($action, 'Submit') 
       ->setAttribute('class', 'btn btn-success') 
     ); 

     $validator = RequiredFields::create('Name'); 

     parent::__construct($controller, $name, $fields, $actions, $validator); 
    } 
} 
+0

非常感謝您回答我的所有問題。關於表單的自定義路由沒有太多的細節,或者一般來說SilverStripe是一個恥辱,因爲它是一個很棒的框架。 – Rudiger

+0

沒問題,我很樂意提供幫助。這個答案對你有幫助嗎? –

+0

它在工作,所以我將不得不稍後測試,我相信它會但不得不檢查。 – Rudiger