Как вывести на сайте ссылки на контексты (поддомены) и сделать навигацию в виде меню?

Здравствуйте!
На сайте есть контексты «Города» (поддомены) каким образом без прописывания вручную, можно сделать навигицию по ним в виде списка?
Leo
Leo
26 декабря 2023, 15:07
modx.pro

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

Артур Шевченко
26 декабря 2023, 22:49
0
Написать сниппет, который соберёт все контексты из БД и выведет их списком ссылок
    vectorserver
    27 декабря 2023, 06:48
    +2
    Типо того:
    <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>
      Leo
      Leo
      27 декабря 2023, 12:44
      0
      Спасибо! Почти получилось, выводит названия всех контекстов, но вот урлы ведут на корень — главный контекст web
      Leo
      Leo
      19 февраля 2025, 10:17
      0
      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;
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        4