MODX - Звёздный рейтинг для статей сайта

Александр Мальцев
Александр Мальцев
10K
79
Содержание:
  1. Дополнение FiveStarRating
  2. Вывод ресурсов с самым большим рейтингом
  3. Комментарии

В этой статье рассмотрим, как к статьям сайта добавить звёздный рейтинг.

Звёздный рейтинг - это система для оценки материалов сайта (например, статей) с помощью количества звёздочек (обычно от 1 до 5).

Добавление данного функционала в систему CMS MODX Revolution осуществим посредством дополнения FiveStarRating.

Дополнение FiveStarRating

FiveStarRating - это дополнение, добавляющее в систему MODX Revolution элементы, с помощью которых можно осуществить фронтенд оценку ресурсов с помощью звёздочек.

MODX Revolution – Звёздный рейтинг для статей сайта
MODX Revolution – Звёздный рейтинг для статей сайта

Установка дополнения FiveStarRating

Дополнение FiveStarRating расположено в репозитории modx.com.

Его установку в систему MODX Revolution можно осуществить на странице "Управление пакетами".

MODX Revolution – Установка дополнения FiveStarRating
MODX Revolution – Установка дополнения FiveStarRating

Использование дополнения FiveStarRating

Подключение звёздной оценочной системы к ресурсу осуществляется посредством помещения вызова сниппета SimpleRating в шаблон или контент ресурса.

[[!SimpleRating]]

Параметры сниппета SimpleRating:

  • &id - id ресурса, для которого необходимо вывести рейтинг (по умолчанию текущий).
  • &tpl - чанк, содержащий HTML разметку звёздного рейтинга (по умолчанию tplSimpleRating).

Пример вызова сниппета SimpleRating с указанием id ресурса:

[[!SimpleRating?
    &id = `3`
]]

Пример вызова сниппета SimpleRating с указанием имени чанка:

[[!SimpleRating?
    &tpl = `tplSimpleRating1`
]]

Сниппет SimpleRating выполняет следующие действия:

  • регистрирует нужные стили и скрипты на фронтенде;
  • получает рейтинг текущего или указанного ресурса и выводит его на страницу;
  • устанавливает рейтинг активным или нет, в зависимости от того оценил уже этот ресурс пользователь или нет.

Отправка оценки осуществляется через ajax. Обработку ajax-запроса на сервере выполняет файл action.php. Данный файл проверяет возможность оценки ресурса данным пользователем, выполняет установку рейтинга (запись необходимой информации в базу данных) и возвращает результат. После получения результата от action.php сценарий JavaScript отображает его на странице.

Защита от накрутки оценки осуществляется посредством LocalStorage и IP адреса.

При необходимости защиту по IP адресу можно отключить. Осуществляется это посредством установки системному параметру simplerating_ip значения "Нет".

MODX Revolution – Отключение защиты по IP адресу
MODX Revolution – Отключение защиты по IP адресу

Вывод ресурсов с самым большим рейтингом

В качестве заключения рассмотрим, как можно вывести на страницу 10 ресурсов с самым высоким рейтингом. Для выполнения этой задачи воспользуемся сниппетом pdoResources из пакета pdoTools.

