MODX [[+revo]] - pdoPage ломает сортировку pdoMenu

Обертка pdoPage напрочь ломает сортировку, которая установлена в pdoMenu. Смотрите на прикрепленные изображения. Вот и как это понимать, какая логика? Это баг pdoTools или так должно быть? Уже сутки бьюсь, ничего не могу поделать :(


Вызов голого pdoMenu:
<div id='pricecat'>
<table cellpadding='0' width='100%' border='0'>
    [[!pdoMenu?
        &parents=`[[*id]]`
        &level=`2`
        &tplOuter=`@INLINE [[+wrapper]]`
        &tpl=`price_ul_li`
        &sortby=`{"menuindex":"ASC"  }`
        &tvPrefix=``
        &processTVs=`1`
        &includeTVs=`mainimg,price,priceopt,edizm`
    ]]
</table>
</div>

Вызов с оберткой в pdoPage:
<div id='pricecat'>
<table cellpadding='0' width='100%' border='0'>
    [[!pdoPage?
        &element=`pdoMenu`
        &limit=`20`
        &parents=`[[*id]]`
        &level=`2`
        &tplOuter=`@INLINE [[+wrapper]]`
        &tpl=`price_ul_li`
        &sortby=`{"menuindex":"ASC"  }`
        &tvPrefix=``
        &processTVs=`1`
        &includeTVs=`mainimg,price,priceopt,edizm`
    ]]
</table>
</div>

Чанк price_ul_li:
[[+template:is=`4`:then=`
    <tr id='titlecat' onclick='window.location.href="[[~[[+id]]]]"'>
        <td colspan='5' align='center'>
            <h4>[[+menutitle:default=`[[+pagetitle]]`]] [[+menuindex]]</h4>
        </td>
    </tr>   
`:else=`
    <tr onclick='window.location.href="[[~[[+id]]]]"'>
        <td width='2%'>[[+mainimg:is=``:then=``:else=`<img src='[[+mainimg:phpthumbon=`w=80&h=80`]]'>`]]</td>
        <td width='68%'>
            <h4>[[+pagetitle]] [[+menuindex]]</h4></td>
            [[+price:is=``:then=`<td>[[+nonal]]</td>`:else=`<td>[[+price]] руб.</td>`]]
            [[+priceopt:is=``:then=`<td></td>`:else=`<td>[[+priceopt]] руб.</td>`]]
            <td>[[+edizm]]</td>
    </tr> 
`]]
[[+wrapper]]

[[+menuindex]] вывожу только для теста. [[+wrapper]] можно и убрать, но к делу не относится. Уровень вложенности ресурсов абсолютно у всех тестируемых товаров и категорий одиноковый и выглядит как:
1. каталог => 2. категория => 3. товар. В вызовах сниппетов &parents=[[*id]] соответствует уровню 1.
Также тестировал с дефолтным pdoResources, эффект абсолютно аналогичный.

Может быть есть кто-то, кто с этим уже сталкивался и может подсказать решение или хотя бы направить в нужную сторону?
Даниил
11 августа 2016, 06:55
modx.pro
4 665
-1

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

Іван Клімчук
11 августа 2016, 11:30
+1
С pdoTools все в порядке, а вот с вашим кодом — нет. Если внимательно почитать документацию (один и два), то станет понятно, что для сортировки используется два параметра.
sortby — указывается поле в виде строки, по которому нужно сортировать
sortdir — указывается направление сортировки

sortby в pdoMenu по умолчанию равен 'menuindex' (что ожидаемо) и выглядит так, как будто все работает правильно, потому что ваш вариант просто игнорируется, как неправильный. pdoPage имеет свои значения по умолчанию, которые и применяет, ваши значения опять же игнорируются.

Должно быть так:
&sortby=`menuindex`
&sortdir=`ASC`
    mngatoff
    11 августа 2016, 12:14
    0
    Можно указывать JSON строку
    всё нормально с этим кодом. Опять-таки, если внимательно почитать ту самую документацию по тем самым ссылкам.
      Даниил
      11 августа 2016, 12:28
      0
      &sortby и строковое значение может принимать и JSON. Это я проверил, на изменение параметров отзывается в обоих случаях. Естественно я пробовал и просто строковые параметры &sortby=`menuindex`в связке с &sortdir=`ASC`. За столько то времени копания уж что только не перепробовал.

      Самое близкое кстати к тому, что надо было &sortby=`{«parent, menuindex»:«ASC»}`, а также &sortby=`{«menuindex»:«ASC»,«isfolder»:«DESC»}`, но все равно криво… В первом случае выравниваются как надо товары, но категории «кудыпопало», во втором случае категории становятся на место, а вот товары упорядочиваются не по индексу относительно категории в которой расположены, а относительно всего каталога.
        Іван Клімчук
        11 августа 2016, 12:31
        0
        menuindex сквозное поле для всех ресурсов на сайте независимо от типа ресурса и его вложенности, так что тут сложно что-то преложить, кроме как написать свой сниппет, который будет учитывать необходимую вам логику.
          Даниил
          11 августа 2016, 12:39
          0
          Неужели в сортировке невозможно указать такой параметр, который бы построил просто копию дерева ресурсов от указанного ID? Мне кажется полюбому должна быть такая возможность! А чего он без pdoPage тогда строит так как положено?
      Даниил
      11 августа 2016, 16:56
      0
      Кстати вполне помогла бы не только json-строка с правильным условием для сортировки, но и знание как отключить эту сортировку вообще и передать в pdoMenu или pdoResources просто список id ресурсов для вывода.

      Написать какой-ньть сниппет, который надергает этих id в нужной последовательности мне не проблема, а вот как скормить этот список pdoШным сниппетам — не могу врубиться((
        Марат Марабар
        11 августа 2016, 17:39
        1
        0
        Попробуй так
        [[!pdoPage?
                &element=`pdoMenu`
                &limit=`20`
                &parents=`[[*id]]`
                &level=`2`
                &tplOuter=`@INLINE [[+wrapper]]`
                &tpl=`price_ul_li`
                &sortdir=`asc`
        	&innerJoin=`{ "modResourse": { "class": "alias":"Parent", "on":"modResource.parent = modResource.id" } }`
        	&sortby=`modResource.menuindex ASC,modResource.menuindex`
                &tvPrefix=``
                &processTVs=`1`
                &includeTVs=`mainimg,price,priceopt,edizm`
            ]]
          Даниил
          11 августа 2016, 18:05
          0
          Благодарю за попытку помочь!!! К сожалению тоже не верно выводит.
          На выходе абсолютно такая же картина как у меня с оберткой в pdoPage и параметром &sortby=`{«menuindex»:«ASC»} (см. ранее прикрепленную картинку)
            Марат Марабар
            11 августа 2016, 18:20
            1
            0
            Не-не — не правильно написал, сходу)). Да ещё и с ошибками.
            Замени три строчки на эти
            &sortdir=`asc`
            &innerJoin=`{ "Parent": { "class":"modResource", "alias":"Parent", "on":"modResource.parent = Parent.id" } }`
            &sortby=`Parent.menuindex ASC,modResource.menuindex`
            У себя проверил — работает.
              Даниил
              11 августа 2016, 18:40
              0
              А у меня достаточно странное поведение. Порядок товаров — вроде везде верный и они не скачут. С категориями глюки!
              Если лимит 20 — то все категории скапливаются в конце, на самой последней странице пагинации. Если ставлю достаточно большой лимит, 100-200, например, то все норм, располагаются там, где им и положено. Если плавно опускаю значение, например 60-50 делаю, то все, уже позиции слетают — чем ниже число лимита, тем больше категорий, начиная с начала списка, из положенных мест перепрыгивают в конец.

              Глюк зависит, насколько я понял, от общего количества выбираемых ресурсов и от устанавливаемого лимита.

              ps: Почекал сейчас еще без обертки — оказывается тот же глюк, если задавать лимит на количество выводимых ресурсов. Таким образом именно pdoPage не при чем! Баги именно в pdoMenu / pdoResources… И я понял какие!!! Сортировка происходит с полной выборкой правильно потому, что имеются все необходимые элементы, которые потом расставляются по своим местам. А когда у нас лимит стаит, то и части элементов как бы нет, и сортируются только лишь оставшиеся. За счет этого выводы разные получаются с лимитом и без.
              Вот как бы так сделать, чтоб лимит был, но чтоб позиции оказались те же, как будто его нет?)
                Марат Марабар
                11 августа 2016, 18:54
                0
                Могу ошибиться, но лимит больше 100 нельзя выставить — или до ста, или 0 (ноль, чтобы вывести всё).
                Это не miniShop?
                  Даниил
                  11 августа 2016, 19:21
                  0
                  не, просто обычные ресурсы вытягиваю
                    Даниил
                    11 августа 2016, 19:25
                    0
                    Вроде любое число можно указать в лимите.
                  Даниил
                  11 августа 2016, 19:21
                  0
                  Это даже не глюк, а видимо непродуманность самих компонентов. Результатом работы указанных сниппетов являются одини и те же результаты, какую бы мы не указали сортировку! Т.е. они сначала вытягивают из MySQL базы некоторые данные, а уже потом расставляют по местам в соответствии с условиями сортировки. Соответственно при указании лимитов мы получаем верную сортировку только относительно того, что надергали, а не относительно всего указанного списка ресурсов.

                  Вот если бы оно выбирало изначально в последовательности, которая в сортировке задана, вот тогда бы все отлично было! Короче, надо чтоб автор доработал компоненты и по возможности разделил &sortby на что-то типо &sortbyBefore и &sortbyAfter… Ну либо не разделять, а сделать переключалку еще одним параметром, например &sqlSort=`1` или =`0` (1 — значения выбираются из базы в соответствии с условиями сортировки, а 0 — когда сортировка выборки отключена и значения сортируются уже после того как были получены).
                    Марат Марабар
                    11 августа 2016, 20:09
                    0
                    Всё там продумано — не нужно винить компонент на ровном месте. Я, выше. дал вполне рабочий вызов — проверен на рабочем сайте.
                    А товары как загружал? Catalogfilm, shopkeeper?
                      Даниил
                      11 августа 2016, 20:42
                      0
                      Я к Василию очень уважительно и почтительно отношусь и не в коем случае не виню! Я лишь указываю на конкретное неудобство и в надежде, что меня услышат, даю добрый совет по вполне полезному улучшению компонента.

                      Товары на этом сайте — просто обычные ресурсы (класс modResource) со своими TVэхами.
                        Даниил
                        11 августа 2016, 20:48
                        0
                        Я почему-то уверен на 99.9%, что я не ошибся предположив последовательность работы сниппетов pdoMenu и pdoResources. Так что думаю вышесказанное вполне обосновано, тем более что код который по идее должен был бы сработать у меня и отсортировать как мне нужно, все таки не сработал.

                        А можете гденьть пример показать, где у вас этот же вызов правильно выбирает все?
                          Илья Уткин
                          11 августа 2016, 21:34
                          0
                          Да, pdoMenu примерно так и работает — дерево строится уже после выборки. А в pdoResources список строится прямо на основе ответа от базы данных
                            Марат Марабар
                            15 августа 2016, 15:07
                            0
                            Если напишешь мне на marat@marabar.ru, дам ссылку где можно посмотреть.
                  Сергей Шлоков
                  11 августа 2016, 19:56
                  +4
                  Вот если бы я был программистом, я бы для начала включил showLog и посмотрел какой формируется sql запрос в том и в другом случае. Но я не программист, поэтому даже не знаю чем помочь.
                    TITAN-UZ
                    11 августа 2016, 20:46
                    -1
                    Сегей удали профил :D
                    PS: Я за баланс
                    Илья Уткин
                    11 августа 2016, 21:32
                    0
                    Во-первых, pdoMenu для этого не подходит. Этот сниппет строит дерево ресурсов. Я вообще считаю, что из этого сниппета надо напрочь удалить восприимчивость к параметрам &limit и &offset — сниппет не для вашей задачи.

                    Для вас решение будет состоять из двух частей — сначала выборка товаров (с постраничностью), а потом группировка по категориям (на каждой странице отдельно).

                    Если скинете доступ в личку, попробую чем-нибудь помочь за небольшое вознаграждение
                      Даниил
                      11 августа 2016, 21:43
                      0
                      Изначально лимиты отсутствовали. Сайт работал так уже около 3-4-х лет и все было отлично. Обертка из pdoPage была добавлена для того, чтобы разбить длинные списки товаров на подстраницы, а затем при скроллинге задействовать аяксовую возможность подгрузки содержимого последующих псевдостраниц
                        Илья Уткин
                        11 августа 2016, 21:46
                        0
                        Если так, то вторую часть нужно реализовывать на JS. У pdoPage есть коллбеки.
                          Даниил
                          11 августа 2016, 21:53
                          0
                          Я уже практически дописал компонент, который близок к функционалу того же getResource, только в порядке дерева ресурсов из админки выводит все. Скоро совсем надобность в решении вопроса отпадет.

                          Тем не менее, мне очень интересно было бы либо чтоб добавили функционал в pdoTools, о котором я выше писал, либо чтоб нашлась таки с имеющимся функционалом стопудовая возможность реализации порядка «как в дереве», но с лимитами и разбиениями на подстраницы.
                      Даниил
                      11 августа 2016, 21:47
                      0
                      Да мне за данную модернизацию на сайте всего 1тр клиент платит. Я думаю хоть какое-то более-менее пристойное вознаграждение из этой суммы уже совсем никак не получается :DDD
                        Илья Уткин
                        11 августа 2016, 21:50
                        0
                        Да там вряд ли сложно — на шоколадку переведёшь и ладно
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      29