2015-07-12 90 views
3

我想通過擴展將控制器操作添加到Page_Controller類中。銀條紋擴展控制器操作

想要的結果是能夠去www.mysite.com/setlanguage/spanish例如,並通過瀏覽器cookie更新網站的語言西班牙語。

但是,我是SilverStripe中擴展的新故障,到目前爲止,當我訪問控制器操作的鏈接時,我得到的是一個404錯誤。

請看看我的代碼...

class Page_ControllerLanguageExtension extends Extension { 

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

    public function setLanguage(SS_HTTPRequest $request) { 

     $requestedLanguage = $request->param('ID'); 
     $languageCookie = new Cookie; 
     $languageCookie->set('site_language', $requestedLanguage); 

     return $this->owner->RedirectBack(); 

    } 
} 

而且我與陽明配置文件的分機呼叫:

Page_Controller: 
    extensions: 
    - Page_ControllerLanguageExtension 

在此先感謝。

+2

嘗試調用'www.mysite.com/ home/setlanguage/spanish'或'www.mysite.com/ [page-url-segment]/setlanguage/spanish'。你的代碼看起來不錯。我認爲唯一的問題是你不能在沒有URL段的主頁上調用一個操作。 – 3dgoo

+1

看起來不錯。如果你需要URL'/ setlanguage/spanish /',你需要將你的控制器路由到'setlanguage',並在'index()'方法中得到參數。 – wmk

+1

就這麼簡單!完美,謝謝你們兩位。 – Xander

回答

1

所以如果你需要/setlanguage/<language>作爲URL,你必須航線的URL /setlanguage/到一個單獨的控制器:

class SetLanguageController extends Controller { 

    public function index(SS_HTTPRequest $request) { 

     $requestedLanguage = $request->param('Language'); //as defined in config below 
     $languageCookie = new Cookie; 
     $languageCookie->set('site_language', $requestedLanguage); 

     return $this->RedirectBack(); 

    } 
} 

我們並不需要定義在這種情況下$allowed_actions,案由指數默認情況下允許。

現在,在您/mysite/_config/routes.yml你必須定義到控制器的路徑:

--- 
Name: mysite-routes 
After: framework/routes#coreroutes 
--- 

Director: 
    rules: 
    'setlanguage/$Language': 'SetLanguageController' 

參見:Docs for routing