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

Дополнение: pdoTools

Обертка 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 august 2016, 09:55    Даниил   G+  
0    680 -1

Comments (29)

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

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

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

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

        Написать какой-ньть сниппет, который надергает этих id в нужной последовательности мне не проблема, а вот как скормить этот список pdoШным сниппетам — не могу врубиться((
        1. Марат Марабар 11 august 2016, 17:39 # 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`
              ]]
          
          1. Даниил 11 august 2016, 18:05 # 0
            Благодарю за попытку помочь!!! К сожалению тоже не верно выводит.
            На выходе абсолютно такая же картина как у меня с оберткой в pdoPage и параметром &sortby=`{«menuindex»:«ASC»} (см. ранее прикрепленную картинку)
            1. Марат Марабар 11 august 2016, 18:20 # 0
              Не-не — не правильно написал, сходу)). Да ещё и с ошибками.
              Замени три строчки на эти
              &sortdir=`asc`
              &innerJoin=`{ "Parent": { "class":"modResource", "alias":"Parent", "on":"modResource.parent = Parent.id" } }`
              &sortby=`Parent.menuindex ASC,modResource.menuindex`
              
              У себя проверил — работает.
              1. Даниил 11 august 2016, 18:40 # 0
                А у меня достаточно странное поведение. Порядок товаров — вроде везде верный и они не скачут. С категориями глюки!
                Если лимит 20 — то все категории скапливаются в конце, на самой последней странице пагинации. Если ставлю достаточно большой лимит, 100-200, например, то все норм, располагаются там, где им и положено. Если плавно опускаю значение, например 60-50 делаю, то все, уже позиции слетают — чем ниже число лимита, тем больше категорий, начиная с начала списка, из положенных мест перепрыгивают в конец.

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

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

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

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

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

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

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

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