Как настроить сортировку ресурсов modx по TV в mFilter2? Вроде все по мануалу делаю. Не могу понять почему не взлетает. Вкратце: есть каталог, в нем несколько папок-категорий, в папках ресурсы modx, у ресурсов есть TV — «power». Делаю так:[[!mFilter2? &parents=`[[*id]]` &showLog=`1` &hideContainers=`true` &disableSuggestions=`true` &filters=`tv|power:number` &tplFilter.row.tv|power=`tpl.mFilter2.filter.number` &sort=`resource|pagetitle:asc` ]]Результат — выводятся товары, можно фильтровать по тв-шке «power», сортировать по «pagetitle».
Добавляю в вызове сортировку по TV, «tv|power:asc»:[[!mFilter2? &parents=`[[*id]]` &showLog=`1` &hideContainers=`true` &disableSuggestions=`true` &filters=`tv|power:number` &tplFilter.row.tv|power=`tpl.mFilter2.filter.number` &sort=`resource|pagetitle:asc, tv|power:asc` ]]Результат — «Подходящих результатов не найдено.» Видимо я туплю и делаю что-то не так…
Во втором случае это в логе:
0.0037770: pdoTools loaded. 0.0013981: Query parameters are prepared. 0.0000181: xPDO query object created 0.0003800: leftJoined mseIntro as Intro 0.0000019: Grouped by modResource.id 0.0000060: Parameter "return" set to "ids", so we select only primary key 0.0005479: Processed additional conditions 0.0007210: Added where condition: modResource.parent:IN(5,8,9,10,16,17,18,15,19,12,11,13,14), modResource.published=1, modResource.deleted=0, modResource.isfolder=0 0.0000510: Sorted by modResource.id, ASC 0.0002232: SQL prepared "SELECT `modResource`.`id` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_mse2_intro` `Intro` ON `modResource`.`id`=`Intro`.`resource` WHERE ( `modResource`.`parent` IN (5,8,9,10,16,17,18,15,19,12,11,13,14) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`isfolder` = 0 ) GROUP BY modResource.id ORDER BY modResource.id ASC " 0.0003390: SQL executed 0.0000110: Rows fetched 0.0070949: Total time 12 058 624: Memory usage 0.0000961: Fetched ids for building filters: "11,12,13,14,15,16,17,18,19" from element "mSearch3" 0.0000041: Total number of results: 9 0.0000019: Getting filters for ids: "11,12,13,14,15,16,17,18,19" 0.0001469: Fired paginator: "pdoPage" 0.0000041: Filters retrieved 0.0000091: Total filter operations: 0 0.0156348: Total time 13 107 200: Memory usage
modx.pro
Сортировка тикетов по двум параметрам. / modx.pro
Добрый день! Ребят, есть тут кто-нибудь, то реализовывал сортировку ресурсов по двум-трем параметрам, включая сортировку по TV?
Есть у меня раздел с организациями и там первоначально шла сортировка по рейтингу, от лучшего к худшему, а далее сортировка по id ресурса. В качестве дополнения для рейтинга используется FiveStarRating. Решение для сортировки по рейтингу, кстати, взял отсюда в итоге получился сниппет:
{'!pdoPage' | snippet: [ 'leftJoin' => '{ "SimpleRating":{ "class":"SimpleRating", "on":"Ticket.id = SimpleRating.resource" } }', 'select' => '{ "Ticket":"*", "SimpleRating":"rating_value" }', 'sortby' => [ "SimpleRating.rating_value" => "desc", "id" => "desc" ], 'loadModels'=>'simplerating', 'element'=>'getTickets', 'hideContainers' => 1, 'parents '=> $_modx->resource.id, 'limit' => 10, 'depth' => 1, 'ajaxMode' => 'default', 'prepareTVs' => 'img', 'tpl' => 'oneOrgTpl', 'where' => ['class_key' => 'Ticket'], 'includeTVs' => 'img,org-work-time,addresses', ]}В последствии появилась необходимость закреплять некоторые записи в начале списка и для этого я создал доп. поле (чекбокс) org_sticky_top, которое принимает значение 1 или 0, т.е закреплять организацию в начале списка или нет. Немного переделав сниппет под новый параметр получил:{'!pdoPage' | snippet: [ 'leftJoin' => '{ "SimpleRating":{ "class":"SimpleRating", "on":"Ticket.id = SimpleRating.resource" } }', 'select' => '{ "Ticket":"*", "SimpleRating":"rating_value" }', 'sortby' => [ "org_sticky_top" => "desc", "SimpleRating.rating_value" => "desc", "id" => "desc" ], 'loadModels'=>'simplerating', 'element'=>'getTickets', 'hideContainers' => 1, 'parents '=> $_modx->resource.id, 'limit' => 10, 'depth' => 1, 'ajaxMode' => 'default', 'prepareTVs' => 'img', 'tpl' => 'oneOrgTpl', 'where' => ['class_key' => 'Ticket'], 'includeTVs' => 'img,org-work-time,addresses,org_sticky_top', ]}Теперь, отмеченные галочкой организации размещаются наверху и сортировка по рейтингу в них и только в них работает отлично. В остальных записях сортировка, к сожалению, не работает и организация, имеющая худший рейтинг или вообще без рейтинга, может стоять выше, чем организация с лучшим рейтингом.
Кстати, на том же сайте, где я первоначально брал для себя решение для сортировки мне подсказали подкорректировать вывод так:'sortbyTV' => 'org_sticky_top', 'sortbyTVType' => 'integer', 'sortby' => '{ "SimpleRating.rating_value": "desc" }',но результат тот же.
Подскажите, пожалуйста, может я что забыл указать в параметрах и поэтому нет правильной сортировки?
Спасибо.
modx.pro
[pdoTools] Версия 1.10.1-pl Сортировка ТВ параметров / modx.pro
Доступна для загрузки новая версия pdoTools с небольшими, но очень важными для многих пользователей, изменениями.
У снипета pdoResources появились новые параметры:
&sortbyTV — Сортировка по ТВ параметру. Если он не указан в &includeTVs, то будет подключен автоматически.
&sortdirTV — Направление сортировки ТВ: по убыванию или возрастанию. Если не указан, то будет равен параметру &sortdir.
&sortbyTVType — Тип сортировки по ТВ параметру. Возможные варианты: string, integer, decimal и datetime. Если пусто, то ТВ будет отсортирован в зависимости от его типа: как текст, число или дата.
Первые два давно были в классе pdoFetch, а третий я добавил только вчера.Теперь они все выведены в параметры сниппета pdoResources и вы можете из использовать вот так:[[!pdoResources? &parents=`0` &select=`id,pagetitle` &sortby=`publishedon` &sortdir=`DESC` &sortbyTV=`Type` &sortbyTVType=`integer` &sortdirTV=`ASC` &showLog=`1` ]]С вот таким результатом:0.0002079: pdoTools loaded 0.0000279: xPDO query object created 0.0003412: Included list of tvs: Type 0.0002730: leftJoined modTemplateVarResource as TVtype 0.0001318: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `pagetitle` 0.0000091: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `tv.Type` 0.0000179: Processed additional conditions 0.0002561: Added where condition: modResource.published=1, modResource.deleted=0 0.0000870: Replaced TV conditions 0.0001929: Sorted by CAST(`TVtype`.`value` AS SIGNED INTEGER), ASC 0.0000050: Sorted by modResource.publishedon, DESC 0.0000041: Limited to 10, offset 0 0.0002260: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`pagetitle`, IFNULL(`TVtype`.`value`, '') AS `tv.Type` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVtype` ON `TVtype`.`contentid` = `modResource`.`id` AND `TVtype`.`tmplvarid` = 3 WHERE ( `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 ) ORDER BY CAST(`TVtype`.`value` AS SIGNED INTEGER) ASC, modResource.publishedon DESC LIMIT 10 " 0.0008218: SQL executed 0.0000918: Total rows: 34 0.0000210: Rows fetched 0.0003099: Returning processed chunks 0.0030849: Total time 6 815 744: Memory usage
Как видите, одновременно работает сортировка сначала по указанному ТВ, а затем по полю ресурса. Если вы не указываете &sortbyTVType, то ТВ сортируется как и прежде, в соответствии со своим типом.
Другие изменения
Так как я не анонсировал предыдущую версию 1.1.0-pl, напишу об этом здесь.
В pdoMenu вернулся параметер &showDeleted. В прошлый раз оказалось, что он не работает, потому что карта сайта MODX не хранит id удалённых ресурсов и функуця modX::getChildIds() их просто не возвращает.
Пришлось заменить выборку её на собственную функцию pdoFetch::getChildIds(), очень своевременно предложенную одним из пользователей.
Новый метод включается только при указании &showDeleted=1, потому что он выбирает всех потомков напрямую из БД, что, конечно, медленнее, чем получение их из файла кэша MODX.
Исправлен стандартный javascript pdoPage. Ajax пагинация теперь отлично дружит с кнопочками браузера вперёд-назад.
В pdoPage также исправлено перезаписывание параметров &frontend_js и &frontend_css вызываемого дочернего сниппета, если &ajax=0. То есть, если ajax не включен у pdoPage, он не подключает свои скрипты и не мешает, например, сниппету ms2Gallery сделать это.
В классе pdoFetch добавлена возможность указывать функции в select. Например, теперь корректно работает такой вызов:
[[!pdoResources? &parents=`0` &select=`CAST(id AS DECIMAL(10,2)) as id, pagetitle` ]]Это достигается специальной обработкой параметра перед отправкой в xPDO. Вывод: Array ( [id] => 4.00 [pagetitle] => HybridAuth [idx] => 10 [link] => ) Ну и, наконец, исправлена ошибка в быстрых плейсхолдерах. Теперь их можно использовать и для JSON полей объектов.
Например:
[[!pdoResources? &parents=`0` &select=`id,pagetitle,properties` &where=`{"class_key":"Ticket"}` &tpl=`@INLINE <p>{{+id}} - {{+pagetitle}} {{+properties.tickets.process_tags}}</p> <!--pdotools_properties.tickets.process_tags Теги обрабатываются--> <!--pdotools_!properties.tickets.process_tags Теги не обрабатываются--> ` ]]Да-да, я советую всем использовать такие плейсхолдеры в INLINE чанках, как {{+id}}. Это просто быстрее, потому что парсер MODX на них вообще никак не реагирует и не пытается обработать. Поэтому с их помощью можно вызывать фильтры и сниппеты.