2015-07-12 3 views
3

Я пытаюсь добавить действие Controller к классу Page_Controller через расширение.Silverstripe Продление действия контроллера

Желаемый результат - это, например, возможность перейти на 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(); 

    } 
} 

И я звоню в расширении с конфигурационного файла YML:

Page_Controller: 
    extensions: 
    - Page_ControllerLanguageExtension 

Спасибо заранее.

+2

Try вызова '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

Смежные вопросы