ModX Revolution не переключает контекст - PullRequest
2 голосов
/ 18 марта 2012

Я использую modX Revo с плагинами Логин и Бабель .Как было написано в руководстве Babel, я сделал 2 контекста для двух языков, использовал телевизионные параметры и написал плагин contextSwitch.Это в основном как плагин из примера в руководстве.После этого я подключил плагин к событию HandleRequest.

Все работает, кроме переключения контекста после входа в систему: если пользователь авторизован, 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

Так что после этого я перестал рыться в ядре.Может быть, кто-то уже видел нечто подобное или знает, что ядро ​​modx Revo хорошо ответит, почему modx не может переключать контекст, когда пользователь вошел в систему?

Ps Я пытался использовать другое событие для плагина переключения контекста - но, конечно,это событие является наиболее правильным для плагина.И я подчеркиваю, что modx не может переключать контекст только тогда, когда пользователь вошел в систему!

ОБНОВЛЕНИЕ

Я попытался отредактировать некоторые разрешения.Но ничего не произошло (я снял деньги и переместил всех пользователей).Вот скриншот разрешений контекста (извините за неанглийский, однако это должно быть ясно): enter image description here

ОБНОВЛЕНИЕ 2 Разрешения были неправильными: они должны быть всеми 9999 и "список, видгруз ".Но в то же время я не могу войти, пока я нахожусь во втором контексте, как раньше, я не мог.Теперь я попытался выяснить, является ли это той же самой проблемой или нет.

ОБНОВЛЕНИЕ 3 Вторая проблема с входом в систему заключается в том, что solvineg очень прост: в параметрах сниппета должен быть & contexts = web,eng

1 Ответ

2 голосов
/ 18 марта 2012

, но $ this-> context-> checkPolicy ('load') возвращает false (около 2169 строки того же файла).

Хорошо, ваш ответ!Пользователю нужно как минимум разрешение «загрузить» для контекста, чтобы переключиться на него.

Перейдите в раздел Безопасность> Политики доступа> щелкните правой кнопкой мыши группу пользователей и выберите ее обновить.На вкладке «Доступ к контексту» убедитесь, что там перечислены все внешние интерфейсы, предпочтительно с политикой доступа «Загрузить, просмотреть и просмотреть».Возможно, сначала нужно сделать это для группы пользователей «Администратор», чтобы не допустить ее блокировки, а также для (анонимной) группы, которая используется для не авторизованных пользователей.

Я думаю, но не на 100%.конечно, не видя больше о вашей конкретной настройке, вы не дали группе пользователей доступ ко второму контексту, который объяснил бы, почему он работает для анонимных пользователей.

...