我正在使用带插件Login和Babel的modX Revo。正如在Babel手册中写道的那样,我为两种语言制作了2个上下文,使用了电视参数并编写了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在用户登录时无法切换上下文?
P.S。我尝试将另一个事件用于上下文切换插件 - 但当然这个事件对于插件来说是最正确的。而且我正在强调modx只能在用户登录时切换上下文!
更新
我尝试编辑一些权限。但没有任何事情发生(我清理现金并重新安置所有用户)。这里是上下文权限的焦点(抱歉非英语,但应该很清楚):
更新2 权限是错误的:它们必须全部为9999并且“list,veiw,load”。但同时我无法登录,而我在第二个环境中,就像以前一样,我无法登录。现在我试着找出是否是同样的问题。
更新3
登录的第二个问题是solvineg非常简单:在代码段params中应该有& contexts = web,eng
答案 0 :(得分:2)
但是$ this-> context-> checkPolicy('load')返回false(在同一文件的2169行附近)。
嗯,这是你的答案!用户至少需要上下文的“加载”权限才能切换到它。
转到安全>访问政策>右键单击用户组并选择更新它。在Context Access选项卡中,确保所有面向前端的上下文都列在那里,最好是“Load,List& View”访问策略。可能希望首先为管理员用户组执行此操作以防止自己被锁定,以及用于未登录用户的(匿名)组。
我认为,虽然不是100%肯定而没有看到更多关于您的特定设置,但您没有让用户组访问第二个上下文,这可以解释为什么它对匿名用户有效。