Я использую modX Revo с плагинами Login и Babel. Как было написано в руководстве Babel, я сделал два контекста для двух языков, использовал параметры ТВ и написал contextSwitch-плагин. В основном это похоже на плагин из примера в руководстве. После этого я добавляю плагин в событие HandleRequest.ModX Revolution не переключает контекст
Все работает, за исключением контекста переключения после входа в систему: если пользователь авторизован, modX отображает только главную страницу, остальные страницы 404. Я попытался рыться в коде и выяснил, что метод switchContext модели modx (строка 1843 из /core/model/modx/modx.class.php) возвращает 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
Так что после этого я прекратил рыться в ядре. Может быть, кто-то уже видел что-то вроде этого или знает модно Revo Core, чтобы ответить, почему modx не может переключать контекст при входе пользователя в систему?
P.s. Я попытался использовать другое событие для плагина переключения контекста, но, конечно, это событие является наиболее правильным для плагина. И я подчеркиваю, что modx не может переключать контекст только во время входа пользователя в систему!
UPDATE
Я попытался изменить некоторые разрешения. Но ничего не случилось (я очистил наличные деньги и перепробовал всех пользователей). Вот Screeshot разрешений контекста (извините за nonEnglish, однако это должно быть ясно):
UPDATE 2 разрешения ошибались: они должны быть все 9999 и «список, Вей, нагрузка». Но в то же время я не могу войти в систему, пока я во втором контексте, как раньше, не мог. Теперь я попытался выяснить, это одна и та же проблема или нет.
UPDATE 3 Вторая проблема с Логин очень легко solvineg: во фрагменте кода Params должны быть & контексты = web,eng
Спасибо!Но, похоже, он не работает, или я делаю что-то неправильно. Вот экран из формы редактирования контекста (извините за неэнглистический интерфейс, однако это должно быть ясно): http://habrastorage.org/storage2/19e/7c9/d17/19e7c9d1746481d7e17d4511147793d6.gif – Ist
У вас есть ранг (третья колонка) установленный в 0 для группы «Пользователи», которая является самой высокой (это похоже на мир вверх ногами, я знаю), поэтому вероятность того, что ваш пользователь не имеет такого высокого ранга в группе пользователей. Если вы не используете разные роли в пользовательских goups, я бы посоветовал сохранить его простым и дать все разрешения в ранге 9999, что является самым низким. –
Большое спасибо. Теперь он работает, если я вхожу в систему в одном контексте и переключаю язык. Но когда я собираюсь войти на «eng». контекста ничего не происходит. Может быть, это одна и та же проблема, а не - когда права были неправильными, я тоже не мог войти в систему. – Ist