[[!pdoResources?
    &loadModels=`simplerating`
    &parents=`0`
    &innerJoin=`{
        "SimpleRating": {
            "class":"SimpleRating",
            "on": "modResource.id = SimpleRating.resource"
        }
    }`
    &sortby = `{"SimpleRating.rating_value":"DESC"}`
  	&select=`{
  	  	"modResource":"id,pagetitle",
    		"SimpleRating":"rating_value"
  	}`
  	&tpl=`@INLINE <p>[[+id]]. [[+pagetitle]] - [[+rating_value]]</p>`
]]

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

  1. Валерия
    22 сентября 2020, 10:06
    Здравствуйте, Александр!
    Подскажите, пожалуйста, почему нет выводятся звезды? Только текстовое содержимое чанка — prnt.sc/ullesv
    Код был использован по умолчанию:
    [[!SimpleRating?
                &tpl = `tplSimpleRating`
    ]]
    
    1. Александр Мальцев
      23 сентября 2020, 15:16
      Здравствуйте! Проверьте путь к файлу со звездочками (изображению).
      1. Валерия
        23 сентября 2020, 17:11
        Причина в том, что не подключаются стили к чанку. Путь к стилям во всех файлах указан верно. Но почему-то блоки не видят стили — prnt.sc/umi6f3.
        1. Александр Мальцев
          26 сентября 2020, 15:27
          Подключение стилей происходит в сниппете SimpleRating:
          <?php
          $modx->regClientCSS(MODX_ASSETS_URL . 'components/simplerating/css/web/default.css');
          $modx->regClientScript(MODX_ASSETS_URL . 'components/simplerating/js/web/default.js');
          ...
          
          Проверьте, где у вас на сервере находятся эти файлы. После этого откройте страницу в браузере и перейдите в консоль. Если браузер их не нашёл, то он это выведет в неё. В сообщениях будут указаны пути к ним. Далее нужно их сравнить. Если они не совпадают, то ошибка кроется в них. А если нет, то нужно разбираться дальше. Можно также ещё попробовать очистить кэш.
          1. Валерия
            28 сентября 2020, 11:31
            Путь верный, файлы доступны по ссылкам. В консоли нет ошибок касаемо этих стилей.
            Но в источниках нет папки сниппета simplerating.
            Вот ссылка на сайт, может так Вы сможете мне помочь.
            1. Александр Мальцев
              28 сентября 2020, 14:37
              Да, они не подхватываются. Подключите их на страницу самостоятельно:
              <link rel="stylesheet" href="/assets/components/simplerating/css/web/default.css">
              <script src="/assets/components/simplerating/js/web/default.js"></script>
              
              Вы используете MinifyX, может из-за него такие проблемы.
              1. Валерия
                28 сентября 2020, 14:56
                Спасибо, теперь все вышло!
    2. Ruslan
      28 декабря 2019, 01:44
      При нажатии ничего не происходит.
      Перестал работать, как выявить причину?
      Я догадываюсь, что это скорее всего что-то с обработчиком action.php
      Посмотреть на сайте
      1. Ruslan
        29 декабря 2019, 06:23
        Проблему решил
        1. Александр Мальцев
          29 декабря 2019, 13:37
          Отлично!
      2. Ruslan
        28 декабря 2019, 01:43
        При нажатии ничего не происходит.
        Перестал работать, как выявить причину?
        Я догадываюсь, что это скорее всего что-то с обработчиком action.php
        1. Ruslan
          28 декабря 2019, 01:16
          Здравствуйте.
          Перестал работать, при нажатии ничего не происходит.
          Как выявить причину и с чем это может быть связано?
          Посмотреть на сайте
          1. Евгений Николаевич Мястовский
            02 декабря 2019, 20:52
            Александр, подскажите, как кастомизировать звёзды? Сделать меньше, поменять цвет и т.д. Нужно что бы они были примерно как дефолтные-золотистые. Приобрёл goodstar компонент, но что то он не хочет работать корректно.
            1. Александр Мальцев
              03 декабря 2019, 02:00
              Сейчас, только правкой изображения, CSS и возможно других файлов.
              В планах улучшить этот компонент, в частности сделать звёзды в формате svg. После этого операции по внешнему оформлению звёзд можно будет очень просто выполнять с помощью CSS.
            2. Mish
              25 октября 2019, 20:20
              Доброго. Скажите пожайлуста как сделать рейтинг из 10 звезд?
              1. Александр Мальцев
                27 октября 2019, 14:17
                Привет! Для этого нужно произвести изменения в 5 местах.
                Инструкция как сделать 10 звездочек вместо 5:
                1. Сделать спрайт на 10 звёздочек аналогично тому, как это выполнено в файле «\assets\components\simplerating\stars.png». Файл с 10 звездочками сохранить, например, с именем «stars10.png».
                В результате ширина изображения stars10.png теперь равняется 260px.
                2. В файле «\assets\components\simplerating\js\web\default.js» найти строчку:
                var width = 130 * ratingValue / 5;
                Эту строчку заменить на:
                var width = 260 * ratingValue / 10;
                3. В файле «\assets\components\simplerating\css\web\default.css» нужно во вех местах stars.png заменить на stars10.png и 130px на 260px.
                После этого добавить дополнительно ещё следующие стили:
                .rating__star_6 {
                    left: 130px;
                }
                .rating__star_7 {
                    left: 156px;
                }
                .rating__star_8 {
                    left: 182px;
                }
                .rating__star_9 {
                    left: 208px;
                }
                .rating__star_10 {
                    left: 234px;
                }
                4. Код чанка tplSimpleRating заменить на следующий:
                <div class="rating[[+rating_active]]">
                    <div class="rating__best">
                        <div class="rating__current" data-id="[[+id]]" style="display: block; width: [[+rating_width]]px;"></div>
                        <div class="rating__star rating__star_10" data-title="10"></div>
                        <div class="rating__star rating__star_9" data-title="9"></div>
                        <div class="rating__star rating__star_8" data-title="8"></div>
                        <div class="rating__star rating__star_7" data-title="7"></div>
                        <div class="rating__star rating__star_6" data-title="6"></div>
                        <div class="rating__star rating__star_5" data-title="5"></div>
                        <div class="rating__star rating__star_4" data-title="4"></div>
                        <div class="rating__star rating__star_3" data-title="3"></div>
                        <div class="rating__star rating__star_2" data-title="2"></div>
                        <div class="rating__star rating__star_1" data-title="1"></div>
                    </div>
                </div>
                <div style="font-size:10px; color: #999; padding-top: 3px; padding-bottom: 3px;">
                    Рейтинг: <span class="rating-value">[[+rating_value]]</span>/10 - <span class="rating-count">[[+rating_count]]</span>
                    голосов
                </div>
                5. В сниппете SimpleRating выполнить 2 измнения.
                5.1. Найти эту строчку:
                $width = 130 * $rating_value / 5;
                Заменить её на следующую:
                $width = 260 * $rating_value / 10;
                5.2. Найти эту строчку
                'rating_best' => 5,
                Заменить в ней цифру 5 на 10:
                'rating_best' => 10,

                1. Mish
                  27 октября 2019, 22:10
                  Вроде как работает. Спасибо! Вот только выставил оценку 10, а вывелось ток 9.9.

                  А еще выводит ли моя оценка? Поле чтоб показывало мою оценку к материалу.

                  P.S. кому в лом рисовать 10 звездочек вот: ibb.co/YDyyxXC
                  1. Александр Мальцев
                    28 октября 2019, 13:55
                    В текущей версии нет учета оценок, оставленных авторизированными пользователями.
                    1. Александр Мальцев
                      28 октября 2019, 13:49
                      Да, там размер числа не позволяет это выполнить.
                      Для этого нужно выполнить следующие шаги:
                      1. В базе данных найти таблицу simple_rating. Для поля rating_value установить Длина/значение — 3,1.
                      2. Открыть файл «\core\components\simplerating\model\schema\simplerating.mysql.schema.xml» и в нём тоже поменять точность на 3,1:
                      <field key="rating_value" dbtype="decimal" precision="3,1" phptype="float" null="false" index="index" />
                      3. Скачать файл «https://raw.githubusercontent.com/itchief/modx_utils/master/parse_schema.php»
                      4. Открыть его и изменить в нём имя пакета:
                      $package_name = 'simplerating';
                      5. Сохранить скрипт parse_schema.php и поместить его в корень проекта.
                      6. Выполнить данный файл.
                2. Андрей
                  12 октября 2019, 23:10
                  Здравствуйте, Александр!
                  Скажите пожалуйста, как я могу кастомизировать звёзды? Хотелось бы вместо png поставить svg звёзды.
                  Заранее благодарю за ответ
                  1. Александр Мальцев
                    13 октября 2019, 10:40
                    Привет!
                    В компоненте это реализовано через спрайт, и, следовательно, так просто это изменить нельзя. Сначала нужно хорошее решение для вывода звёздного рейтинга через SVG? Например, как с помощью SVG звездочек отобразить рейтинг 4.3?
                    1. Андрей
                      13 октября 2019, 11:23
                      Александр, еще один вопрос возник, касаемо вывода ресурсов с рейтингом.
                      Сейчас по Вашей формуле в pdoPage выводит ресурсы по популярности.
                      Но в случае, если у ресурса еще не было голосов, еще нет в списке. Как можно поправить данный момент?
                      1. Александр Мальцев
                        13 октября 2019, 13:51
                        Заменить &innerJoin на &leftJoin.
                      2. Андрей
                        13 октября 2019, 10:57
                        Точно, в целом с точки зрения реализации верстки это весьма проблематично.
                        Ладно, тогда вопрос другой, как тогда убрать цифры в спрайте так, чтобы ничего не съехало?
                        1. Александр Мальцев
                          13 октября 2019, 13:59
                          Как с помощью SVG это реализовать идея появилась, тут нужно просто использовать наложение изображений.
                          Чтобы убать цифры необходимо просто изменить стили, а именно CSS-свойство height:
                          .rating {
                            height: 25px;
                          }
                          .rating__best {
                            height: 25px;
                          }
                          .rating__current {
                            height: 25px;
                          }
                          .rating__star {
                            height: 25px;
                          }
                          
                    2. Сергей
                      10 октября 2019, 10:44
                      Добрый день. Как можно сделать 10 звездочек вместо 5 и можно ли? Почему-то не реагирует вообще на параметр tpl — прописал там 10 все равно 5 выводит, прописал 4 — тоже 5 выводит
                      1. Сергей
                        10 октября 2019, 10:57
                        Кажется стал разбираться, потом отпишу решение
                        1. Александр Мальцев
                          10 октября 2019, 15:48
                          Хорошо
                          1. Сергей
                            10 октября 2019, 16:34
                            Александр, скажите есть возможность из коробки только вывести рейтинг без возможности голосования?
                            1. Александр Мальцев
                              11 октября 2019, 14:13
                              Конечно можно. Делаете копию чанка tplSimpleRating, удаляете в нём [[+rating_active]] и указываете его сниппету SimpleRating.
                              [[!SimpleRating?
                                &tpl = `mytplSimpleRating`
                              ]]
                              
                      2. Максим
                        28 августа 2019, 02:02
                        Приветствую Александр,
                        Спасибо за проделанную работу и вопрос: Я использую популярную МОДХ экстра Babel для создания мультиязычного вебсайта. Каждая языковая версия «живет» на отдельном контексте и имеет свой id. То есть языковые версии представляют собой разные, хотя и связанные ресурсы. Можно ли сделать так, чтобы рейтинг не дробился между английской и русской страницами сайта?
                        1. Максим
                          29 августа 2019, 12:06
                          Ответ подсказали, делюсь если вдруг кому-то будет интересно.
                          У моего сайта два языка (русский и английский). На русском рейтинг выводится [[!SimpleRating]].
                          На англйском [[!SimpleRating? &id=`[[BabelTranslation? &contextKey=`web`]]`]]
                          где BabelTranslation? &contextKey=`web` это id русского ресурса, с которым залинкован данный английский ресурс.
                        2. flintotake
                          18 августа 2019, 00:23
                          Доброго времени суток. Подскажите, есть ли возможность в выводе популярных ресурсов через pdoResources результаты вывода сделать ссылками на сами ресурсы?
                          Спасибо.
                          1. Александр Мальцев
                            26 августа 2019, 14:01
                            Доброго. Выберите uri ресурса, оберните с помощью элемента a нужные элементы и укажите выбранное поле в качестве значения href.
                            1. flintotake
                              30 августа 2019, 22:37
                              можно пример?
                              1. Александр Мальцев
                                04 сентября 2019, 14:43
                                Например, так:
                                [[!pdoResources?
                                  &loadModels = `simplerating`
                                  &parents = `0`
                                  &leftJoin = `{
                                    "SimpleRating": {
                                      "class":"SimpleRating",
                                      "on": "modResource.id = SimpleRating.resource"
                                    }
                                  }`
                                  &sortby = `{"SimpleRating.rating_value":"DESC"}`
                                    &select = `{
                                      "modResource":"id,pagetitle,uri",
                                      "SimpleRating":"rating_value"
                                    }`
                                  &tpl= `@INLINE <li><a href="[[+uri]]">[[+id]]. [[+pagetitle]] - [[+rating_value]]</a></li>`
                                  &tplWrapper = `@INLINE <ul>[[+output]]</ul>`
                                ]]
                                
                          2. greeg
                            17 мая 2019, 00:32
                            добрый день у меня перестал работать FiveStar Rating после переноса каталога core на уровень выше, не зашитует голоса. где надо поправить? зарание спасибо

                            1. Александр Мальцев
                              17 мая 2019, 15:46
                              Добрый! Не нужно ничего поправлять. Очистите кэш MODX, браузера. Попробуйте ещё раз.
                            2. alex G
                              10 декабря 2018, 18:32
                              Здравствуйте, возникла необходимость скрытия блока после голосования (сохранить оценку текстовую а звёздочки скрыть), и запустить js действие, подскажите пожалуйста как правильно это реализовать?
                              1. Александр Мальцев
                                11 декабря 2018, 14:18
                                Здравствуйте!
                                Для этого в CSS добавьте:
                                .rating {
                                  display: none;
                                }
                                .rating_show {
                                  display: block;
                                }
                                
                                В JavaScript файле \assets\components\simplerating\js\web\default.js измените следующее:
                                а)
                                // этот код:
                                var removeRatingActive = function () {
                                  if (output) {
                                    $('.rating_active [data-id]').each(function () {
                                      var id = $(this).attr('data-id');
                                      if (output.indexOf(id) >= 0) {
                                        $(this).closest('.rating').removeClass('rating_active');
                                      }
                                    });
                                  }
                                };
                                // на этот:
                                var removeRatingActive = function () {
                                  if (output) {
                                    $('.rating_active [data-id]').each(function () {
                                      var id = $(this).attr('data-id');
                                      if (output.indexOf(id) >= 0) {
                                        $(this).closest('.rating').removeClass('rating_active');
                                      } else {
                                        $(this).closest('.rating').addClass('rating_show'); 
                                      }
                                    });
                                  }
                                };
                                
                                b)
                                // этот фрагмент:
                                if (!$.isEmptyObject(data)) {
                                  current.removeClass('rating_active');
                                // на этот:
                                if (!$.isEmptyObject(data)) {
                                  current.removeClass('rating_active rating_show');
                                
                              2. Сеокотов
                                01 ноября 2018, 16:15
                                А реально сделать так чтобы только в комментарии через tickets была возможность ставить оценку?
                                1. Александр Мальцев
                                  04 ноября 2018, 04:38
                                  Сделать то всё возможно, но придётся много переделывать.
                                2. Константин
                                  06 сентября 2018, 12:22
                                  Добрый день! Александр, может Вы мне поможете. При переносе сайта на новый хостинг. перестало правильно работать голосование. А именно, при клике на звездочку ничего не происходит. Не видно сразу, что я оставил оценку, хотя данные в базу заносятся и при обновлении странички оставленную мной оценку я вижу. Еще я могу проголосовать бесконечное количество раз. И все оценки засчитываются и средний рейтинг выводится.
                                  В консоли браузера следующие ошибки:
                                  POST https://.../assets/components/simplerating/action.php 500 (Internal Server Error)
                                  POST https://.../assets/components/simplerating/action.php 502 (Bad Gateway)
                                  
                                  В админке, в журнале ошибок ничего нет.

                                  Может ли это связано с тем, что сайт стал работать на https? на старом хостинге, когда была разработка, сайт работал на http. Или это от хостинга зависит?

                                  Спасибо!
                                  1. Александр Мальцев
                                    06 сентября 2018, 13:53
                                    Добрый!
                                    Необходимо проверить, действительно ли такой путь до файла action.php.
                                    Если это так, то проверить можно ли из клиента (браузера) обратиться к нему. Например, введя URL в адресную строку браузера:
                                    https://.../action.php
                                    1. Константин
                                      06 сентября 2018, 20:05
                                      Обратился в техподдержку хостинга. Все решили. В чем проблема была я не уточнял. Спасибо за отклик.
                                    2. Константин
                                      06 сентября 2018, 12:39
                                      Еще в этом файле
                                      https://.../assets/components/simplerating/js/web/default.js
                                      Ругается на 42 строку:
                                      $.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
                                    3. Антон
                                      14 августа 2018, 20:12
                                      Александр добрый день подскажите а где можно почистить рейтинг (обнулить например) или посмотреть. Если есть такая возможность)
                                      1. Александр Мальцев
                                        19 августа 2018, 07:48
                                        Добрый! Встроенной такой возможности нет. Можно попробывать это реализовать по этой инструкции.
                                      2. Сеокотов
                                        12 июля 2018, 14:28
                                        Установил сниппет
                                        звезды работают
                                        при попытке вывода ресурсов с лучшими оценками возникли трудности

                                        [[!pdoResources?
                                            &loadModels=`simplerating`
                                            &parents=`0`
                                            &innerJoin=`{
                                                "SimpleRating": {
                                                    "class":"SimpleRating",
                                                    "on": "modResource.id = SimpleRating.resource"
                                                }
                                            }`
                                            &sortby = `{"SimpleRating.rating_value":"DESC"}`
                                          	&select=`{
                                          	  	"modResource":"id,pagetitle",
                                            		"SimpleRating":"rating_value"
                                          	}`
                                          	&tpl=`item_prev`
                                        ]]
                                        поставил свой шаблон item_prev
                                        но почему то не выводит [[+alias]]

                                        1. Александр Мальцев
                                          12 июля 2018, 16:42
                                          Необходимо в &select перечислить поля, которые нужно получить. Ну, или использовать *, чтобы получить все поля.
                                          &select=`{
                                              "modResource":"id,pagetitle,alias",
                                          
                                          1. Сеокотов
                                            12 июля 2018, 16:54
                                            о, супер, спасибо!
                                            а подскажите еще такой момент, как вывести на превьюшке к примеру просто звездочку с текущей оценкой, то есть тот статус который на данный момент имеет страница
                                            либо весь ряд звезд?
                                            1. Александр Мальцев
                                              12 июля 2018, 17:47
                                              Можно, в данном случае, в чанк item_prev поместить вызов сниппета SimpleRating:
                                              [[!SimpleRating?
                                                  &id=`[[+id]]`
                                              ]]
                                              
                                              Второй вариант — это использовать изображение и плейсхолдер rating_value. Например, так:
                                              [[+rating_value]] <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" height="16"><path fill="currentColor" d="M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z"></path></svg> 
                                              
                                        2. Константин
                                          09 июля 2018, 22:08
                                          Добрый вечер! А как переписать вывод рейтинговых ресурсов, но только на Fenom и используя Tickets? Пробую сам, сортирует вроде как нужно, но выводятся только ресурсы, которым поставили оценку, остальные пропадают. Что-то где-то не учел, а что, не могу понять.
                                          1. Александр Мальцев
                                            10 июля 2018, 14:02
                                            Добрый! &innerJoin замените на &leftJoin.
                                            1. Константин
                                              13 июля 2018, 17:16
                                              Спасибо! Все работает! Не могли бы Вы еще помочь в одной проблеме. Мне, кроме сортировки по рейтингу понадобилась возможность закреплять некоторые записи в начале списка. Для это я создал доп. поле org_sticky_top (Закрепить в начале списка), которое принимает значения 1 или 0. Т.е, если отметить в ресурсе галочку в поле org_sticky_top, предполагается, что этот ресурс должен размещаться сверху. Но, кроме сортировки по полю org_sticky_top, должна корректно работать сортировка по рейтингу. Я создал сниппет:
                                              {'!pdoPage' | snippet: [
                                              'leftJoin' => '{
                                              	"SimpleRating":{
                                              	"class":"SimpleRating",
                                              	"on":"Ticket.id = SimpleRating.resource"
                                              }
                                              }',
                                              'select' => '{
                                              	"Ticket":"id,pagetitle",
                                              	"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',
                                              ]}
                                              
                                              Здесь первой идет сортировка по org_sticky_top, потом по рейтингу и затем по id ресурса. И тут у меня пошли косяки. Сортировка по org_sticky_top работает норм. т.е. все отмеченные галочкой ресурсы закрепляются вначале и даже сортировка по рейтингу среди них происходит отлично. Но в остальных ресурсах происходит хаос. Сортировка по рейтингу не работает. Материал с низшим рейтингом может стоять выше материала с высшим рейтингом.

                                              Не могли бы Вы подсказать где я мог накосячить?
                                              1. Александр Мальцев
                                                14 июля 2018, 05:44
                                                Попробуй так:
                                                'sortbyTV' => 'org_sticky_top',
                                                'sortbyTVType' => 'integer',
                                                'sortby' => '{
                                                  "SimpleRating.rating_value": "desc"
                                                }',
                                                
                                                1. Константин
                                                  16 июля 2018, 16:22
                                                  Добрый день! Решил я свою проблему. Разобрался сам. Она заключалась в том, что я в доп. поле org_sticky_top указал значение по-умолчанию равным 0. Не нужно было там вообще что-то указывать. Фактически, у ресурса поле org_sticky_top могло принимать три значения (1, 0 и пустое значение) а не два (1 и пустое значение). Соответственно и сортировка сразу шла по 1, 0 и пустому значению. Отсюда и неправильная последовательность в результатах сортировки.

                                                  А Вам огромное спасибо, что находите время, чтобы помочь таким как я!
                                                  1. Александр Мальцев
                                                    16 июля 2018, 16:34
                                                    Отлично!
                                                  2. Константин
                                                    15 июля 2018, 00:47
                                                    Спасибо, но к сожалению, изменений не произошло. Закрепленные материалы наверху, как и нужно, а дальше сортировка не работает. Попробую спросить на modx.pro. Может там кто подобное реализовывал.
                                            2. Дмитрий
                                              01 декабря 2017, 22:33
                                              Добрый вечер. Подскажите пожалуйста как вывести рейтинг в превью на странице вывода нескольких элементов? Чтобы отображал у каждого свой
                                              1. Дмитрий
                                                03 декабря 2017, 10:37
                                                Решение нашел
                                              2. ilyaib
                                                17 ноября 2017, 20:52
                                                А с fenome не дружит? пытаюсь заменить в чанке [[+id]] на {$id} не выводит
                                                1. Александр Мальцев
                                                  18 ноября 2017, 17:40
                                                  Для поддержки Fenom откройте сниппет SimpleRating и добавьте в него строчку:
                                                  <?php
                                                  $pdo = $modx->getService('pdoTools');
                                                  ...
                                                  
                                                  После этого в конструкции измените $modx на $pdo:
                                                  $output = $pdo->getChunk($tpl_option, array(
                                                      'id' => $id,
                                                      'rating_best' => 5,
                                                      'rating_value' => $rating_value,
                                                      'rating_count' => $rating_count,
                                                      'rating_active' => $rating_active_class,
                                                      'rating_width' => str_replace(',', '.', $width)
                                                  ));
                                                  
                                                2. kalisto
                                                  25 октября 2017, 23:50
                                                  Здравствуйте Александр!
                                                  Почему-то идет ошибка.
                                                  Как исправить?
                                                  1. kalisto
                                                    26 октября 2017, 00:11
                                                    Ой прошу прощения убрала расширение .html
                                                    Выдает ошибку в 42 строке (файл default.js):
                                                    $.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
                                                    Как исправить? Или рейтинг не работает по другой причине?
                                                    1. Александр Мальцев
                                                      26 октября 2017, 11:24
                                                      Здравствуйте. Необходимо подключить библиотеку jQuery.
                                                      1. kalisto
                                                        26 октября 2017, 12:03
                                                        Спасибо за ответ. Я подключаю биб-ку в проекте (скачала, concat — в итоге scripts.min.js) —
                                                        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" ></script>
                                                            <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
                                                            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" ></script>
                                                        Или тут jquery подключить дополнительно еще нужно? А какой?
                                                        Попробую jquery-migrate-1.4.1.min.js подключить.
                                                        1. Александр Мальцев
                                                          26 октября 2017, 13:39
                                                          Нужно обычный jQuery, не slim. Slim — это урезанная версия jQuery без AJAX функций и прочих «вкусностей». migrate — он предназначен для поддержки устаревших функций, которые не стало в 3 версии jQuery. Данный компонент не использует устаревшие функции jQuery, его можете не подключать.
                                                          В вашем коде необходимо 1 строчку заменить на следующую:
                                                          <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
                                                  2. Ми
                                                    14 октября 2017, 19:35
                                                    Добрый вечер!
                                                    возникла проблема что не выводит список согласно количества голосов

                                                    то есть просто если у ресурса есть рейтинг то он выводиться, но не соблюдается требования что первый это самый популярный и с самым большим числом голосов

                                                    вот вывод
                                                    [[!pdoResources? 
                                                              &loadModels=`simplerating`
                                                              &parents=`4`
                                                              &depth=`3`
                                                              &includeContent=`1`
                                                              &limit=`4` 
                                                              &innerJoin=`{
                                                                "SimpleRating": {
                                                                "class":"SimpleRating",
                                                                "on": "modResource.id = SimpleRating.resource"}
                                                                }`
                                                              &sortby = `{"SimpleRating.rating_value":"ASC"}`
                                                      	      &select=`{
                                                      	  	    "modResource":"id,pagetitle",
                                                        		"SimpleRating":"rating_value"
                                                      	        }`
                                                              &tpl=`tpl.mejores.ofertas`
                                                              &includeTVs=`img,subject,precio,moneda,provincia,ciudad` 
                                                            ]]
                                                    1. Александр Мальцев
                                                      16 октября 2017, 16:49
                                                      Добрый вечер!
                                                      Если необходимо вывести ресурсы у которых нет рейтинга, то необходимо использовать параметр leftJoin.
                                                      Если необходимо отсортировать сначала по значению рйтинга, а потом по количеству голосов, то так:
                                                      &sortby = `{"SimpleRating.rating_value":"DESC","SimpleRating.rating_count":"DESC"}`
                                                      &select=`{
                                                          "modResource":"*",
                                                          "SimpleRating":"rating_value, rating_count"
                                                      }`
                                                      
                                                    2. Даниил
                                                      10 октября 2017, 21:53
                                                      А есть ли возможность сохранять значение рейтинга в TV?
                                                      1. Александр Мальцев
                                                        16 октября 2017, 17:26
                                                        Нет, такой возможности нет. Дополнение FiveStarRating сохраняет информацию в таблицу simple_rating. Если для этого использовать TV поля, то для этого потребуется заводить не одно, а несколько TV полей. Если же всю информацию сохранять в одно TV, то с ней будет очень затруднительно работать.
                                                        Если вам необходимо обеспечить работу с полями FiveStarRating из админки, то, как это сделать можете взять из этой инструкции.
                                                        1. Илья
                                                          20 июля 2018, 12:49
                                                          Доброго всем дня!
                                                          Такой вопрос. Мне нужно сделать сортировку по 3-м полям:
                                                          1) По популярности — компонент HitsPage
                                                          2) По рейтингу — компонент FiveStarRating
                                                          3) По новизне — publishedon
                                                          Нашёл вот такую простую сортировку modx.ru/novosti-i-stati/article/216
                                                          1) понятно как вывести, там значение записывается в TV
                                                          2) непонятно (https://itchief.ru/lessons/modx-revo/modx-how-to-add-additional-fields-to-the-resource), почитал статью и не понял как это всё соединить.
                                                          3) понятно.

                                                          Помогите разобраться. Или может уже есть какое то обновление и значение рейтинга записывается в TV
                                                          1. Александр Мальцев
                                                            21 июля 2018, 06:10
                                                            Чтобы соединить записи из таблиц используются соединения (leftJoin, innerJoin и др.). Для TV просто уже прописаны некоторые механизмы и когда вы, например, в сниппете используете includeTVs, то эти соединения создаются этим сниппетом автоматически.
                                                            Например, для того чтобы включить в запрос FiveStarRating необходимо:
                                                            [[!pdoResources? 
                                                              &loadModels=`simplerating`
                                                              &leftJoin=`{
                                                                "SimpleRating": {
                                                                  "class":"SimpleRating",
                                                                  "on": "modResource.id = SimpleRating.resource"}
                                                              }`
                                                              &select=`{
                                                                "SimpleRating":"rating_value"
                                                              }`
                                                              &sortby' = `{
                                                                "HitsPage":"DESC",
                                                                "SimpleRating.rating_value":"DESC",
                                                                "publishedon":"DESC"
                                                              }
                                                              ...
                                                            
                                                            Сортировка указывается с помощью параметра sortby. Как это выполнить по 3-м полям указано в примере.
                                                            У этого компонента значение рейтинга не хранится в TV. Такого обновления не будет, потому что это не улучшит компонент, а наоборот только его ухудшит.
                                                            1. Илья
                                                              21 июля 2018, 13:26
                                                              Большое спасибо! Всё получилось.
                                                      2. Ivan
                                                        06 сентября 2017, 09:49
                                                        Александр, благодарю за полезную информацию и ваш труд над сайтом. Подскажите, пожалуйста, можно ли указать id для конкретного рейтинга в списке ресурсов pdoResources? Например:
                                                        [[!SimpleRating?
                                                                &id=`[[+id]]`
                                                        ]]
                                                        
                                                        1. Александр Мальцев
                                                          07 сентября 2017, 15:07
                                                          Новая версия с поддержкой данной возможности отправлена на modx.com. После проверки пакета, он будет доступен через несколько дней для обновления.
                                                          1. Ivan
                                                            07 сентября 2017, 19:05
                                                            Благодарю за оперативность, Александр!
                                                          2. Александр Мальцев
                                                            06 сентября 2017, 17:08
                                                            Спасибо. Пока данной возможности нет. Она появится в следующем релизе.
                                                            Кроме этого защита по COOKIE будет заменена на LocalStorage.
                                                          Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.