Лимит вывода ресурсов в подкатегориях pdoMenu

Всем привет. Нужна помощь.
Как можно ограничить количество ресурсов в подкатегории. Чтоб выводилось по 2 ресурса в подкатегории. Вывод через Pdomenu.

Структура Сайта

Категория (id=1)
— Подкатегория 1
— Ресурс 1
— Ресурс 2
— Ресурс 3
— Ресурс 4
— Подкатегория 2
— Ресурс 1
— Ресурс 2
— Ресурс 3
— Ресурс 4
— Подкатегория 3
— Ресурс 1
— Ресурс 2
— Ресурс 3
— Ресурс 4

[[!pdoMenu?
  &parents=`1`
  &level=`1`
  &tplOuter=`@INLINE [[+wrapper]]`
  &tplInnerRow=`@INLINE <div><a href="[[+link]]">[[+menutitle]]</a></div>`
]]
если выставить &limit то ограничивается вывод всех ресурсов
Глеб
01 февраля 2016, 16:42
modx.pro
2
2 796
0

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

Максим Кузнецов
01 февраля 2016, 20:36
+1
В pdoMenu, скорее всего, такой функционал не предусмотрен (т.к. возникает сложность с последовательностью нумерации результатов) — т.е. даже модификаторы от [[+idx]] тут особо не помогут.

Если вопрос с меню косметического плана — то можно решить задачу при помощи jquery.

В противном случае разве что вызывать при помощи pdoResources первый уровень меню, а внутри при помощи него же — второй (с выставленным &limit). Или попробовать расписать составной джоин потомков к первому вызову.

