Вывод списка всех контекстов в каждом из них (проблема)
Есть 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.
Это как?
Сниппет, отвечающий за вывод:
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 вместо главной. Права в админке выставлены на группу для этих контекстов. Скидываешь кеш, открываешь — все работает. Не понимаю… Комментарии: 23
Так бывает, когда верстальщик думает, что он и программировать умеет. Претензий нет только к первым двум строчкам и последней.
Благодарю за содержательный комментарий, он очень помог.
Рад, что помог.
П.С. Зеркально отвечаю на любезность минусом.
П.С. Зеркально отвечаю на любезность минусом.
Ну вот вам реально заняться нечем?
- А зачем
?$cx->prepare()
- Не знаю, правильно ли так
, но я бы сделал так'url' => $cx->config['site_url'],
'url' => $cx->getOption('site_url'),
Все равно в данном случае это на результат никак не влияет )
Что «это»? Оба пункта? Вы проверили?
Естессно.
Значит с правами повозись, ибо у меня вот этот код
$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 отрабатывает корректно.
Проблема в том, что в консоли я уже проверял и тоже отрабатывает отлично. А вот на фронте какие-то косяки с контекстами, у которых вообще все одинаково создавалось.
Говорю же, ковыряй в сторону прав доступа. Скорее всего там затык.
В общем, все права были на месте, все специально перепроверил несколько раз.
Проблема решилась – просто накатил поверх ту же версию modx и обновил.
Проблема решилась – просто накатил поверх ту же версию modx и обновил.
Странный способ решать проблемы… на мой взгляд, лучше не править исходники ядра, проблем меньше будет.
Так они и не трогались.
А почему тогда после обновления ядра всё встало на свои места?
Если б я знал ответ на этот вопрос, то и всей проблемы вместе с этой темой бы не было ) Ну вот так: никто ничего не трогал, куда не надо не лез, а косяк был.
У меня раньше тоже происходила такая «магия», когда не понимал, как это работает…
У тебя проблема была либо с правами, либо с исходником ядра. Возможно, ты просто не скидывал сессии после внесения правок в права.
Управление => Перезагрузить права доступа
Управление => Завершить все сеансы
У тебя проблема была либо с правами, либо с исходником ядра. Возможно, ты просто не скидывал сессии после внесения правок в права.
Управление => Перезагрузить права доступа
Управление => Завершить все сеансы
Ну уж, наверное, я в курсе про права доступа, сессии и подобное ) Спасибо за помощь!
Добрый день! Если еще есть тут кто живой!
У меня этот код из топика выше выводит одинаковые адреса:
en — site1.ru, web — site2.ru.
Может подскажите где искать?
У меня этот код из топика выше выводит одинаковые адреса:
Array
(
[key] => en
[url] => http://site1.ru
)
Array
(
[key] => web
[url] => http://site1.ru
)
Хотя в настройках контекстов все прописано правильно? en — site1.ru, web — site2.ru.
Может подскажите где искать?
Добрый день!
Все правильно — это «site_url» в контекстах указан?
Все правильно — это «site_url» в контекстах указан?
Да, добавил $cx->prepare() стало выводиться номально…
Благодарю…
Благодарю…
А зачемЧтобы набить config контекста. И так для каждого запроса. Оптимизируется банальным джойном (желательно с кэшированием).
$cx->prepare()
но я бы сделал такНе обязательно, если не нужно дефолтное значение, config — публичное свойство.
'url' => $cx->getOption('site_url'),
Кроме того, не вижу необходимости дёргать чанк ради какого-нибудь <a ....>Контекст.
Судя по всему не настроены права load для анонимов.
Что происходит в последнем кейсе? Получается объект контекста текущего контекста!
Ну и вообще весь свитч выглядит как
else {} if () {}
Не удивлюсь, если ещё и сниппет кэшированный.
Последний кейс поправлен, там какая-то дичь была.
Сниппет был не кешированный. Проблема почему-то решилась апдейтом ядра.
Сниппет был не кешированный. Проблема почему-то решилась апдейтом ядра.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.