【问题标题】:ModX Revolution doesn't switch contextModX Revolution 不切换上下文
【发布时间】:2012-03-18 19:17:59
【问题描述】:

我正在使用带有插件 LoginBabel 的 modX Revo。正如在 Babel 手册中所写的那样,我为两种语言制作了 2 个上下文,使用了 TV 参数并编写了 contextSwitch 插件。它主要类似于手册中示例中的插件。之后我将插件放在事件 HandleRequest 上。

除了登录后切换上下文外,一切正常:如果用户被授权,modX 只显示主页,其他显示 404 页面。我试图在代码中翻找,发现模型 modx 的方法 switchContext(/core/model/modx/modx.class.php 的第 1843 行)返回 false。

  public function switchContext($contextKey, $reload = false) {
        $switched= false;
        if ($this->context->key != $contextKey) {
            $switched= $this->_initContext($contextKey, $reload); // RETURNS FALSE
            if ($switched) {
                if (is_array($this->config)) {
                    $this->setPlaceholders($this->config, '+');
                }
            }
        }
        return $switched;
    }

它发生了,因为上下文不能被启动(同一个文件中同一个类的方法_initContext)。这里上下文是正确创建的,当我们要求切换到它时,但是 $this->context->checkPolicy('load') 返回 false (在同一文件的 2169 行附近)。

protected function _initContext($contextKey, $regenerate = false) {
    // HERE IS EVERYTHING ALLRIGHT
    $initialized= false;
    $oldContext = is_object($this->context) ? $this->context->get('key') : '';
    if (isset($this->contexts[$contextKey])) {
        $this->context= & $this->contexts[$contextKey];
    } else {
        $this->context= $this->newObject('modContext');
        $this->context->_fields['key']= $contextKey;
    }
    if ($this->context) { //HERE TRUE
        if (!$this->context->prepare((boolean) $regenerate)) { // HERE TRUE
            $this->log(modX::LOG_LEVEL_ERROR, 'Could not prepare context: ' . $contextKey);
        } else {
            if ($this->context->checkPolicy('load')) { // HERE FALSE - MODX CAN'T DO IT
                // .. SOME OTHER modX CODE

所以在那之后我停下来翻找核心。可能有人已经看到类似的东西或知道 modx Revo 核心很好地回答为什么 modx 在用户登录时无法切换上下文?

附:我尝试为上下文切换插件使用另一个事件 - 但当然这个事件对于插件来说是最正确的。而且我强调 modx 不能仅在用户登录时切换上下文!

更新

我尝试编辑一些权限。但是什么都没有发生(我清除了现金并重新登录了所有用户)。这是上下文权限的截图(对不起,非英语,但应该很清楚):

更新 2 权限错误:它们必须全部为 9999 和“list, veiw, load”。但与此同时,当我处于第二个上下文时,我无法登录,就像以前一样。现在我试图找出是不是同样的问题。

更新 3 登录的第二个问题很容易解决:在 sn-p 参数中应该有 &contexts=web,eng

【问题讨论】:

    标签: modx modx-revolution


    【解决方案1】:

    但是 $this->context->checkPolicy('load') 返回 false(在同一文件的 2169 行附近)。

    嗯,这就是你的答案!用户至少需要上下文的“加载”权限才能切换到它。

    转到安全> 访问策略> 右键单击​​用户组并选择更新它。在上下文访问选项卡中,确保所有面向前端的上下文都列在那里,最好是“加载、列表和查看”访问策略。可能希望首先对管理员用户组执行此操作,以防止自己被锁定,以及用于未登录用户的(匿名)组。

    我认为,虽然没有看到更多关于您的特定设置的信息,但不能 100% 确定,但您没有授予用户组访问第二个上下文的权限,这可以解释为什么它对匿名用户有效。

    【讨论】:

    • 谢谢!但它似乎不起作用,或者我做错了什么。这是上下文编辑表单的屏幕(对不起,非英语界面,但应该很清楚):habrastorage.org/storage2/19e/7c9/d17/…
    • 您已将“用户”组的排名(第三列)设置为 0,这是最高的(我知道,这听起来像是世界颠倒了)所以您的用户很可能没有在用户组中没有那么高的排名。除非您在用户组中使用不同的角色,否则我建议您保持简单并将所有权限的等级设为 9999,这是最低的。
    • 非常感谢。现在,如果我在一个上下文中登录并切换语言,它就可以工作了。但是当我尝试登录“eng”时。上下文没有任何反应。可能是同样的问题,我可能不是 - 当权限错误时我也无法登录。
    • 在您的登录 sn-p 中确保设置 &contexts=web,eng 以便它立即将您登录到两个上下文。如果上下文位于不同的(子)域上,则用户可能不会首先共享会话并将其视为匿名用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多