2012-03-18 2 views
2

Я использую 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, однако это должно быть ясно): enter image description here

UPDATE 2 разрешения ошибались: они должны быть все 9999 и «список, Вей, нагрузка». Но в то же время я не могу войти в систему, пока я во втором контексте, как раньше, не мог. Теперь я попытался выяснить, это одна и та же проблема или нет.

UPDATE 3 Вторая проблема с Логин очень легко solvineg: во фрагменте кода Params должны быть & контексты = web,eng

ответ

2

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

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

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

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

+0

Спасибо!Но, похоже, он не работает, или я делаю что-то неправильно. Вот экран из формы редактирования контекста (извините за неэнглистический интерфейс, однако это должно быть ясно): http://habrastorage.org/storage2/19e/7c9/d17/19e7c9d1746481d7e17d4511147793d6.gif – Ist

+0

У вас есть ранг (третья колонка) установленный в 0 для группы «Пользователи», которая является самой высокой (это похоже на мир вверх ногами, я знаю), поэтому вероятность того, что ваш пользователь не имеет такого высокого ранга в группе пользователей. Если вы не используете разные роли в пользовательских goups, я бы посоветовал сохранить его простым и дать все разрешения в ранге 9999, что является самым низким. –

+0

Большое спасибо. Теперь он работает, если я вхожу в систему в одном контексте и переключаю язык. Но когда я собираюсь войти на «eng». контекста ничего не происходит. Может быть, это одна и та же проблема, а не - когда права были неправильными, я тоже не мог войти в систему. – Ist