2017-05-21 346 views
1

OK所以這似乎有點令人費解,所以我會盡我所能:控制器擴展與SilverStripe 3表單自定義控制器不處理

  1. 我有一個自定義路由自定義控制器將對象作爲頁面顯示數據 。 TourController擴展Page_Controller。對於這個 的例子,說這個頁面的路由是 /tours/south-america/patagonia/tour-name /。這工作正常。
  2. 我有其他正常整個頁面通過 CMS
  3. 加入,我有一個新的DataExtension,僅僅增加了一個表單全部 Page_Controller對象的位置的。下面的代碼。

    class CurrencyPageExtension extends DataExtension { 
    private static $allowed_actions = array(
        'CurrencyForm', 
        'setCurrency' 
    ); 
    
    public function CurrencyForm() { 
    
        $currencies = [ 
         'NZD', 
         'AUD', 
         'USD', 
         'GBP', 
         'EUR' 
        ]; 
    
        $currentCurrency = 'NZ'; 
    
        $currencyField = DropdownField::create('Currency', ' ', $currencies, $currentCurrency); 
        $currencyField->addExtraClass('form-control'); 
        $currencyField->setAttribute('onchange', 'this.form.submit()'); 
    
        $fields = FieldList::create(
         $currencyField 
        ); 
    
        $actions = FieldList::create(
         FormAction::create('setCurrency', 'Save') 
        ); 
    
        $form = new Form(
         $this->owner, 
         'CurrencyForm', 
         $fields, 
         $actions 
        ); 
    
        return $form; 
    
    } 
    
    public function setCurrency($data, $form) { 
        // Set currency stuff 
        $this->owner->redirectBack(); 
    } 
    
    } 
    

在所有頁面,包括定製的控制器,形式呈現就好了。當我提出我遇到問題時。在普通頁面上,一切都很好,setCurrency操作也會觸發。例如。表單被提交給/ home/CurrencyForm。然而,在自定義控制器上,表單被提交給/ TourController/CurrencyForm,並出現404錯誤。

我已經搜索並找到了幾個suggestions圍繞在自定義控制器上創建Link()方法,並且我成功地做到了這一點。但是404問題仍然存在。

任何想法我可以做到這一點。我有一半認爲將操作直接放在Page_Controller上更容易,但我寧願保留所有這些代碼封裝。

回答

2

嘗試將formAction設置爲始終使用/ home/myform,例如$form->setAction('/home/myForm');

這是在返回表單之前。然後,它應該始終使用該URL,而不管你在哪個頁面上。

+0

好主意!該方法是行動setFormAction,所以謝謝! $形式 - > setFormAction( '/家庭/ CurrencyForm'); – Aaryn