Вывод списка всех контекстов в каждом из них (проблема)

Есть 4 контекста, условно:
1) site.ru
2) name1.site.ru
3) name2.site.ru
4) name3.site.ru

Все http_host и прочее прописаны у каждого. Вручную каждый открывается без проблем.
Вывожу их в список, чтобы переключаться между ними во фронте переадресацией.

И начинаются чудеса:
В контекстах 1 и 2 показываются в списке только они, а 3 и 4 вообще не выводятся.
В 3 контексте видны 1, 2, 3.
В 4 контексте в списке видны 1, 2, 3, 4.

Это как?

Сниппет, отвечающий за вывод:
<?php
$output = null;

switch ($scriptProperties['type']){
    default:
    case 'list':
        $contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
        
        foreach($contexts as $cx) {
            if($cx->prepare()){
                $data = array(
                    'key' => $cx->key,
                    'name' => ($cx->key != "web")?$cx->name:"Главная страница",
                    'url' => $cx->config['site_url'],
                );

                $output .= $modx->getChunk($scriptProperties['tpl'], array('data' => $data));
            }
        }
    break;
    case 'city':
        if ($modx->context->key == 'web') $output = 'Выберите город';
        else {
            $ctx = $modx->getObject('modContext', array('key' => $modx->context->key));
            $output = $ctx->get('name');
        }
    break;
}

return $output;
UPD1: Косяк с контекстами 3 и 4: под анонимом не открываются, 404 вместо главной. Права в админке выставлены на группу для этих контекстов. Скидываешь кеш, открываешь — все работает. Не понимаю…
Альберт
26 ноября 2018, 23:50
modx.pro
1
1 340
0

Комментарии: 23

Сергей Шлоков
27 ноября 2018, 08:28
-1
Так бывает, когда верстальщик думает, что он и программировать умеет. Претензий нет только к первым двум строчкам и последней.
    Альберт
    27 ноября 2018, 09:27
    -1
    Благодарю за содержательный комментарий, он очень помог.
      Сергей Шлоков
      27 ноября 2018, 09:34
      -1
      Рад, что помог.

      П.С. Зеркально отвечаю на любезность минусом.
        Альберт
        27 ноября 2018, 09:35
        -1
        Ну вот вам реально заняться нечем?
    Павел Гвоздь
    27 ноября 2018, 09:28
    0
    • А зачем
      $cx->prepare()
      ?
    • Не знаю, правильно ли так
      'url' => $cx->config['site_url'],
      , но я бы сделал так
      'url' => $cx->getOption('site_url'),
      Альберт
      27 ноября 2018, 09:34
      0
      Все равно в данном случае это на результат никак не влияет )
        Павел Гвоздь
        27 ноября 2018, 09:35
        0
        Что «это»? Оба пункта? Вы проверили?
          Альберт
          27 ноября 2018, 09:37
          0
          Естессно.
            Павел Гвоздь
            27 ноября 2018, 09:41
            0
            Значит с правами повозись, ибо у меня вот этот код
            $contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
            foreach ($contexts as $c) {
                $data = array(
                    'key' => $c->key,
                    'name' => ($c->key != "web") ? $c->name : "Главная страница",
                    'url' => $c->getOption('site_url'),
                );
                print_r($data);
            }
            из под админа в Console отрабатывает корректно.
              Альберт
              27 ноября 2018, 09:42
              0
              Проблема в том, что в консоли я уже проверял и тоже отрабатывает отлично. А вот на фронте какие-то косяки с контекстами, у которых вообще все одинаково создавалось.
                Павел Гвоздь
                27 ноября 2018, 09:45
                0
                Говорю же, ковыряй в сторону прав доступа. Скорее всего там затык.
                  Альберт
                  27 ноября 2018, 10:29
                  0
                  В общем, все права были на месте, все специально перепроверил несколько раз.

                  Проблема решилась – просто накатил поверх ту же версию modx и обновил.
                    Павел Гвоздь
                    27 ноября 2018, 10:32
                    0
                    Странный способ решать проблемы… на мой взгляд, лучше не править исходники ядра, проблем меньше будет.
                      Альберт
                      27 ноября 2018, 10:33
                      0
                      Так они и не трогались.
                        Павел Гвоздь
                        27 ноября 2018, 10:35
                        0
                        А почему тогда после обновления ядра всё встало на свои места?
                        Альберт
                        27 ноября 2018, 10:37
                        0
                        Если б я знал ответ на этот вопрос, то и всей проблемы вместе с этой темой бы не было ) Ну вот так: никто ничего не трогал, куда не надо не лез, а косяк был.
                        Павел Гвоздь
                        27 ноября 2018, 10:44
                        0
                        У меня раньше тоже происходила такая «магия», когда не понимал, как это работает…
                        У тебя проблема была либо с правами, либо с исходником ядра. Возможно, ты просто не скидывал сессии после внесения правок в права.
                        Управление => Перезагрузить права доступа
                        Управление => Завершить все сеансы
                        Альберт
                        27 ноября 2018, 10:45
                        0
                        Ну уж, наверное, я в курсе про права доступа, сессии и подобное ) Спасибо за помощь!
              Евгений
              22 февраля 2019, 11:10
              0
              Добрый день! Если еще есть тут кто живой!
              У меня этот код из топика выше выводит одинаковые адреса:
              Array
              (
                  [key] => en
                  [url] => http://site1.ru
              )
              Array
              (
                  [key] => web
                  [url] => http://site1.ru
              )
              Хотя в настройках контекстов все прописано правильно?
              en — site1.ru, web — site2.ru.
              Может подскажите где искать?
                Альберт
                22 февраля 2019, 13:29
                0
                Добрый день!
                Все правильно — это «site_url» в контекстах указан?
                  Евгений
                  22 февраля 2019, 13:39
                  0
                  Да, добавил $cx->prepare() стало выводиться номально…
                  Благодарю…
        Сергей Шлоков
        27 ноября 2018, 10:43
        0
        А зачем
        $cx->prepare()
        Чтобы набить config контекста. И так для каждого запроса. Оптимизируется банальным джойном (желательно с кэшированием).

        но я бы сделал так
        'url' => $cx->getOption('site_url'),
        Не обязательно, если не нужно дефолтное значение, config — публичное свойство.

        Кроме того, не вижу необходимости дёргать чанк ради какого-нибудь <a ....>Контекст.

        Судя по всему не настроены права load для анонимов.

        Что происходит в последнем кейсе? Получается объект контекста текущего контекста!

        Ну и вообще весь свитч выглядит как
        else {} if () {}
        Не удивлюсь, если ещё и сниппет кэшированный.
          Альберт
          27 ноября 2018, 10:55
          0
          Последний кейс поправлен, там какая-то дичь была.

          Сниппет был не кешированный. Проблема почему-то решилась апдейтом ядра.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        23