Соединяем EasyComm и mFilter2
Всем привет, и сразу к делу (кстати пишу первый раз тут, если будут ошибки — исправим).
Довольно таки часто требуется в интернет магазинах или каталогах добавить возможность пользователям писать отзывы о товарах, с этим очень хорошо справляется компонент EasyComm. Но очень часто возникает и смежная задача, слепить EasyComm с mFilter2, а именно сделать сортировку по количеству отзывов или по рейтингу товара. Выкладываю готовое решение.
Добавляем в вызов mFilter2 следующий код:
Сортируем например с помощью параметра sort, так же в вызове mFilter2 добавляем
Или даем пользователю возможность выбирать, по какому параметру сортировать. Вставляем в шаблоне с сортировкой еще 2 строки
Ну и разумеется, вместо «по рейтингу, по отзывам», если необходимо, пишем термин словаря.
Так же теперь можно пользоваться плейсхолдерами в шаблоне товара
Всем удачи!
Довольно таки часто требуется в интернет магазинах или каталогах добавить возможность пользователям писать отзывы о товарах, с этим очень хорошо справляется компонент EasyComm. Но очень часто возникает и смежная задача, слепить EasyComm с mFilter2, а именно сделать сортировку по количеству отзывов или по рейтингу товара. Выкладываю готовое решение.
Добавляем в вызов mFilter2 следующий код:
&loadModels=`easycomm`
&where=`{"class_key":"msProduct"}`
&leftJoin=`{
"ecThread": {
"class": "ecThread",
"on": "msProduct.id = ecThread.resource"
}
}`
&select=`{
"msProduct": "*",
"ecThread": "ecThread.rating_simple AS rating, ecThread.count AS reviews"
}`
Сортируем например с помощью параметра sort, так же в вызове mFilter2 добавляем
&sort=`rating:desc`
Или даем пользователю возможность выбирать, по какому параметру сортировать. Вставляем в шаблоне с сортировкой еще 2 строки
<li><a href="#" data-sort="rating" data-dir="rating:desc" data-default="desc" class="sort">по рейтингу <span></span></a></li>
<li><a href="#" data-sort="reviews" data-dir="reviews:desc" data-default="desc" class="sort">по отзывам <span></span></a></li>
Ну и разумеется, вместо «по рейтингу, по отзывам», если необходимо, пишем термин словаря.
Так же теперь можно пользоваться плейсхолдерами в шаблоне товара
[[+rating]] // Рейтинг товара от 1 до 5
[[+reviews]] // Количество отзывов о товаре
Всем удачи!
Комментарии: 20
Подскажите, а как вывести rating_simple_percent? Почему-то все глухо виснет, если вызываю в &select этот параметр…
Решил сам)))
[[+rating:mpy=`20`]]
Подскажите пожалуйста как для простых документов сделать тоже самое
&where=`{"class_key":"modDocument"}`
&leftJoin=`{
"ecThread": {
"class": "ecThread",
"on": "modDocument.id = ecThread.resource"
}
}`
&select=`{
"modDocument": "*",
"ecThread": "ecThread.rating_simple AS rating, ecThread.count AS reviews"
}`
Делаю так но вообще ничего не выводит.
Если включить showlog
0.0000181: Loaded model «easycomm» from "/core/components/easycomm/model/"
0.0000179: pdoTools loaded.
0.0034862: Fetched ids for building filters: "" from element «mSearch2»
0.0044649: Total time
6 291 456: Memory usage
0.0000181: Loaded model «easycomm» from "/core/components/easycomm/model/"
0.0000179: pdoTools loaded.
0.0034862: Fetched ids for building filters: "" from element «mSearch2»
0.0044649: Total time
6 291 456: Memory usage
Подскажите пожалуйста уже замучилась никак не получается. Заранее благодарна.
Для простых документов добавить так:
&loadModels=`easycomm`
&where=`{"class_key":"modDocument"}`
&leftJoin=`{
"ecThread": {
"class": "ecThread",
"on": "modResource.id = ecThread.resource"
}
}`
&select=`{
"modResource": "*",
"ecThread": "ecThread.rating_simple AS rating, ecThread.count AS reviews"
}`
В чанк вывода outer:<option value="reviews:desc">С отзывами</option>
— Ещё есть подсказка на тостере
Подскажите пожалуйста, возможно данный код записать на шаблонизате Fenom?
&loadModels=`easycomm`
&where=`{"class_key":"msProduct"}`
&leftJoin=`{
"ecThread": {
"class": "ecThread",
"on": "msProduct.id = ecThread.resource"
}
}`
&select=`{
"msProduct": "*",
"ecThread": "ecThread.rating_simple AS rating, ecThread.count AS reviews"
}`
'loadModels'=>'easycomm',
'where' => ['class_key' => 'msProduct'],
'leftJoin' => ["ecThread" => [
"class" => "ecThread",
"on" => ["msProduct.id = ecThread.resource"]
]
],
'select' => ['msProduct' => '*', 'ecThread' => 'ecThread.rating_simple AS rating, ecThread.count AS reviews'],
])}
Здравствуйте, хочу вывести рейтинг в фильтр, обычные документы, но ничего не выходит, может кто подскажет в чем ошибка?
{$_modx->runSnippet('!mFilter2', [
'loadModels'=>'easycomm',
'leftJoin' => [
'ecThread' => [
'class' => 'ecThread',
'on' => ['modResource.id = ecThread.resource']
]
],
'select' => [
'modResource' => '*',
'ecThread' => 'ecThread.rating_simple AS rating, ecThread.count AS reviews'
],
'depth' => 1,
'hideContainers' => 1,
'where' => '{"template": 8}',
'filters' => 'rating:checkbox',
])}
А что выводит? Что в логе, если его включить? (параметр showLog).
Фильтр по «rating» — не выводит, выводит например по tv если указать.
Включил log, почему то получается 3 вывода лога.
Включил log, почему то получается 3 вывода лога.
0.0000081: Loaded model "easycomm" from "/core/components/easycomm/model/"
0.0000260: pdoTools loaded.
0.0000069: Loaded model "easycomm" from "/core/components/easycomm/model/"
0.0000231: Query parameters are prepared.
0.0000162: xPDO query object created
0.0009890: leftJoined mseIntro as Intro
0.0000012: Grouped by modResource.id, Intro.intro
0.0000231: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `type`, `contentType`, `pagetitle`, `longtitle`, `description`, `alias`, `alias_visible`, `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.0000579: Added selection of mseIntro: intro
0.0000150: Processed additional conditions
0.0001259: Added where condition: template=8, modResource.id:IN(3), modResource.published=1, modResource.deleted=0, modResource.isfolder=0
0.0000610: Sorted by FIELD(`modResource`.`id`,'3'),
0.0000021: Limited to 10, offset 0
0.0003798: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`type`, `modResource`.`contentType`, `modResource`.`pagetitle`, `modResource`.`longtitle`, `modResource`.`description`, `modResource`.`alias`, `modResource`.`alias_visible`, `modResource`.`link_attributes`, `modResource`.`published`, `modResource`.`pub_date`, `modResource`.`unpub_date`, `modResource`.`parent`, `modResource`.`isfolder`, `modResource`.`introtext`, `modResource`.`richtext`, `modResource`.`template`, `modResource`.`menuindex`, `modResource`.`searchable`, `modResource`.`cacheable`, `modResource`.`createdby`, `modResource`.`createdon`, `modResource`.`editedby`, `modResource`.`editedon`, `modResource`.`deleted`, `modResource`.`deletedon`, `modResource`.`deletedby`, `modResource`.`publishedon`, `modResource`.`publishedby`, `modResource`.`menutitle`, `modResource`.`donthit`, `modResource`.`privateweb`, `modResource`.`privatemgr`, `modResource`.`content_dispo`, `modResource`.`hidemenu`, `modResource`.`class_key`, `modResource`.`context_key`, `modResource`.`content_type`, `modResource`.`uri`, `modResource`.`uri_override`, `modResource`.`hide_children_in_tree`, `modResource`.`show_in_tree`, `modResource`.`properties`, `intro` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_mse2_intro` `Intro` ON modResource.id = Intro.resource WHERE ( `modResource`.`template` = 8 AND `modResource`.`id` IN (3) AND `modResource`.`published` = 1 AND `modResource`.`deleted` = 0 AND `modResource`.`isfolder` = 0 ) GROUP BY modResource.id, Intro.intro ORDER BY FIELD(`modResource`.`id`,'3') LIMIT 10 "
0.0097411: SQL executed
0.0004070: Total rows: 1
0.0000172: Rows fetched
0.0000138: Returning raw data
0.0143211: Total time
4 194 304: Memory usage
0.0035930: pdoTools loaded
0.0021920: Loaded "modSnippet" with name "mSearch2"
0.1581380: Created inline "modChunk" with name "e6747421ac951eec87076a3f44c6a184"
0.1639540: Total time
6 291 456: Memory usage
0.0000131: Loaded model "easycomm" from "/core/components/easycomm/model/"
0.0000410: pdoTools loaded.
0.0074718: Fetched 1 ids for building filters from element "mSearch2"
0.0000050: Total number of results: 1
0.0000021: Getting filters for 1 ids
0.0027070: Total number of filters: 0
0.2019460: Fired paginator: "pdoPage"
0.0000050: Filters retrieved
0.0000088: Total filter operations: 0
0.5595241: Total time
6 291 456: Memory usage
Судя по запросу я вижу, что выбирается 1 ресурс с id=3.
Правда запрос странный, в нем нет leftJoin)
Правда запрос странный, в нем нет leftJoin)
Не верный синтаксис запроса leftJoin был, исправил, сортировка работает, но очень хотелось бы сделать фильтрацию, посмотрите пожалуйста
В документации по mFilter2 указано
'filters' => 'tv|average_check_place:checkbox,ecThread|rating_simple:checkbox',
как правильно указать? или возможно вообще фильтрация не будет работать.В документации по mFilter2 указано
Построение фильтров указывается через один параметр &filters, в формате кодовое_имя_таблицы/поле: фильтр., вроде так и написал.
{$_modx->runSnippet('!mFilter2', [
'loadModels'=>'easycomm',
'leftJoin' => '{
"ecThread" : {
"class" : "ecThread",
"on" : "modResource.id = ecThread.resource"
}
}',
'select' => '{
"modResource" : "*",
"ecThread" : "ecThread.rating_simple AS rating, ecThread.count AS reviews"
}',
'depth' => 1,
'hideContainers' => 1,
'tpl' => 'place_tpl',
'where' => '{"template": 8}',
'filters' => 'tv|average_check_place:checkbox,ecThread|rating_simple:checkbox',
])}
Давно не работал с mFilter2… а если просто «rating_simple:checkbox»?
Вы же сделали join, данные уже выбрали…
Вы же сделали join, данные уже выбрали…
Спасибо, к сожалению, так тоже не работает.
На сколько разобрался, должно быть правильно вот так —
На сколько разобрался, должно быть правильно вот так —
ecThread|rating_simple:checkbox
И получается в «Журнале ошибок»core/components/msearch2/model/msearch2/msearch2.class.php : 1133) [mSearch2] Method "getEcthreadValues" not exists in class "mse2FiltersHandler". Could not retrieve filters from "ecthread"
Добрый день.
Возникла такая проблема. После проделанных манипуляций не передаются значения в плейсхолдеры [[+rating]]
[[+reviews]], вместо них нули в каталоге в карточках товаров.
Возникла такая проблема. После проделанных манипуляций не передаются значения в плейсхолдеры [[+rating]]
[[+reviews]], вместо них нули в каталоге в карточках товаров.
Ребята, кто знает в чем прикол, не могу присоединить рейтинг к mfilter2
Без присоединения, товары выводятся:
Без присоединения, товары выводятся:
{set $show_more = $_modx->lexicon('show_more')}
{$_modx->runSnippet('!mFilter2', [
'parents' => '22',
'minQuery' => 2,
'element' => 'msProducts',
'class' => 'msProduct',
'limit' => '20',
'setMeta' => 0,
'suggestions' => '0',
'depth' => '',
'includeTVs' => '
project_logo,
project_promocode,
project_offer,
',
'tvPrefix' => '',
'filters' => '',
'aliases' => '',
'tplOuter' => 'tpl_mFilter2.outer',
'tpl' => 'tpl_project_item',
'ajaxMode' => 'button',
'ajaxElemWrapper' => '.catalog-content',
'ajaxElemRows' => '.all-items',
'ajaxElemPagination' => '.catalog-content .mse2_pagination',
'ajaxElemMore' => '.catalog-content .pagination-more',
'ajaxTplMore' => '@INLINE: <div class="pagination-more center"><button class="btn">' ~ $show_more ~ '</button></div>',
'filterOptions' => '{"more": ".catalog-content .pagination-more", "more_tpl": "<div class=\"pagination-more center\"><button class=\"btn\">' ~ $show_more ~ '</button></div>"}'
])}
С присоединенным easycomm не выводит товары{set $show_more = $_modx->lexicon('show_more')}
{$_modx->runSnippet('!mFilter2', [
'parents' => '22',
'minQuery' => 2,
'element' => 'msProducts',
'class' => 'msProduct',
'loadModels'=>'easycomm',
'leftJoin' => '{
"ecThread" : {
"class" : "ecThread",
"on" : "msProduct.id = ecThread.resource"
}
}',
'select' => '{
"msProduct" : "*",
"ecThread" : "ecThread.rating_simple AS rating"
}',
'limit' => '20',
'setMeta' => 0,
'suggestions' => '0',
'depth' => '',
'includeTVs' => '
project_logo,
project_promocode,
project_offer,
',
'tvPrefix' => '',
'filters' => '',
'aliases' => '',
'tplOuter' => 'tpl_mFilter2.outer',
'tpl' => 'tpl_project_item',
'ajaxMode' => 'button',
'ajaxElemWrapper' => '.catalog-content',
'ajaxElemRows' => '.all-items',
'ajaxElemPagination' => '.catalog-content .mse2_pagination',
'ajaxElemMore' => '.catalog-content .pagination-more',
'ajaxTplMore' => '@INLINE: <div class="pagination-more center"><button class="btn">' ~ $show_more ~ '</button></div>',
'filterOptions' => '{"more": ".catalog-content .pagination-more", "more_tpl": "<div class=\"pagination-more center\"><button class=\"btn\">' ~ $show_more ~ '</button></div>"}'
])}
Забыл добавить что в логах:
[pdoTools] Error 42S22: Unknown column 'ecThread.resource' in 'on clause'
Оказалось в документации ошибка.
Переименованы поля у объектов:
— ecThread: resource > resource_id
Переименованы поля у объектов:
— ecThread: resource > resource_id
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.