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

Александр Мальцев
Александр Мальцев
13K
87
MODX - Звёздный рейтинг для статей сайта
Содержание:
  1. Дополнение FiveStarRating
  2. Вывод ресурсов с самым большим рейтингом
  3. Комментарии

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

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

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

Дополнение FiveStarRating

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

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

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

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

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

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 адресу

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

В качестве заключения рассмотрим, как можно вывести на страницу 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>`
]]

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

  1. sapa.dev
    sapa.dev
    2022-08-10 12:19:56
    Установил пакет. Для тестирования начал клацать по рейтингу. Все работает — классно. Но тестирование подразумевает множественное повторение. Залез в базу, удалил запись и БАЦ — я все равно не могу ставить рейтинг, хотя рейтинг пустой. Чего только не делал… и переустанавливал пакет, и чистил куки с историей за все время… итог один — не дает и все. В конечном счете пришлось разбираться в коде.

    И у меня возник вопрос, вот зачем записывать страницы на которых я уже ставил рейтинг в localStorage??? Проверка IP все равно производится на сервере!
  1. Zulya
    Zulya
    2022-01-12 20:53:36
    Здравствуйте, Александр!
    При наведении курсора мышки на звезду, возможно ли чтобы предыдущие звездочки также приняли зеленый цвет? Сейчас окрашивается только та звезда, на котором стоит курсор мышки.
    1. sapa.dev
      sapa.dev
      2022-08-10 12:31:15
      В файле: «assets/components/simplerating/js/web/default.js» заменил это:
      $(document).on('mouseenter', rating_star_class, function () {
              $(this).closest('.rating__best').addClass('rating__best_hover');
              $(this).closest('.rating__best').find('.rating__star').not(this).addClass('rating__star_opacity');
              $(this).addClass('rating__star_hover');
          });
      на это:
      $(document).on('mouseenter', rating_star_class, function () {
              var current = Number( $(this).attr('data-title') );
              $(this).closest('.rating__best').addClass('rating__best_hover');
              $(this).closest('.rating__best').find('.rating__star').each( function( index, star ) {
                  var value = Number( $(star).attr('data-title') );
                  if( current >= value )
                      $(star).addClass('rating__star_hover');
                  else
                      $(star).addClass('rating__star_opacity');
              } );
          });
    2. Zulya
      Zulya
      2022-09-09 18:52:53
      Здравствуйте! Спасибо, что поделились кодом. Попробовала у себя, все отлично работает! Спасибо!
  2. MarCantas-602
    MarCantas-602
    2021-10-08 09:09:51
    Добрый день
    Установил плагин, прописал пути к css и js файлам, они открываются по ссылкам из исходного кода. Только вот при наведении на звёздочки ничего не происходит. Там data-id и width у меня не цепляются prnt.sc/1v9fkuy
    Не могу найти причину почему. Вот пример страницы
    1. Александр Мальцев
      Александр Мальцев
      2021-10-09 10:09:06
      Здравствуйте! Скрипт написан на jQuery, проверьте подключен ли перед ним jQuery.
    2. MarCantas-602
      MarCantas-602
      2021-10-11 08:32:59
      jQuery у меня прописан также в футере. Дело в том, что рейтинг вызывается в виде сниппета [[!SimpleRating]] непосредственно из контента ресурса, т.е. страницы. А если я вызываю его через чанк [[$SimpleRating]] или тот же сниппет [[!SimpleRating]] в шаблоне статейных страниц, то id ресурса не цепляется
    3. MarCantas-602
      MarCantas-602
      2021-10-12 12:28:37
      В общем, заработало у меня через такой сниппет, прописанный в шаблоне статейных страниц:
      [[!SimpleRating?
                         &id = `[[~[[+id]]]]`
                      ]]
  3. Валерия
    Валерия
    2020-09-22 10:06:46
    Здравствуйте, Александр!
    Подскажите, пожалуйста, почему нет выводятся звезды? Только текстовое содержимое чанка — prnt.sc/ullesv
    Код был использован по умолчанию:
    [[!SimpleRating?
                &tpl = `tplSimpleRating`
    ]]
    
    1. Александр Мальцев
      Александр Мальцев
      2020-09-23 15:16:19
      Здравствуйте! Проверьте путь к файлу со звездочками (изображению).
    2. Валерия
      Валерия
      2020-09-23 17:11:49
      Причина в том, что не подключаются стили к чанку. Путь к стилям во всех файлах указан верно. Но почему-то блоки не видят стили — prnt.sc/umi6f3.
    3. Александр Мальцев
      Александр Мальцев
      2020-09-26 15:27:17
      Подключение стилей происходит в сниппете SimpleRating:
      <?php
      $modx->regClientCSS(MODX_ASSETS_URL . 'components/simplerating/css/web/default.css');
      $modx->regClientScript(MODX_ASSETS_URL . 'components/simplerating/js/web/default.js');
      ...
      
      Проверьте, где у вас на сервере находятся эти файлы. После этого откройте страницу в браузере и перейдите в консоль. Если браузер их не нашёл, то он это выведет в неё. В сообщениях будут указаны пути к ним. Далее нужно их сравнить. Если они не совпадают, то ошибка кроется в них. А если нет, то нужно разбираться дальше. Можно также ещё попробовать очистить кэш.
    4. Валерия
      Валерия
      2020-09-28 11:31:52
      Путь верный, файлы доступны по ссылкам. В консоли нет ошибок касаемо этих стилей.
      Но в источниках нет папки сниппета simplerating.
      Вот ссылка на сайт, может так Вы сможете мне помочь.
    5. Александр Мальцев
      Александр Мальцев
      2020-09-28 14:37:37
      Да, они не подхватываются. Подключите их на страницу самостоятельно:
      <link rel="stylesheet" href="/assets/components/simplerating/css/web/default.css">
      <script src="/assets/components/simplerating/js/web/default.js"></script>
      
      Вы используете MinifyX, может из-за него такие проблемы.
    6. Валерия
      Валерия
      2020-09-28 14:56:34
      Спасибо, теперь все вышло!
  4. Ruslan
    Ruslan
    2019-12-28 01:44:04
    При нажатии ничего не происходит.
    Перестал работать, как выявить причину?
    Я догадываюсь, что это скорее всего что-то с обработчиком action.php
    Посмотреть на сайте
    1. Ruslan
      Ruslan
      2019-12-29 06:23:39
      Проблему решил
    2. Александр Мальцев
      Александр Мальцев
      2019-12-29 13:37:38
      Отлично!
  5. Ruslan
    Ruslan
    2019-12-28 01:43:04
    При нажатии ничего не происходит.
    Перестал работать, как выявить причину?
    Я догадываюсь, что это скорее всего что-то с обработчиком action.php
    1. Ruslan
      Ruslan
      2019-12-28 01:16:04
      Здравствуйте.
      Перестал работать, при нажатии ничего не происходит.
      Как выявить причину и с чем это может быть связано?
      Посмотреть на сайте
      1. Евгений Николаевич Мястовский
        Евгений Николаевич Мястовский
        2019-12-02 20:52:02
        Александр, подскажите, как кастомизировать звёзды? Сделать меньше, поменять цвет и т.д. Нужно что бы они были примерно как дефолтные-золотистые. Приобрёл goodstar компонент, но что то он не хочет работать корректно.
        1. Александр Мальцев
          Александр Мальцев
          2019-12-03 02:00:57
          Сейчас, только правкой изображения, CSS и возможно других файлов.
          В планах улучшить этот компонент, в частности сделать звёзды в формате svg. После этого операции по внешнему оформлению звёзд можно будет очень просто выполнять с помощью CSS.
      2. Mish
        Mish
        2019-10-25 20:20:45
        Доброго. Скажите пожайлуста как сделать рейтинг из 10 звезд?
        1. Александр Мальцев
          Александр Мальцев
          2019-10-27 14:17:13
          Привет! Для этого нужно произвести изменения в 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,

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

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

          P.S. кому в лом рисовать 10 звездочек вот: ibb.co/YDyyxXC
        3. Александр Мальцев
          Александр Мальцев
          2019-10-28 13:49:26
          Да, там размер числа не позволяет это выполнить.
          Для этого нужно выполнить следующие шаги:
          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. Выполнить данный файл.
        4. Александр Мальцев
          Александр Мальцев
          2019-10-28 13:55:43
          В текущей версии нет учета оценок, оставленных авторизированными пользователями.
      3. Андрей
        Андрей
        2019-10-12 23:10:46
        Здравствуйте, Александр!
        Скажите пожалуйста, как я могу кастомизировать звёзды? Хотелось бы вместо png поставить svg звёзды.
        Заранее благодарю за ответ
        1. Александр Мальцев
          Александр Мальцев
          2019-10-13 10:40:39
          Привет!
          В компоненте это реализовано через спрайт, и, следовательно, так просто это изменить нельзя. Сначала нужно хорошее решение для вывода звёздного рейтинга через SVG? Например, как с помощью SVG звездочек отобразить рейтинг 4.3?
        2. Андрей
          Андрей
          2019-10-13 10:57:43
          Точно, в целом с точки зрения реализации верстки это весьма проблематично.
          Ладно, тогда вопрос другой, как тогда убрать цифры в спрайте так, чтобы ничего не съехало?
        3. Андрей
          Андрей
          2019-10-13 11:23:05
          Александр, еще один вопрос возник, касаемо вывода ресурсов с рейтингом.
          Сейчас по Вашей формуле в pdoPage выводит ресурсы по популярности.
          Но в случае, если у ресурса еще не было голосов, еще нет в списке. Как можно поправить данный момент?
        4. Александр Мальцев
          Александр Мальцев
          2019-10-13 13:51:24
          Заменить &innerJoin на &leftJoin.
        5. Александр Мальцев
          Александр Мальцев
          2019-10-13 13:59:18
          Как с помощью SVG это реализовать идея появилась, тут нужно просто использовать наложение изображений.
          Чтобы убать цифры необходимо просто изменить стили, а именно CSS-свойство height:
          .rating {
            height: 25px;
          }
          .rating__best {
            height: 25px;
          }
          .rating__current {
            height: 25px;
          }
          .rating__star {
            height: 25px;
          }
          
      4. Сергей
        Сергей
        2019-10-10 10:44:57
        Добрый день. Как можно сделать 10 звездочек вместо 5 и можно ли? Почему-то не реагирует вообще на параметр tpl — прописал там 10 все равно 5 выводит, прописал 4 — тоже 5 выводит
        1. Сергей
          Сергей
          2019-10-10 10:57:22
          Кажется стал разбираться, потом отпишу решение
        2. Александр Мальцев
          Александр Мальцев
          2019-10-10 15:48:17
          Хорошо
        3. Сергей
          Сергей
          2019-10-10 16:34:55
          Александр, скажите есть возможность из коробки только вывести рейтинг без возможности голосования?
        4. Александр Мальцев
          Александр Мальцев
          2019-10-11 14:13:41
          Конечно можно. Делаете копию чанка tplSimpleRating, удаляете в нём [[+rating_active]] и указываете его сниппету SimpleRating.
          [[!SimpleRating?
            &tpl = `mytplSimpleRating`
          ]]
          
      5. Максим
        Максим
        2019-08-28 02:02:15
        Приветствую Александр,
        Спасибо за проделанную работу и вопрос: Я использую популярную МОДХ экстра Babel для создания мультиязычного вебсайта. Каждая языковая версия «живет» на отдельном контексте и имеет свой id. То есть языковые версии представляют собой разные, хотя и связанные ресурсы. Можно ли сделать так, чтобы рейтинг не дробился между английской и русской страницами сайта?
        1. Максим
          Максим
          2019-08-29 12:06:33
          Ответ подсказали, делюсь если вдруг кому-то будет интересно.
          У моего сайта два языка (русский и английский). На русском рейтинг выводится [[!SimpleRating]].
          На англйском [[!SimpleRating? &id=`[[BabelTranslation? &contextKey=`web`]]`]]
          где BabelTranslation? &contextKey=`web` это id русского ресурса, с которым залинкован данный английский ресурс.
      6. flintotake
        flintotake
        2019-08-18 00:23:48
        Доброго времени суток. Подскажите, есть ли возможность в выводе популярных ресурсов через pdoResources результаты вывода сделать ссылками на сами ресурсы?
        Спасибо.
        1. Александр Мальцев
          Александр Мальцев
          2019-08-26 14:01:27
          Доброго. Выберите uri ресурса, оберните с помощью элемента a нужные элементы и укажите выбранное поле в качестве значения href.
        2. flintotake
          flintotake
          2019-08-30 22:37:37
          можно пример?
        3. Александр Мальцев
          Александр Мальцев
          2019-09-04 14:43:51
          Например, так:
          [[!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>`
          ]]
          
      7. greeg
        greeg
        2019-05-17 00:32:59
        добрый день у меня перестал работать FiveStar Rating после переноса каталога core на уровень выше, не зашитует голоса. где надо поправить? зарание спасибо

        1. Александр Мальцев
          Александр Мальцев
          2019-05-17 15:46:39
          Добрый! Не нужно ничего поправлять. Очистите кэш MODX, браузера. Попробуйте ещё раз.
      8. alex G
        alex G
        2018-12-10 18:32:11
        Здравствуйте, возникла необходимость скрытия блока после голосования (сохранить оценку текстовую а звёздочки скрыть), и запустить js действие, подскажите пожалуйста как правильно это реализовать?
        1. Александр Мальцев
          Александр Мальцев
          2018-12-11 14:18:37
          Здравствуйте!
          Для этого в 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');
          
      9. Сеокотов
        Сеокотов
        2018-11-01 16:15:18
        А реально сделать так чтобы только в комментарии через tickets была возможность ставить оценку?
        1. Александр Мальцев
          Александр Мальцев
          2018-11-04 04:38:31
          Сделать то всё возможно, но придётся много переделывать.
      10. Константин
        Константин
        2018-09-06 12:22:20
        Добрый день! Александр, может Вы мне поможете. При переносе сайта на новый хостинг. перестало правильно работать голосование. А именно, при клике на звездочку ничего не происходит. Не видно сразу, что я оставил оценку, хотя данные в базу заносятся и при обновлении странички оставленную мной оценку я вижу. Еще я могу проголосовать бесконечное количество раз. И все оценки засчитываются и средний рейтинг выводится.
        В консоли браузера следующие ошибки:
        POST https://.../assets/components/simplerating/action.php 500 (Internal Server Error)
        POST https://.../assets/components/simplerating/action.php 502 (Bad Gateway)
        
        В админке, в журнале ошибок ничего нет.

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

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

        [[!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. Александр Мальцев
          Александр Мальцев
          2018-07-12 16:42:30
          Необходимо в &select перечислить поля, которые нужно получить. Ну, или использовать *, чтобы получить все поля.
          &select=`{
              "modResource":"id,pagetitle,alias",
          
        2. Сеокотов
          Сеокотов
          2018-07-12 16:54:07
          о, супер, спасибо!
          а подскажите еще такой момент, как вывести на превьюшке к примеру просто звездочку с текущей оценкой, то есть тот статус который на данный момент имеет страница
          либо весь ряд звезд?
        3. Александр Мальцев
          Александр Мальцев
          2018-07-12 17:47:36
          Можно, в данном случае, в чанк 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> 
          
      13. Константин
        Константин
        2018-07-09 22:08:23
        Добрый вечер! А как переписать вывод рейтинговых ресурсов, но только на Fenom и используя Tickets? Пробую сам, сортирует вроде как нужно, но выводятся только ресурсы, которым поставили оценку, остальные пропадают. Что-то где-то не учел, а что, не могу понять.
        1. Александр Мальцев
          Александр Мальцев
          2018-07-10 14:02:34
          Добрый! &innerJoin замените на &leftJoin.
        2. Константин
          Константин
          2018-07-13 17:16:40
          Спасибо! Все работает! Не могли бы Вы еще помочь в одной проблеме. Мне, кроме сортировки по рейтингу понадобилась возможность закреплять некоторые записи в начале списка. Для это я создал доп. поле 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 работает норм. т.е. все отмеченные галочкой ресурсы закрепляются вначале и даже сортировка по рейтингу среди них происходит отлично. Но в остальных ресурсах происходит хаос. Сортировка по рейтингу не работает. Материал с низшим рейтингом может стоять выше материала с высшим рейтингом.

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

          А Вам огромное спасибо, что находите время, чтобы помочь таким как я!
        6. Александр Мальцев
          Александр Мальцев
          2018-07-16 16:34:31
          Отлично!
      14. Дмитрий
        Дмитрий
        2017-12-01 22:33:43
        Добрый вечер. Подскажите пожалуйста как вывести рейтинг в превью на странице вывода нескольких элементов? Чтобы отображал у каждого свой
        1. Дмитрий
          Дмитрий
          2017-12-03 10:37:48
          Решение нашел
      15. ilyaib
        ilyaib
        2017-11-17 20:52:02
        А с fenome не дружит? пытаюсь заменить в чанке [[+id]] на {$id} не выводит
        1. Александр Мальцев
          Александр Мальцев
          2017-11-18 17:40:27
          Для поддержки 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)
          ));
          
      16. kalisto
        kalisto
        2017-10-25 23:50:43
        Здравствуйте Александр!
        Почему-то идет ошибка.
        Как исправить?
        1. kalisto
          kalisto
          2017-10-26 00:11:28
          Ой прошу прощения убрала расширение .html
          Выдает ошибку в 42 строке (файл default.js):
          $.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
          Как исправить? Или рейтинг не работает по другой причине?
        2. Александр Мальцев
          Александр Мальцев
          2017-10-26 11:24:38
          Здравствуйте. Необходимо подключить библиотеку jQuery.
        3. kalisto
          kalisto
          2017-10-26 12:03:45
          Спасибо за ответ. Я подключаю биб-ку в проекте (скачала, 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 подключить.
        4. Александр Мальцев
          Александр Мальцев
          2017-10-26 13:39:15
          Нужно обычный jQuery, не slim. Slim — это урезанная версия jQuery без AJAX функций и прочих «вкусностей». migrate — он предназначен для поддержки устаревших функций, которые не стало в 3 версии jQuery. Данный компонент не использует устаревшие функции jQuery, его можете не подключать.
          В вашем коде необходимо 1 строчку заменить на следующую:
          <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
      17. Ми
        Ми
        2017-10-14 19:35:11
        Добрый вечер!
        возникла проблема что не выводит список согласно количества голосов

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

        вот вывод
        [[!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. Александр Мальцев
          Александр Мальцев
          2017-10-16 16:49:50
          Добрый вечер!
          Если необходимо вывести ресурсы у которых нет рейтинга, то необходимо использовать параметр leftJoin.
          Если необходимо отсортировать сначала по значению рйтинга, а потом по количеству голосов, то так:
          &sortby = `{"SimpleRating.rating_value":"DESC","SimpleRating.rating_count":"DESC"}`
          &select=`{
              "modResource":"*",
              "SimpleRating":"rating_value, rating_count"
          }`
          
      18. Даниил
        Даниил
        2017-10-10 21:53:27
        А есть ли возможность сохранять значение рейтинга в TV?
        1. Александр Мальцев
          Александр Мальцев
          2017-10-16 17:26:38
          Нет, такой возможности нет. Дополнение FiveStarRating сохраняет информацию в таблицу simple_rating. Если для этого использовать TV поля, то для этого потребуется заводить не одно, а несколько TV полей. Если же всю информацию сохранять в одно TV, то с ней будет очень затруднительно работать.
          Если вам необходимо обеспечить работу с полями FiveStarRating из админки, то, как это сделать можете взять из этой инструкции.
        2. Илья
          Илья
          2018-07-20 12:49:58
          Доброго всем дня!
          Такой вопрос. Мне нужно сделать сортировку по 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
        3. Александр Мальцев
          Александр Мальцев
          2018-07-21 06:10:02
          Чтобы соединить записи из таблиц используются соединения (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. Такого обновления не будет, потому что это не улучшит компонент, а наоборот только его ухудшит.
        4. Илья
          Илья
          2018-07-21 13:26:16
          Большое спасибо! Всё получилось.
      19. Ivan
        Ivan
        2017-09-06 09:49:45
        Александр, благодарю за полезную информацию и ваш труд над сайтом. Подскажите, пожалуйста, можно ли указать id для конкретного рейтинга в списке ресурсов pdoResources? Например:
        [[!SimpleRating?
                &id=`[[+id]]`
        ]]
        
        1. Александр Мальцев
          Александр Мальцев
          2017-09-06 17:08:17
          Спасибо. Пока данной возможности нет. Она появится в следующем релизе.
          Кроме этого защита по COOKIE будет заменена на LocalStorage.
        2. Александр Мальцев
          Александр Мальцев
          2017-09-07 15:07:33
          Новая версия с поддержкой данной возможности отправлена на modx.com. После проверки пакета, он будет доступен через несколько дней для обновления.
        3. Ivan
          Ivan
          2017-09-07 19:05:40
          Благодарю за оперативность, Александр!