我正试图通过扩展将控制器操作添加到页面控制器类。
例如,所需的结果是能够转到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,默认情况下允许Acaction索引。
现在在/mysite/\u config/routes.yml中,您必须定义到控制器的路由:
---
Name: mysite-routes
After: framework/routes#coreroutes
---

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

另请参见:Docs for routing

关于php - Silverstripe扩展 Controller 操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31369356/

10-13 06:21