Соединяем EasyComm и mFilter2

Всем привет, и сразу к делу (кстати пишу первый раз тут, если будут ошибки — исправим).

Довольно таки часто требуется в интернет магазинах или каталогах добавить возможность пользователям писать отзывы о товарах, с этим очень хорошо справляется компонент 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]] // Количество отзывов о товаре

Всем удачи!
Павел
25 декабря 2015, 10:34
modx.pro
34
5 051
+14

Комментарии: 20

Сергей
Сергей
04 сентября 2017, 11:45
0
Подскажите, а как вывести rating_simple_percent? Почему-то все глухо виснет, если вызываю в &select этот параметр…
    Сергей
    Сергей
    04 сентября 2017, 15:06
    0
    Решил сам)))
    [[+rating:mpy=`20`]]
    Людмила
    25 октября 2017, 13:17
    0
    Подскажите пожалуйста как для простых документов сделать тоже самое
    &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"
    }`
    Делаю так но вообще ничего не выводит.
      Людмила
      25 октября 2017, 14:48
      0
      Если включить 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

        Людмила
        25 октября 2017, 15:08
        0
        Подскажите пожалуйста уже замучилась никак не получается. Заранее благодарна.
          R2m0x94 (Vasily)
          18 января 2019, 10:55
          0
          Для простых документов добавить так:
          &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>
          R2m0x94 (Vasily)
          18 января 2019, 11:26
          0
          — Ещё есть подсказка на тостере
            Aleksey
            23 июля 2019, 07:49
            0
            Подскажите пожалуйста, возможно данный код записать на шаблонизате 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"
            }`
              Aleksey
              23 июля 2019, 11:04
              0
              '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'],
              ])}
              Sergey
              26 января 2021, 01:26
              0
              Здравствуйте, хочу вывести рейтинг в фильтр, обычные документы, но ничего не выходит, может кто подскажет в чем ошибка?
              {$_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',
              ])}
                Наумов Алексей
                26 января 2021, 10:48
                0
                А что выводит? Что в логе, если его включить? (параметр showLog).
                  Sergey
                  26 января 2021, 12:33
                  0
                  Фильтр по «rating» — не выводит, выводит например по tv если указать.
                  Включил 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
                    Наумов Алексей
                    26 января 2021, 14:43
                    0
                    Судя по запросу я вижу, что выбирается 1 ресурс с id=3.

                    Правда запрос странный, в нем нет leftJoin)
                      Sergey
                      26 января 2021, 22:54
                      0
                      Не верный синтаксис запроса leftJoin был, исправил, сортировка работает, но очень хотелось бы сделать фильтрацию, посмотрите пожалуйста
                      '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',
                      ])}
                        Наумов Алексей
                        27 января 2021, 10:05
                        0
                        Давно не работал с mFilter2… а если просто «rating_simple:checkbox»?
                        Вы же сделали join, данные уже выбрали…
                          Sergey
                          27 января 2021, 12:09
                          0
                          Спасибо, к сожалению, так тоже не работает.
                          На сколько разобрался, должно быть правильно вот так —
                          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"
                Елизавета
                01 апреля 2021, 17:02
                0
                Добрый день.

                Возникла такая проблема. После проделанных манипуляций не передаются значения в плейсхолдеры [[+rating]]
                [[+reviews]], вместо них нули в каталоге в карточках товаров.
                  Сергей Карпович
                  28 сентября 2024, 23:58
                  0
                  Ребята, кто знает в чем прикол, не могу присоединить рейтинг к 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>"}'
                      ])}
                    Сергей Карпович
                    29 сентября 2024, 00:12
                    0
                    Забыл добавить что в логах:
                    [pdoTools] Error 42S22: Unknown column 'ecThread.resource' in 'on clause'
                      Сергей Карпович
                      29 сентября 2024, 00:36
                      0
                      Оказалось в документации ошибка.
                      Переименованы поля у объектов:
                      — ecThread: resource > resource_id
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      20