UPD: …или же вообще сверстать все руками, без запросов к бд. А активный пункт присваивать уже при помощи Jquery.
    Глеб
    01 февраля 2016, 21:53
    0
    Хотелось бы максимально оптимизировать. Т.к как количество подкатегорий может меняться.
    Pdomenu не принципиально.
    Нужно вывести вот в таком формате prntscr.com/9xqji9

    Pdomenu взял, потому что там можно использовать tplStart

    В данный момент вот так, через снипет getChildIds получаю всех потомков категории, и вывожу их
    [[!pdoMenu?
      &parents=`[[!getChildIds]]`
      &level=`1`
      &displayStart=`1`
      &tplStart=`@INLINE <div><h3>[[+menutitle]]</h3><ul class="list">[[+wrapper]]</ul><div class="documents-list__all"><a class="documents-list__all-link btn btn_small" href="#">все документы</a></div></div>`
      &tplOuter=`@INLINE [[+wrapper]]`
      &tplInnerRow=`@INLINE <div><a href="[[+link]]">[[+menutitle]]</a></div>`
    ]]
    снипет getChildIds
    $child = $modx->getChildIds(8, 1, array('context' => 'web'));
    return implode(',',$child);
    всё бы хорошо, только ограничить вывод по 5 не знаю.
    Если подскажите лучше решение, как правильней или в какую сторону копать, буду очень признателен
      Владимир Бабусенко
      01 февраля 2016, 22:34
      0
      Возможно сделать такое на pdoMenu без стороних снипетов. Посмотри мою недавную тему, она очень похоже на твою, за исключением того, что мне подкатегории >3 нужно было оборачивать в див. В твоем случае просто ничего не выводить.
      modx.pro/help/7710/
      Возникнут вопросы пиши.
        Владимир Бабусенко
        01 февраля 2016, 23:38
        +1
        Вот навалял, Выводит категорию, подкатегорию и 3 ресурса
        [[!pdoMenu?
            &parents = `1`
            &level = `2`
            &displayStart = `1`
            &levelClass = `level`
            &firstClass =``
            &lastClass = ``
            
            &tplOuter = `@INLINE    <div class="out">[[+wrapper]]</div>`
            &tplParentRow = `@INLINE    <div class="block-cat">
                                                <p>[[+menutitle]]-Подкатегория</p>
                                            [[+wrapper]]
                                        </div>`
            &tplInner = `@INLINE    <div class="items">
                                        [[+wrapper]]
                                    </div>`
            &tplInnerRow =  `test`
           
        ]]
        Чанк «test», т.к. фильтры обязательно в чанк. В нем прописанно кол-во выводимых ресурсов, в данном случае 3.
        [[+classes:is=`class="level3"`:then=`
            [[+idx:islte=`3`:then=`
                <div><a href="">[[+menutitle]]-Ресурс</a></div>
            `]]
        `]]
          Глеб
          02 февраля 2016, 13:19
          0
          Спасибо
          Глеб
          03 февраля 2016, 13:45
          0
          [[+classes:is=`class="level3"`:then=`
              [[+idx:islte=`3`:then=`
                  <div><a href="">[[+menutitle]]-Ресурс</a></div>
              `]]
          `]]
          как это будет выглядеть на Fenom?
            Владимир Бабусенко
            03 февраля 2016, 14:09
            0
            Сорри, без понятия. Еще не сталкивался с fenom, времени небыло. Может кто знает ответит.
              Максим Кузнецов
              03 февраля 2016, 14:43
              +1
              {if $classes == 'class="level3"' && $idx <= 3}
              	<div><a href="">{$menutitle}-Ресурс</a></div>
              {/if}
                Владимир Бабусенко
                03 февраля 2016, 14:45
                0
                Это Глебу надо...., лучше ему ответить, так придет ему письмо об ответе.
                  Глеб
                  03 февраля 2016, 15:16
                  0
                  ничего не выводит(

                  {$_modx->runSnippet('pdoMenu', [
                      'parents' => 8,
                      'level' => 2,
                      'displayStart' => 1,
                      'levelClass' => 'level',
                      'firstClass' => '',
                      'firstClass' => '',
                      'tplStart' => '@INLINE  [[+wrapper]]',
                      'tplOuter' => '@INLINE  <div class="documents">[[+wrapper]]</div>',
                      'sortby' => 'publishedon',
                      'sortdir' => 'DESC',
                      'tplParentRow ' => '@INLINE
                      <li class="list-item documents-list__item">
                        <h3 class="documents-list__ttl h3">[[+menutitle]]</h3>
                        [[+wrapper]]
                        <div class="documents-list__all">
                          <a href="[[+link]]" class="documents-list__all-link btn btn_small">Все документы</a>
                        </div>
                      </li>',
                      'tplInner' => '@INLINE  <ul class="list documents-list">[[+wrapper]]</ul>',
                      'tplPath' => './assets/elements/tpl/',
                      'tplInnerRow' => '@FILE docs.tpl',
                  ])}
                  docs.tpl
                  {if $classes == 'class="level3"' && $idx <= 3}
                    <div><a href="">{$menutitle}-Ресурс</a></div>
                  {/if}
                    Максим Кузнецов
                    03 февраля 2016, 15:23
                    0
                    => Смотрим лог ошибок.
                      Глеб
                      03 февраля 2016, 15:29
                      0
                      Лог ошибок пуст

                      если
                      {if $classes == 'class="level3"' && $idx <= 3}
                        <div><a href="">{$menutitle}-Ресурс</a></div>
                        {else}
                        тест
                      {/if}
                      то выводит

                      тест тест тест тест тест
                      условие не срабатывает(
                        Максим Кузнецов
                        03 февраля 2016, 15:55
                        0
                        Попробуйте вызвать в чанке плейсхолдеры {$idx} и {$classes} и посмотреть, что они возвращают.

                        Скорее всего, idx всех ресурсов больше 3.
                          Глеб
                          03 февраля 2016, 16:04
                          0
                          вызвал так:

                          <li{$classes} id="idx-{$idx}">{$menutitle}</li>
                          получил вот так:

                          <ul class="list documents-list">
                            <li class="level2" id="idx-1">Документы федеральных органов</li>
                            <li class="level2" id="idx-2">Документы конференции</li>
                            <li class="level2" id="idx-3">Документы регионального совета</li>
                            <li class="level2" id="idx-4">Документы председателя</li>
                            <li class="last level2" id="idx-5">Пресс-релизы</li>
                          </ul>
                          Максим Кузнецов
                          03 февраля 2016, 16:05
                          +1
                          => проверка не проходит по условию
                          $classes == 'class="level3"'

                          — нужен не level3, а level2.

                          + в случай, если у вас в контейнере будет 3 или менее ресурса — последний пункт не будет проходить т.к. у него в классах будет висеть «last».
        Владимир Бабусенко
        01 февраля 2016, 22:36
        0
        Сорри, хотел ответить Максиму Кузнецову. Это для него.
        Почему? Можно например использовать &levelClass, и по нему определять какой уровень вложенности с помощью фильтров.
          Владимир Бабусенко
          01 февраля 2016, 23:54
          0
          Упс...)
          Глеб
          03 февраля 2016, 20:23
          0
          Вообщем сделал вот таким способом:

          {$_modx->runSnippet('pdoMenu', [
              'parents' => $_modx->runSnippet('getChildIds'),
              'level' => 2,
              'displayStart' => 1,
              'fenomModifiers'=>'dateAgo'
              'tplOuter' => '@INLINE
                <div class="documents">
                  <ul class="list documents-list">{$wrapper}</ul>
                </div>',
              'tplInner' => '@INLINE {$wrapper}',
              'tplStart' => '@INLINE
                <li class="list-item documents-list__item">
                  <h3 class="documents-list__ttl h3">{$menutitle}</h3>
                  <ul class="list list_marker-circle documents-list__sub-list">{$wrapper}</ul>
                  <div class="documents-list__all">
                    <a class="documents-list__all-link btn btn_small" href="{$link}">все документы</a>
                  </div>
                </li>',
              'tplInnerRow' => '@INLINE
              {if $idx <= 3}
                <li class="list-item documents-list__sub-item">
                  <a class="documents-list__item-link" href="[[+link]]">{$menutitle}</a>
                  <span class="documents-list__item-date">
                    <i class="icon icon-date"></i>
                    {$publishedon | dateago}
                  </span>
                </li>
              {/if}',
          ])}
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            19