Различная сортировка в различных подуровнях

Здравствуйте.

Могу ли я сортировать документы в выводе pdoMenu таким образом, чтобы первый уровень сортировался по menuindex, второй по pagetitle, а третий, например, по publishedon?

Я пытался это сделать вызовом чанка в чанке, но в таком случае не работает важный для меня параметр &hideSubMenus=`1` и мне выдаётся полное дерево документов.
Евгений
12 июня 2014, 02:39
modx.pro
2 558
0

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

Василий Наумкин
12 июня 2014, 07:07
0
Одним вызовом — нет, нельзя.

hideSubMenus при вызове в чанках можно сэмулировать своим сниппетом, который будет определять текущую ветку документов и или запускать pdoMenu, или нет.
    Евгений
    12 июня 2014, 07:09
    0
    Ок, спасибо. Написание сниппета я не осилю, поэтому пойду в раздел «Работа» и попробую заказать у кого-нибудь.
      Василий Наумкин
      12 июня 2014, 07:16
      0
      Примерный сниппет checkParent (не проверял)
      <?php
      // Получаем всех родителей от указанного id
      $parents = $modx->getParentsIds($id);
      
      // Проверяем, есть ли в них текущий документ MODX
      if (in_array($modx->resource->id, $parents) {
      	// Если есть - это активная ветка, вызываем pdoMenu
      	return $modx->runSnippet('pdoMenu', array(
      		'parents' => $id,
      		// Другие параметры
      	));
      }
      // Если нет - отдаём ссылку на пункт меню
      else {
      	return "<li><a href="[[~[[+$id]]]]">$menutitle</a></li>"
      }

      Вызов в чанке основного pdoMenu, вместо [[+wrapper]]:
      [[!checkParent?
      	&id=`[[+id]]`
      	&menutitle=`[[+menutitle]]`
      ]]

      Нужно проверять и доделывать, но направление примерно такое.
        Евгений
        12 июня 2014, 07:44
        0
        Пробую писать сам, пока никто не откликается. При вот таком запросе (я поправил ваш по мелочи):
        <?php
        $parents = $modx->getParentsIds($id);
        
        if (in_array($modx->resource->id, $parents)) 
        {
            return $modx->runSnippet('pdoMenu', array('parents' => $id));
        }else {
        	return "<a href='[[~[[+$id]]]]'>$menutitle</a>";
        }
        ?>
        Ругается на то, что Call to undefined method modX::getParentsIds().
          Василий Наумкин
          12 июня 2014, 08:24
          0
          Это я ошибся, должно быть getParentIds

          ?> в сниппетах не не нужно — PSR-2, пункт 2.2
            Евгений
            12 июня 2014, 08:39
            0
            Ясно. Заработало. URL не генерируется.

            [2014-06-12 08:37:53] (ERROR @ /index.php) `[[+948]]` is not a valid integer and may not be passed to makeUrl()
            Как я понимаю, ругается на [[~[[+$id]]]]
              Василий Наумкин
              12 июня 2014, 08:45
              0
              Угу, тогда сделай чуть длиннее, но правильнее:
              $url = $modx->makeUrl($id, $modx->context->key, '', $modx->getOption('link_tag_scheme', null, '-1'));
              return "<a href=\"$url\">$menutitle</a>";
                Евгений
                12 июня 2014, 09:21
                0
                Делаю вот так: вызываю в шаблоне pdoMenu:
                [[pdoMenu?
                    &parents=`5`
                    &level=`4`
                    &hideSubMenus=`1`
                    &tpl=`menu.UL`
                ]]
                В чанке menu.UL лежит вот такая простенькая конструкция:
                <li[[+classes]]>
                    [[!checkParent?
                    	&id=`[[+id]]`
                    	&menutitle=`[[+menutitle]]`
                    ]]
                </li>
                И всё это хозяйство вместе вызывает ваш сниппет:
                <?php
                $parents = $modx->getParentIds($id);
                
                if (in_array($modx->resource->id, $parents)) 
                {
                    return $modx->runSnippet('pdoMenu', array('parents' => $id));
                }else {
                    $url = $modx->makeUrl($id, $modx->context->key, '', $modx->getOption('link_tag_scheme', null, '-1'));
                	return "<a href=\"$url\">$menutitle</a>";
                }
                Возвращает только первый, верхний уровень меню.
                  Василий Наумкин
                  12 июня 2014, 09:25
                  0
                  Я подсказал общее направление, дальше сам разбирайся.

                  У меня, извини, времени нет дальше помогать.
                    Евгений
                    12 июня 2014, 09:25
                    0
                    Спасибо. Попробую.
    Mr. Z
    23 июня 2015, 21:00
    0
    Добрый день,
    Пытаюсь сделать многоуровневое выпадающее меню и при этом очень хочется обойтись без тяжёлых фреймворков и jQuery.

    Суть такая: Есть меню вида:
    Пункт1---Пункт2----------------Пункт3------Пункт4 (ссылка).
    Под1------Под1-------------------Под1
    Под2------Под1.1 Под1.2-------Под2
    Под3------Под2
    -------------Под2.1

    Пытался сделать двумя способами:
    1.
    [[pdoMenu?
    	&parents=`0`
    	&level=`1`
    	&levelClass=`subLevel`
    	&tplOuter=`@INLINE <div class="divLB iMenuFrame [[+classnames]]">[[+wrapper]]</div>`
    	&tplInner=`@INLINE <div class="[[+classnames]]">[[+wrapper]]</div>`
    	&tpl=`@INLINE <div class="[[+classnames]]"><a href="[[+link]]">[[+menutitle]]</a>[[+wrapper]]</div>`
    ]]
    Всё выводит как надо, через систему subLevel1,2,3 стилей могу всё форматировать, но не могу задать свойство onClick только первому уровню, чтобы можно было прятать ветку меню. Если задаю, то прячутся все tplParentRow.

    2.
    [[pdoMenu?
    	&parents=`0`
    	&level=`1`
    	&levelClass=`subLevel`
    	&tplOuter=`@INLINE <div class="divLB iMenuFrame [[+classnames]]">[[+wrapper]]</div>`
    	&tplInner=`@INLINE <div class="[[+classnames]]">[[+wrapper]]</div>`
    	&tpl=`@INLINE <div class="[[+classnames]]"><a href="[[+link]]">[[+menutitle]]</a>id:[[+id]]
    	[[pdoMenu?
    		&parents=`[[+id]]`
    		&level=`2`
    		&tpl=`@INLINE <div>[[+id]]<a href="[[+link]]">[[+menutitle]]</a></div>`
    	]]</div>`
    ]]
    Оно бы и решило мне большую часть вопросов, но во вложенное меню не передаётся значение текущего [[+id]].

    Как быть? Очень хотелось бы RTFM, но где он этот FM?
    Подмывает плюнуть на всё и написать свой сниппет для меню, но хотелось как-то стандартными средствами эту проблему решить.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      11