MODX [[+revo]] - pdoPage ломает сортировку pdoMenu
Обертка pdoPage напрочь ломает сортировку, которая установлена в pdoMenu. Смотрите на прикрепленные изображения. Вот и как это понимать, какая логика? Это баг pdoTools или так должно быть? Уже сутки бьюсь, ничего не могу поделать :(
Вызов голого pdoMenu:
Вызов с оберткой в pdoPage:
Чанк price_ul_li:
[[+menuindex]] вывожу только для теста. [[+wrapper]] можно и убрать, но к делу не относится. Уровень вложенности ресурсов абсолютно у всех тестируемых товаров и категорий одиноковый и выглядит как:
1. каталог => 2. категория => 3. товар. В вызовах сниппетов &parents=[[*id]] соответствует уровню 1.
Также тестировал с дефолтным pdoResources, эффект абсолютно аналогичный.
Может быть есть кто-то, кто с этим уже сталкивался и может подсказать решение или хотя бы направить в нужную сторону?
Вызов голого 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, эффект абсолютно аналогичный.
Может быть есть кто-то, кто с этим уже сталкивался и может подсказать решение или хотя бы направить в нужную сторону?
Комментарии: 29
С pdoTools все в порядке, а вот с вашим кодом — нет. Если внимательно почитать документацию (один и два), то станет понятно, что для сортировки используется два параметра.
sortby — указывается поле в виде строки, по которому нужно сортировать
sortdir — указывается направление сортировки
sortby в pdoMenu по умолчанию равен 'menuindex' (что ожидаемо) и выглядит так, как будто все работает правильно, потому что ваш вариант просто игнорируется, как неправильный. pdoPage имеет свои значения по умолчанию, которые и применяет, ваши значения опять же игнорируются.
Должно быть так:
&sortby=`menuindex`
&sortdir=`ASC`
sortby — указывается поле в виде строки, по которому нужно сортировать
sortdir — указывается направление сортировки
sortby в pdoMenu по умолчанию равен 'menuindex' (что ожидаемо) и выглядит так, как будто все работает правильно, потому что ваш вариант просто игнорируется, как неправильный. pdoPage имеет свои значения по умолчанию, которые и применяет, ваши значения опять же игнорируются.
Должно быть так:
&sortby=`menuindex`
&sortdir=`ASC`
Можно указывать JSON строкувсё нормально с этим кодом. Опять-таки, если внимательно почитать ту самую документацию по тем самым ссылкам.
&sortby и строковое значение может принимать и JSON. Это я проверил, на изменение параметров отзывается в обоих случаях. Естественно я пробовал и просто строковые параметры &sortby=`menuindex`в связке с &sortdir=`ASC`. За столько то времени копания уж что только не перепробовал.
Самое близкое кстати к тому, что надо было &sortby=`{«parent, menuindex»:«ASC»}`, а также &sortby=`{«menuindex»:«ASC»,«isfolder»:«DESC»}`, но все равно криво… В первом случае выравниваются как надо товары, но категории «кудыпопало», во втором случае категории становятся на место, а вот товары упорядочиваются не по индексу относительно категории в которой расположены, а относительно всего каталога.
Самое близкое кстати к тому, что надо было &sortby=`{«parent, menuindex»:«ASC»}`, а также &sortby=`{«menuindex»:«ASC»,«isfolder»:«DESC»}`, но все равно криво… В первом случае выравниваются как надо товары, но категории «кудыпопало», во втором случае категории становятся на место, а вот товары упорядочиваются не по индексу относительно категории в которой расположены, а относительно всего каталога.
menuindex сквозное поле для всех ресурсов на сайте независимо от типа ресурса и его вложенности, так что тут сложно что-то преложить, кроме как написать свой сниппет, который будет учитывать необходимую вам логику.
Неужели в сортировке невозможно указать такой параметр, который бы построил просто копию дерева ресурсов от указанного ID? Мне кажется полюбому должна быть такая возможность! А чего он без pdoPage тогда строит так как положено?
Кстати вполне помогла бы не только json-строка с правильным условием для сортировки, но и знание как отключить эту сортировку вообще и передать в pdoMenu или pdoResources просто список id ресурсов для вывода.
Написать какой-ньть сниппет, который надергает этих id в нужной последовательности мне не проблема, а вот как скормить этот список pdoШным сниппетам — не могу врубиться((
Написать какой-ньть сниппет, который надергает этих id в нужной последовательности мне не проблема, а вот как скормить этот список pdoШным сниппетам — не могу врубиться((
Попробуй так
[[!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`
]]
Благодарю за попытку помочь!!! К сожалению тоже не верно выводит.
На выходе абсолютно такая же картина как у меня с оберткой в pdoPage и параметром &sortby=`{«menuindex»:«ASC»} (см. ранее прикрепленную картинку)
На выходе абсолютно такая же картина как у меня с оберткой в pdoPage и параметром &sortby=`{«menuindex»:«ASC»} (см. ранее прикрепленную картинку)
Не-не — не правильно написал, сходу)). Да ещё и с ошибками.
Замени три строчки на эти
Замени три строчки на эти
&sortdir=`asc`
&innerJoin=`{ "Parent": { "class":"modResource", "alias":"Parent", "on":"modResource.parent = Parent.id" } }`
&sortby=`Parent.menuindex ASC,modResource.menuindex`
У себя проверил — работает.
А у меня достаточно странное поведение. Порядок товаров — вроде везде верный и они не скачут. С категориями глюки!
Если лимит 20 — то все категории скапливаются в конце, на самой последней странице пагинации. Если ставлю достаточно большой лимит, 100-200, например, то все норм, располагаются там, где им и положено. Если плавно опускаю значение, например 60-50 делаю, то все, уже позиции слетают — чем ниже число лимита, тем больше категорий, начиная с начала списка, из положенных мест перепрыгивают в конец.
Глюк зависит, насколько я понял, от общего количества выбираемых ресурсов и от устанавливаемого лимита.
ps: Почекал сейчас еще без обертки — оказывается тот же глюк, если задавать лимит на количество выводимых ресурсов. Таким образом именно pdoPage не при чем! Баги именно в pdoMenu / pdoResources… И я понял какие!!! Сортировка происходит с полной выборкой правильно потому, что имеются все необходимые элементы, которые потом расставляются по своим местам. А когда у нас лимит стаит, то и части элементов как бы нет, и сортируются только лишь оставшиеся. За счет этого выводы разные получаются с лимитом и без.
Вот как бы так сделать, чтоб лимит был, но чтоб позиции оказались те же, как будто его нет?)
Если лимит 20 — то все категории скапливаются в конце, на самой последней странице пагинации. Если ставлю достаточно большой лимит, 100-200, например, то все норм, располагаются там, где им и положено. Если плавно опускаю значение, например 60-50 делаю, то все, уже позиции слетают — чем ниже число лимита, тем больше категорий, начиная с начала списка, из положенных мест перепрыгивают в конец.
Глюк зависит, насколько я понял, от общего количества выбираемых ресурсов и от устанавливаемого лимита.
ps: Почекал сейчас еще без обертки — оказывается тот же глюк, если задавать лимит на количество выводимых ресурсов. Таким образом именно pdoPage не при чем! Баги именно в pdoMenu / pdoResources… И я понял какие!!! Сортировка происходит с полной выборкой правильно потому, что имеются все необходимые элементы, которые потом расставляются по своим местам. А когда у нас лимит стаит, то и части элементов как бы нет, и сортируются только лишь оставшиеся. За счет этого выводы разные получаются с лимитом и без.
Вот как бы так сделать, чтоб лимит был, но чтоб позиции оказались те же, как будто его нет?)
Могу ошибиться, но лимит больше 100 нельзя выставить — или до ста, или 0 (ноль, чтобы вывести всё).
Это не miniShop?
Это не miniShop?
не, просто обычные ресурсы вытягиваю
Вроде любое число можно указать в лимите.
Это даже не глюк, а видимо непродуманность самих компонентов. Результатом работы указанных сниппетов являются одини и те же результаты, какую бы мы не указали сортировку! Т.е. они сначала вытягивают из MySQL базы некоторые данные, а уже потом расставляют по местам в соответствии с условиями сортировки. Соответственно при указании лимитов мы получаем верную сортировку только относительно того, что надергали, а не относительно всего указанного списка ресурсов.
Вот если бы оно выбирало изначально в последовательности, которая в сортировке задана, вот тогда бы все отлично было! Короче, надо чтоб автор доработал компоненты и по возможности разделил &sortby на что-то типо &sortbyBefore и &sortbyAfter… Ну либо не разделять, а сделать переключалку еще одним параметром, например &sqlSort=`1` или =`0` (1 — значения выбираются из базы в соответствии с условиями сортировки, а 0 — когда сортировка выборки отключена и значения сортируются уже после того как были получены).
Вот если бы оно выбирало изначально в последовательности, которая в сортировке задана, вот тогда бы все отлично было! Короче, надо чтоб автор доработал компоненты и по возможности разделил &sortby на что-то типо &sortbyBefore и &sortbyAfter… Ну либо не разделять, а сделать переключалку еще одним параметром, например &sqlSort=`1` или =`0` (1 — значения выбираются из базы в соответствии с условиями сортировки, а 0 — когда сортировка выборки отключена и значения сортируются уже после того как были получены).
Всё там продумано — не нужно винить компонент на ровном месте. Я, выше. дал вполне рабочий вызов — проверен на рабочем сайте.
А товары как загружал? Catalogfilm, shopkeeper?
А товары как загружал? Catalogfilm, shopkeeper?
Я к Василию очень уважительно и почтительно отношусь и не в коем случае не виню! Я лишь указываю на конкретное неудобство и в надежде, что меня услышат, даю добрый совет по вполне полезному улучшению компонента.
Товары на этом сайте — просто обычные ресурсы (класс modResource) со своими TVэхами.
Товары на этом сайте — просто обычные ресурсы (класс modResource) со своими TVэхами.
Я почему-то уверен на 99.9%, что я не ошибся предположив последовательность работы сниппетов pdoMenu и pdoResources. Так что думаю вышесказанное вполне обосновано, тем более что код который по идее должен был бы сработать у меня и отсортировать как мне нужно, все таки не сработал.
А можете гденьть пример показать, где у вас этот же вызов правильно выбирает все?
А можете гденьть пример показать, где у вас этот же вызов правильно выбирает все?
Да, pdoMenu примерно так и работает — дерево строится уже после выборки. А в pdoResources список строится прямо на основе ответа от базы данных
Если напишешь мне на marat@marabar.ru, дам ссылку где можно посмотреть.
Вот если бы я был программистом, я бы для начала включил showLog и посмотрел какой формируется sql запрос в том и в другом случае. Но я не программист, поэтому даже не знаю чем помочь.
Сегей удали профил :D
PS: Я за баланс
PS: Я за баланс
Во-первых, pdoMenu для этого не подходит. Этот сниппет строит дерево ресурсов. Я вообще считаю, что из этого сниппета надо напрочь удалить восприимчивость к параметрам &limit и &offset — сниппет не для вашей задачи.
Для вас решение будет состоять из двух частей — сначала выборка товаров (с постраничностью), а потом группировка по категориям (на каждой странице отдельно).
Если скинете доступ в личку, попробую чем-нибудь помочь за небольшое вознаграждение
Для вас решение будет состоять из двух частей — сначала выборка товаров (с постраничностью), а потом группировка по категориям (на каждой странице отдельно).
Если скинете доступ в личку, попробую чем-нибудь помочь за небольшое вознаграждение
Изначально лимиты отсутствовали. Сайт работал так уже около 3-4-х лет и все было отлично. Обертка из pdoPage была добавлена для того, чтобы разбить длинные списки товаров на подстраницы, а затем при скроллинге задействовать аяксовую возможность подгрузки содержимого последующих псевдостраниц
Если так, то вторую часть нужно реализовывать на JS. У pdoPage есть коллбеки.
Я уже практически дописал компонент, который близок к функционалу того же getResource, только в порядке дерева ресурсов из админки выводит все. Скоро совсем надобность в решении вопроса отпадет.
Тем не менее, мне очень интересно было бы либо чтоб добавили функционал в pdoTools, о котором я выше писал, либо чтоб нашлась таки с имеющимся функционалом стопудовая возможность реализации порядка «как в дереве», но с лимитами и разбиениями на подстраницы.
Тем не менее, мне очень интересно было бы либо чтоб добавили функционал в pdoTools, о котором я выше писал, либо чтоб нашлась таки с имеющимся функционалом стопудовая возможность реализации порядка «как в дереве», но с лимитами и разбиениями на подстраницы.
Да мне за данную модернизацию на сайте всего 1тр клиент платит. Я думаю хоть какое-то более-менее пристойное вознаграждение из этой суммы уже совсем никак не получается :DDD
Да там вряд ли сложно — на шоколадку переведёшь и ладно
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.