[msProducts] Сортировка товаров по двум полям
Как-то появилась задача сделать сортировку товаров по двум полям. Первое поле всегда одно и то же, а второе — в зависимости от фильтра. К сожалению, завести это дело через стандартные средства pdoTools или сниппет msProducts не удалось, поэтому пришлось немного подправить сниппет msProducts, о чём и поведаю вам.
Итак, создайте копию сниппета msProduct и назовите его, к примеру, myMsProduct. Теперь открываем новый сниппет myMsProduct, находим следующий комментарий:
и строкой выше добавляем такой код:
Вот и всё. Внедрение, конечно, грубое, но рабочее. Теперь можем вызвать сниппет с новым параметром sortAlways, вбив поле и направление, по которому будет всегда производится сортировка:
Хотелось бы видеть, конечно, такую возможность в стандартном наборе miniShop2, но, возможно, задача является специфичной и мало кто с ней сталкивался.
P.S. Сортировать, в теории, можно и по трём полям и более. Но это я не проверял уже.
Итак, создайте копию сниппета msProduct и назовите его, к примеру, myMsProduct. Теперь открываем новый сниппет myMsProduct, находим следующий комментарий:
// Default parameters
и строкой выше добавляем такой код:
// Add sort always parameter
if ( isset($scriptProperties['sortAlways']) )
$scriptProperties['sortby'] = $scriptProperties['sortAlways'] . ', ' . $scriptProperties['sortby'];
Вот и всё. Внедрение, конечно, грубое, но рабочее. Теперь можем вызвать сниппет с новым параметром sortAlways, вбив поле и направление, по которому будет всегда производится сортировка:
[[!myMsProduct?
&sortAlways = `Data.popular DESC`
&sortby = `Data.price`
&sortdir = `ASC`
]]
Или использовать это при вызове mFilter:[[!mFilter?
&snippet=`myMsProducts`
&sortAlways=`Data.popular DESC`
]]
Хотелось бы видеть, конечно, такую возможность в стандартном наборе miniShop2, но, возможно, задача является специфичной и мало кто с ней сталкивался.
P.S. Сортировать, в теории, можно и по трём полям и более. Но это я не проверял уже.
Поблагодарить автора
Отправить деньги
Комментарии: 10
&sortby=`{"Data.price":"ASC","Data.popular":"DESC"}`
так не подходит?
Где ты раньше был? :) Но для фильтра такой вариант не подходит. Нужна именно постоянная сортировка по одному полю, а второе поле чтобы менялось фильтром, а сортировка фильтра перекрывает sortby при вызове сниппета.
не знаю подойдет ли для msProducts
Было для обычных ресурсов
Популярные товары всегда сверху, и сортируем их или по цене, или по дате
Было для обычных ресурсов
Популярные товары всегда сверху, и сортируем их или по цене, или по дате
<a class="sort" data-sort="tv|best:desc,tv|price" data-dir="desc" data-default="asc">Цена <img src="assets/img/triangle-small.png" alt="sort"></a>
<a class="sort" data-sort="tv|best:desc,resource|createdon" data-dir="desc" data-default="asc">Дата добавления <img src="assets/img/triangle-small.png" alt=""></a>
В чем проблема сразу в sortby указать 2 поля через запятую?$scriptProperties['sortby'] = $scriptProperties['sortAlways'] . ', ' . $scriptProperties['sortby'];
Убрал с главной, сам виноват, что плохо разобрал вопрос.
а не подскажите как сортировать так чтобы все товары с ценой = 0 были в конце списка?
здравствуйте!
подскажите пожалуйста
where не отрабатывает
Если явно указать цену, то работает
подскажите пожалуйста
[[!pdoPage?
&element=`msProducts`
&tpl=`product_item`
&toPlaceholder=`result_another`
&parents=`[[*parent]]`
&limit=`4`
&where=`{"Data.price:>=": [[+price]],"Data.price:<=": [[+price:add=`1000`]]}`
&showLog=`1`
]]
[[+result_another:!empty=`<h2>Похожие товары</h2>
<div class="another_products">[[+result_another]]</div>`]]
where не отрабатывает
Если явно указать цену, то работает
&where=`{"Data.price:>=": 36000,"Data.price:<=": 37000}`
лог0.0000429: xPDO query object created
0.0002530: leftJoined msProductData as Data
0.0002301: leftJoined msVendor as Vendor
0.0000038: Grouped by msProduct.id
0.0000691: Added selection of msProduct: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `link_attributes`, `published`, `pub_date`, `unpub_date`, `parent`, `isfolder`, `introtext`, `richtext`, `template`, `menuindex`, `searchable`, `cacheable`, `createdby`, `createdon`, `editedby`, `editedon`, `deleted`, `deletedon`, `deletedby`, `publishedon`, `publishedby`, `menutitle`, `donthit`, `privateweb`, `privatemgr`, `content_dispo`, `hidemenu`, `class_key`, `context_key`, `content_type`, `uri`, `uri_override`, `hide_children_in_tree`, `show_in_tree`, `properties`
0.0000288: Added selection of msProductData: `sku_id`, `article`, `sku_name`, `default`, `price`, `old_price`, `weight`, `image`, `thumb`, `vendor`, `made_in`, `new`, `popular`, `favorite`, `tags`, `color`, `size`, `source`
0.0000269: Added selection of msVendor: `name` AS `vendor.name`, `resource` AS `vendor.resource`, `country` AS `vendor.country`, `logo` AS `vendor.logo`, `address` AS `vendor.address`, `phone` AS `vendor.phone`, `fax` AS `vendor.fax`, `email` AS `vendor.email`, `description` AS `vendor.description`, `properties` AS `vendor.properties`
0.0012748: Processed additional conditions
0.0016050: Added where condition: class_key=msProduct, msProduct.parent:IN(25,82,83,94,162,166,167,174,84,95,164,168,175,173,85,96,165,176,86,97,177,87,98,178,88,99,179,89,100,90,101,91,92,105,106,107,108,117,122,123,127,128,129,130,131,135,139,141,144,145,150,151,152,153,154,155,157,158), msProduct.published=1, msProduct.deleted=0
0.0000720: Sorted by msProduct.id, ASC
0.0000038: Limited to 4, offset 0
0.0003731: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `Data`.`sku_id`, `Data`.`article`, `Data`.`sku_name`, `Data`.`default`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties` FROM `modx_tt_site_content` AS `msProduct` LEFT JOIN `modx_tt_ms2_products` `Data` ON `msProduct`.`id`=`Data`.`id` LEFT JOIN `modx_tt_ms2_vendors` `Vendor` ON `Data`.`vendor`=`Vendor`.`id` WHERE ( `msProduct`.`class_key` = 'msProduct' AND `msProduct`.`parent` IN (25,82,83,94,162,166,167,174,84,95,164,168,175,173,85,96,165,176,86,97,177,87,98,178,88,99,179,89,100,90,101,91,92,105,106,107,108,117,122,123,127,128,129,130,131,135,139,141,144,145,150,151,152,153,154,155,157,158) AND `msProduct`.`published` = 1 AND `msProduct`.`deleted` = 0 ) GROUP BY msProduct.id ORDER BY msProduct.id ASC LIMIT 4 "
0.0026560: SQL executed
0.0000780: Total rows: 57
0.0000670: Rows fetched
0.0001771: Returning raw data
0.0009229: Checked the active modifiers
0.0025780: Loaded chunk "product_item"
0.0047231: Loaded options for products
0.0000079: Returning processed chunks
0.1194100: Total time
22 544 384: Memory usage
немного не так написал, забыл AND, но все же такого типа тоже не работает
как лучше поступить в данном случае?
&where=`{"Data.price:>=": [[+price]]}`
получается плейсхолдер не передается или не обрабатывается pdoPageкак лучше поступить в данном случае?
Разобрался
т.к. [[+price]] предоставляется в виде «22 380,79», а в &where надо передавать либо int либо float
написал вот такой сниппет:
теперь так:
т.к. [[+price]] предоставляется в виде «22 380,79», а в &where надо передавать либо int либо float
написал вот такой сниппет:
[[!getPrice? &price=`[[+price]]`]]
$price = str_replace(",",".", $price);
$price = str_replace(" ","", $price);
if(!empty($addsum)){
$price += $addsum;
}
return $price;
теперь так:
&where=`{"Data.price:>=": [[!getPrice? &price=`[[+price]]`]]," AND:Data.price:<=": [[!getPrice? &price=`[[+price]]` &addsum=`1000`]]}`
как efilter использовать на modx evo 1.2.1? И возможно ли?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.