Modx向插件中的非对象抛出一个成员函数的调用

时间:2014-05-03 13:04:24

标签: php modx modx-revolution

我有一个名为LangSwither的插件:

if($modx->context->get('key') != "mgr"){
    //grab the current domain from the http_host option
    switch ($modx->getOption('http_host')) {
        case 'www.xxxxxxxxxxx.de':
            //switch the context
            $modx->switchContext('en');
            //set the cultureKey
            $modx->setOption('cultureKey', 'en');
            break;
        default:
            // Set the default language/context here
            $modx->switchContext('web');
            $modx->setOption('cultureKey', 'pl');
            break;
    }
}

从这里http://www.butter.com.hk/blog/posts/2010/08/internationalization-in-modx-revolution.html 它与OnHandleRequest事件有关。它抛出:  致命错误:在第7行的xxxxxxxx中的非对象上调用成员函数get() (第7行是if($modx->context->get('key') != "mgr"){) 感谢。

2 个答案:

答案 0 :(得分:2)

我会完全删除第一个“if”,你不需要检查你是否在经理中,因为上下文没有区别。您也不需要切换到“web”上下文,因为这是默认设置,您只需要在需要时更改为“en”或任何其他语言。切换上下文时,应自动设置culturekey。这应该足够了:

switch ($_SERVER['HTTP_HOST']) {
    case 'www.xxxxxxxxxxx.de':
        //switch the context
        $modx->switchContext('en');
        break;
}

如果你真的想要第一个“如果”我会建议降低优先级(通过将onHandleRequest的优先级字段中的数字增加到高位,如999)。确保它在其他一切之后运行。

修改:您可能还想尝试将$modx->context->get('key')更改为$resource->get('context_key')

答案 1 :(得分:1)

看起来您在$modx->context没有上下文对象。看来你已经删除了modx的上下文初始化方法:

$modx->initialize('web'); if (!MODX_API_MODE) { $modx->handleRequest();}

Modx进行上下文初始化,之后它处理发布 onHandleRequest 事件的请求。

P.S。对于多文本站点进行初始化的最佳方法是index.php修改,您应该在请求处理之前进行上下文初始化。主要原因是modx(使用默认的index.php内容)将在Web上下文而不是正确的上下文中验证您的用户。 Index.php修改解决了这个问题,您不会对用户的身份验证区域感到头疼。

如果我们谈论 culture_key 更改 - onHandleRequest 事件是最佳选择。