Меню для сайта на контекстах

Добрый день, коллеги)

Появился тут вопрос к которому пока не знаю как подступиться, решил попросить помощи.

Есть сайт на контекстах такой структуры:

d1.site.ru
	Первый раздел
		первый подраздел
		второй подраздел
	Второй раздел
	третий раздел

d2.site.ru
	Первый раздел
		первый подраздел
		второй подраздел
	Второй раздел
	третий раздел

и так далее
Как построить меню по такой конструкции вида

<ul>
<li>d1.site.ru
	<ul>
	<li>Первый раздел
		<ul>
		<li>первый подраздел</li>
		<li>второй подраздел</li>
		</ul>
	</li>
	<li>Второй раздел</li>
	<li>третий раздел</li>
	</ul>
</li>
<li>d2.site.ru
	<ul>
	<li>Первый раздел
		<ul>
		<li>первый подраздел</li>
		<li>второй подраздел</li>
		</ul>
	</li>
	<li>Второй раздел</li>
	<li>третий раздел</li>
	</ul>
</li>
и так далее
</ul>
Создать вот такое с виду не хитрое меню, но через контексты.
Буду признателен за помощь.
Ilya Ev
12 августа 2015, 13:27
modx.pro
1 907
0

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

Ilya Ev
12 августа 2015, 18:38
0
pdoMenu как я понимаю мне тут не поможет? так как сгруппировать по контексту оно не может, или я не прав.
    Илья Уткин
    13 августа 2015, 11:11
    0
    Надо писать свой небольшой сниппет. Типа такого

    $contexts = $modx->getCollection('modContext', array('key:!=' => 'mgr'));
    $output = '<ul>';
    foreach ($contexts as $ctx) {
      $output .= '<li>'.$ctx->get('key');
      $output .= $modx->runSnippet('pdoMenu', array('parents' => 0, 'context' => $ctx->get('key')));
      $output .= '</li>';
    }
    $output .= '</ul>';
      Ilya Ev
      13 августа 2015, 11:37
      0
      Круто, спасибо большое. Это то что нужно. Попробую разобраться что тут и как и подправить, если выйдет)
        Ilya Ev
        13 августа 2015, 12:09
        0
        Еще раз спасибо, но не подскажите еще один момент.

        А как вытащить из контекста в меню его имя и урл (site_name, site_url)

        что-то похожее получить
        $output .= '<li><a href="'.site_url.'"></a>".site_name';

        И ограничить не только по mgr но и web (array('key:!=' => 'mgr') как условие поменять)
          Илья Уткин
          13 августа 2015, 12:34
          0
          Название — это $ctx->get('name'), а URL как-то так можно получить:
          $setting = $modx->getObject('modContextSetting',
                     array('context_key' => $ctx->get('key'), 'key' => 'site_url'));
          $url = $setting->get('value');

          Только теперь скрипт будет тормозить при большом количестве контекстов. Лучше переписать его на PDO и использовать JOIN для получения site_url
            Илья Уткин
            13 августа 2015, 12:35
            0
            array('key:NOT IN' => array('mgr', 'web'))
              Ilya Ev
              13 августа 2015, 12:45
              0
              Спасибо, все супер, работает.

              Контекстов не много вроде штук 6-7, нагрузка не выросла сильно.

              Еще раз спасибо за помощь).

          Ilya Ev
          14 августа 2015, 12:03
          0
          Появилась еще одна проблемка, чтобы не плодить темы…

          Товары положенные в корзину на разных поддоменах не видны в основном домене.

          Т.е. если положить товар в dom1.site.ru то на странице товара site.ru/cart они не видны.
          в session_cookie_domain стоит основное имя сайта site.ru

          Можно это как-то поправить, или не вариант.
            Ilya Ev
            14 августа 2015, 13:30
            1
            +1
            о нашел вроде

            в файле

            core/components/minishop2/model/minishop2/mscarthandler.class.php
            сносим строчку

            ,'ctx' => $this->modx->context->get('key')
            Вроде работает, но это как я понимаю не очень хорошее решение)
              Василий Наумкин
              14 августа 2015, 14:03
              0
              Да.

              Хорошее решение — расширить класс корзины своим и заменить там методы, работающие с контекстами.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            10