Как вывести на сайте ссылки на контексты (поддомены) и сделать навигацию в виде меню?
Здравствуйте!
На сайте есть контексты «Города» (поддомены) каким образом без прописывания вручную, можно сделать навигицию по ним в виде списка?
На сайте есть контексты «Города» (поддомены) каким образом без прописывания вручную, можно сделать навигицию по ним в виде списка?
Комментарии: 4
Написать сниппет, который соберёт все контексты из БД и выведет их списком ссылок
Типо того:
<ul>
<?php
$contexts = $modx->getCollection('modContext', array('key:NOT IN' => array('mgr')));
foreach ($contexts as $context) {
$contextName = $context->get('key');
$contextUrl = $modx->makeUrl('[[*id]]', '', $contextName);
echo "<li><a href='{$contextUrl}'>{$contextName}</a></li>";
}
?>
</ul>
Спасибо! Почти получилось, выводит названия всех контекстов, но вот урлы ведут на корень — главный контекст web
UPD: Рабочий вариант — сниппет для вывода списка контекстов, может кому то пригодиться
<?php
$contexts = $modx->getCollection('modContext', ['key:NOT IN' => ['mgr']]); // Исключаем админский контекст
$list = [];
foreach ($contexts as $context) {
$contextKey = $context->get('key');
// Получаем название контекста из самого объекта modContext (а не из modContextSetting!)
$contextName = $context->get('name');
// Получаем настройки контекста (чтобы достать site_url)
$contextSettings = $modx->getCollection('modContextSetting', ['context_key' => $contextKey]);
$settings = [];
foreach ($contextSettings as $setting) {
$settings[$setting->get('key')] = $setting->get('value');
}
// Получаем URL (если не задан - пропускаем контекст)
$siteUrl = isset($settings['site_url']) ? $settings['site_url'] : '';
if (empty($siteUrl) || empty($contextName)) {
continue;
}
$list[] = ['name' => $contextName, 'url' => $siteUrl];
}
// Сортируем список по названию
usort($list, function ($a, $b) {
return strcmp($a['name'], $b['name']);
});
// Получаем текущий контекст
$currentContextKey = $modx->context->get('key');
$currentContext = $modx->getObject('modContext', ['key' => $currentContextKey]);
// Получаем его название (из поля "Название" в админке)
$currentContextName = $currentContext ? $currentContext->get('name') : $currentContextKey;
// Получаем site_url текущего контекста
$currentSettings = $modx->getCollection('modContextSetting', ['context_key' => $currentContextKey]);
$currentSiteUrl = '';
foreach ($currentSettings as $setting) {
if ($setting->get('key') === 'site_url') {
$currentSiteUrl = $setting->get('value');
break;
}
}
// Вывод HTML
$output = 'Текущий город - <strong>' . htmlspecialchars($currentContextName) . '</strong>';
$output .= '<select onchange="window.location=this.value">';
$output .= '<option value="">Выберите город...</option>';
foreach ($list as $item) {
$selected = ($item['url'] == $currentSiteUrl) ? ' selected' : '';
$output .= '<option value="' . htmlspecialchars($item['url']) . '"' . $selected . '>' . htmlspecialchars($item['name']) . '</option>';
}
$output .= '</select>';
return $output;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.