我试图通过扩展添加一个控制器动作到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();
}
}
我用一个YML配置文件调用扩展名:
Page_Controller:
extensions:
- Page_ControllerLanguageExtension
所以如果你需要/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路由