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

Александр Мальцев
Александр Мальцев
13.7K
89
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>`
]]

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

  1. MaxGmm
    MaxGmm
    21.12.2022, 01:21

    Подскажите как тут сделать сортировку по рейтингу

    [[!pdoPage?
      &element=`getComments`
      &ajaxMode=`scroll`
      &ravatarSize=`128`
      &ajaxElemMore=`#pdopage .also`
      &ajaxTplMore=`<a class="btn btn-default also" href="#" role="button">Показать ещё</a>`
    ]]
    1. Александр Мальцев
      Александр Мальцев
      21.12.2022, 14:22

      Сниппет getComments ничего не знает о звездах. Тут нужно использовать вместо getComments сниппет pdoResources и самому написать join соответствующих таблиц.

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

    И у меня возник вопрос, вот зачем записывать страницы на которых я уже ставил рейтинг в localStorage??? Проверка IP все равно производится на сервере!
  3. Zulya
    Zulya
    12.01.2022, 20:53
    Здравствуйте, Александр!
    При наведении курсора мышки на звезду, возможно ли чтобы предыдущие звездочки также приняли зеленый цвет? Сейчас окрашивается только та звезда, на котором стоит курсор мышки.
    1. sapa.dev
      sapa.dev
      10.08.2022, 12:31
      В файле: «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
      09.09.2022, 18:52
      Здравствуйте! Спасибо, что поделились кодом. Попробовала у себя, все отлично работает! Спасибо!
  4. MarCantas-602
    MarCantas-602
    08.10.2021, 09:09
    Добрый день
    Установил плагин, прописал пути к css и js файлам, они открываются по ссылкам из исходного кода. Только вот при наведении на звёздочки ничего не происходит. Там data-id и width у меня не цепляются prnt.sc/1v9fkuy
    Не могу найти причину почему. Вот пример страницы
    1. Александр Мальцев
      Александр Мальцев
      09.10.2021, 10:09
      Здравствуйте! Скрипт написан на jQuery, проверьте подключен ли перед ним jQuery.
    2. MarCantas-602
      MarCantas-602
      11.10.2021, 08:32
      jQuery у меня прописан также в футере. Дело в том, что рейтинг вызывается в виде сниппета [[!SimpleRating]] непосредственно из контента ресурса, т.е. страницы. А если я вызываю его через чанк [[$SimpleRating]] или тот же сниппет [[!SimpleRating]] в шаблоне статейных страниц, то id ресурса не цепляется
    3. MarCantas-602
      MarCantas-602
      12.10.2021, 12:28
      В общем, заработало у меня через такой сниппет, прописанный в шаблоне статейных страниц:
      [[!SimpleRating?
                         &id = `[[~[[+id]]]]`
                      ]]
  5. Валерия
    Валерия
    22.09.2020, 10:06
    Здравствуйте, Александр!
    Подскажите, пожалуйста, почему нет выводятся звезды? Только текстовое содержимое чанка — prnt.sc/ullesv
    Код был использован по умолчанию:
    [[!SimpleRating?
                &tpl = `tplSimpleRating`
    ]]
    
    1. Александр Мальцев
      Александр Мальцев
      23.09.2020, 15:16
      Здравствуйте! Проверьте путь к файлу со звездочками (изображению).
    2. Валерия
      Валерия
      23.09.2020, 17:11
      Причина в том, что не подключаются стили к чанку. Путь к стилям во всех файлах указан верно. Но почему-то блоки не видят стили — prnt.sc/umi6f3.
    3. Александр Мальцев
      Александр Мальцев
      26.09.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');
      ...
      
      Проверьте, где у вас на сервере находятся эти файлы. После этого откройте страницу в браузере и перейдите в консоль. Если браузер их не нашёл, то он это выведет в неё. В сообщениях будут указаны пути к ним. Далее нужно их сравнить. Если они не совпадают, то ошибка кроется в них. А если нет, то нужно разбираться дальше. Можно также ещё попробовать очистить кэш.
    4. Валерия
      Валерия
      28.09.2020, 11:31
      Путь верный, файлы доступны по ссылкам. В консоли нет ошибок касаемо этих стилей.
      Но в источниках нет папки сниппета simplerating.
      Вот ссылка на сайт, может так Вы сможете мне помочь.
    5. Александр Мальцев
      Александр Мальцев
      28.09.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, может из-за него такие проблемы.
    6. Валерия
      Валерия
      28.09.2020, 14:56
      Спасибо, теперь все вышло!
  6. Ruslan
    Ruslan
    28.12.2019, 01:44
    При нажатии ничего не происходит.
    Перестал работать, как выявить причину?
    Я догадываюсь, что это скорее всего что-то с обработчиком action.php
    Посмотреть на сайте
    1. Ruslan
      Ruslan
      29.12.2019, 06:23
      Проблему решил
    2. Александр Мальцев
      Александр Мальцев
      29.12.2019, 13:37
      Отлично!
  7. Ruslan
    Ruslan
    28.12.2019, 01:43
    При нажатии ничего не происходит.
    Перестал работать, как выявить причину?
    Я догадываюсь, что это скорее всего что-то с обработчиком action.php
  8. Ruslan
    Ruslan
    28.12.2019, 01:16
    Здравствуйте.
    Перестал работать, при нажатии ничего не происходит.
    Как выявить причину и с чем это может быть связано?
    Посмотреть на сайте
  9. Евгений Николаевич Мястовский
    Евгений Николаевич Мястовский
    02.12.2019, 20:52
    Александр, подскажите, как кастомизировать звёзды? Сделать меньше, поменять цвет и т.д. Нужно что бы они были примерно как дефолтные-золотистые. Приобрёл goodstar компонент, но что то он не хочет работать корректно.
    1. Александр Мальцев
      Александр Мальцев
      03.12.2019, 02:00
      Сейчас, только правкой изображения, CSS и возможно других файлов.
      В планах улучшить этот компонент, в частности сделать звёзды в формате svg. После этого операции по внешнему оформлению звёзд можно будет очень просто выполнять с помощью CSS.
  10. Mish
    Mish
    25.10.2019, 20:20
    Доброго. Скажите пожайлуста как сделать рейтинг из 10 звезд?
    1. Александр Мальцев
      Александр Мальцев
      27.10.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,

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

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

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

    1. Александр Мальцев
      Александр Мальцев
      17.05.2019, 15:46
      Добрый! Не нужно ничего поправлять. Очистите кэш MODX, браузера. Попробуйте ещё раз.
  16. alex G
    alex G
    10.12.2018, 18:32
    Здравствуйте, возникла необходимость скрытия блока после голосования (сохранить оценку текстовую а звёздочки скрыть), и запустить js действие, подскажите пожалуйста как правильно это реализовать?
    1. Александр Мальцев
      Александр Мальцев
      11.12.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');
      
  17. Сеокотов
    Сеокотов
    01.11.2018, 16:15
    А реально сделать так чтобы только в комментарии через tickets была возможность ставить оценку?
    1. Александр Мальцев
      Александр Мальцев
      04.11.2018, 04:38
      Сделать то всё возможно, но придётся много переделывать.
  18. Константин
    Константин
    06.09.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.09.2018, 12:39
      Еще в этом файле
      https://.../assets/components/simplerating/js/web/default.js
      Ругается на 42 строку:
      $.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
    2. Александр Мальцев
      Александр Мальцев
      06.09.2018, 13:53
      Добрый!
      Необходимо проверить, действительно ли такой путь до файла action.php.
      Если это так, то проверить можно ли из клиента (браузера) обратиться к нему. Например, введя URL в адресную строку браузера:
      https://.../action.php
    3. Константин
      Константин
      06.09.2018, 20:05
      Обратился в техподдержку хостинга. Все решили. В чем проблема была я не уточнял. Спасибо за отклик.
  19. Антон
    Антон
    14.08.2018, 20:12
    Александр добрый день подскажите а где можно почистить рейтинг (обнулить например) или посмотреть. Если есть такая возможность)
    1. Александр Мальцев
      Александр Мальцев
      19.08.2018, 07:48
      Добрый! Встроенной такой возможности нет. Можно попробывать это реализовать по этой инструкции.
  20. Сеокотов
    Сеокотов
    12.07.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.07.2018, 16:42
      Необходимо в &select перечислить поля, которые нужно получить. Ну, или использовать *, чтобы получить все поля.
      &select=`{
          "modResource":"id,pagetitle,alias",
      
    2. Сеокотов
      Сеокотов
      12.07.2018, 16:54
      о, супер, спасибо!
      а подскажите еще такой момент, как вывести на превьюшке к примеру просто звездочку с текущей оценкой, то есть тот статус который на данный момент имеет страница
      либо весь ряд звезд?
    3. Александр Мальцев
      Александр Мальцев
      12.07.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> 
      
  21. Константин
    Константин
    09.07.2018, 22:08
    Добрый вечер! А как переписать вывод рейтинговых ресурсов, но только на Fenom и используя Tickets? Пробую сам, сортирует вроде как нужно, но выводятся только ресурсы, которым поставили оценку, остальные пропадают. Что-то где-то не учел, а что, не могу понять.
    1. Александр Мальцев
      Александр Мальцев
      10.07.2018, 14:02
      Добрый! &innerJoin замените на &leftJoin.
    2. Константин
      Константин
      13.07.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 работает норм. т.е. все отмеченные галочкой ресурсы закрепляются вначале и даже сортировка по рейтингу среди них происходит отлично. Но в остальных ресурсах происходит хаос. Сортировка по рейтингу не работает. Материал с низшим рейтингом может стоять выше материала с высшим рейтингом.

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

      А Вам огромное спасибо, что находите время, чтобы помочь таким как я!
    6. Александр Мальцев
      Александр Мальцев
      16.07.2018, 16:34
      Отлично!
  22. Дмитрий
    Дмитрий
    01.12.2017, 22:33
    Добрый вечер. Подскажите пожалуйста как вывести рейтинг в превью на странице вывода нескольких элементов? Чтобы отображал у каждого свой
    1. Дмитрий
      Дмитрий
      03.12.2017, 10:37
      Решение нашел
  23. ilyaib
    ilyaib
    17.11.2017, 20:52
    А с fenome не дружит? пытаюсь заменить в чанке [[+id]] на {$id} не выводит
    1. Александр Мальцев
      Александр Мальцев
      18.11.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)
      ));
      
  24. kalisto
    kalisto
    25.10.2017, 23:50
    Здравствуйте Александр!
    Почему-то идет ошибка.
    Как исправить?
    1. kalisto
      kalisto
      26.10.2017, 00:11
      Ой прошу прощения убрала расширение .html
      Выдает ошибку в 42 строке (файл default.js):
      $.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
      Как исправить? Или рейтинг не работает по другой причине?
    2. Александр Мальцев
      Александр Мальцев
      26.10.2017, 11:24
      Здравствуйте. Необходимо подключить библиотеку jQuery.
    3. kalisto
      kalisto
      26.10.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 подключить.
    4. Александр Мальцев
      Александр Мальцев
      26.10.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>
  25. Ми
    Ми
    14.10.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.10.2017, 16:49
      Добрый вечер!
      Если необходимо вывести ресурсы у которых нет рейтинга, то необходимо использовать параметр leftJoin.
      Если необходимо отсортировать сначала по значению рйтинга, а потом по количеству голосов, то так:
      &sortby = `{"SimpleRating.rating_value":"DESC","SimpleRating.rating_count":"DESC"}`
      &select=`{
          "modResource":"*",
          "SimpleRating":"rating_value, rating_count"
      }`
      
  26. Даниил
    Даниил
    10.10.2017, 21:53
    А есть ли возможность сохранять значение рейтинга в TV?
    1. Александр Мальцев
      Александр Мальцев
      16.10.2017, 17:26
      Нет, такой возможности нет. Дополнение FiveStarRating сохраняет информацию в таблицу simple_rating. Если для этого использовать TV поля, то для этого потребуется заводить не одно, а несколько TV полей. Если же всю информацию сохранять в одно TV, то с ней будет очень затруднительно работать.
      Если вам необходимо обеспечить работу с полями FiveStarRating из админки, то, как это сделать можете взять из этой инструкции.
    2. Илья
      Илья
      20.07.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
    3. Александр Мальцев
      Александр Мальцев
      21.07.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. Такого обновления не будет, потому что это не улучшит компонент, а наоборот только его ухудшит.
    4. Илья
      Илья
      21.07.2018, 13:26
      Большое спасибо! Всё получилось.
  27. Ivan
    Ivan
    06.09.2017, 09:49
    Александр, благодарю за полезную информацию и ваш труд над сайтом. Подскажите, пожалуйста, можно ли указать id для конкретного рейтинга в списке ресурсов pdoResources? Например:
    [[!SimpleRating?
            &id=`[[+id]]`
    ]]
    
    1. Александр Мальцев
      Александр Мальцев
      06.09.2017, 17:08
      Спасибо. Пока данной возможности нет. Она появится в следующем релизе.
      Кроме этого защита по COOKIE будет заменена на LocalStorage.
    2. Александр Мальцев
      Александр Мальцев
      07.09.2017, 15:07
      Новая версия с поддержкой данной возможности отправлена на modx.com. После проверки пакета, он будет доступен через несколько дней для обновления.
    3. Ivan
      Ivan
      07.09.2017, 19:05
      Благодарю за оперативность, Александр!