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

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

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

  1. 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.
      1. MarCantas-602
        MarCantas-602
        11.10.2021, 08:32
        jQuery у меня прописан также в футере. Дело в том, что рейтинг вызывается в виде сниппета [[!SimpleRating]] непосредственно из контента ресурса, т.е. страницы. А если я вызываю его через чанк [[$SimpleRating]] или тот же сниппет [[!SimpleRating]] в шаблоне статейных страниц, то id ресурса не цепляется
        1. MarCantas-602
          MarCantas-602
          12.10.2021, 12:28
          В общем, заработало у меня через такой сниппет, прописанный в шаблоне статейных страниц:
          [[!SimpleRating?
                             &id = `[[~[[+id]]]]`
                          ]]
    2. Валерия
      Валерия
      22.09.2020, 10:06
      Здравствуйте, Александр!
      Подскажите, пожалуйста, почему нет выводятся звезды? Только текстовое содержимое чанка — prnt.sc/ullesv
      Код был использован по умолчанию:
      [[!SimpleRating?
                  &tpl = `tplSimpleRating`
      ]]
      
      1. Александр Мальцев
        Александр Мальцев
        23.09.2020, 15:16
        Здравствуйте! Проверьте путь к файлу со звездочками (изображению).
        1. Валерия
          Валерия
          23.09.2020, 17:11
          Причина в том, что не подключаются стили к чанку. Путь к стилям во всех файлах указан верно. Но почему-то блоки не видят стили — prnt.sc/umi6f3.
          1. Александр Мальцев
            Александр Мальцев
            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');
            ...
            
            Проверьте, где у вас на сервере находятся эти файлы. После этого откройте страницу в браузере и перейдите в консоль. Если браузер их не нашёл, то он это выведет в неё. В сообщениях будут указаны пути к ним. Далее нужно их сравнить. Если они не совпадают, то ошибка кроется в них. А если нет, то нужно разбираться дальше. Можно также ещё попробовать очистить кэш.
            1. Валерия
              Валерия
              28.09.2020, 11:31
              Путь верный, файлы доступны по ссылкам. В консоли нет ошибок касаемо этих стилей.
              Но в источниках нет папки сниппета simplerating.
              Вот ссылка на сайт, может так Вы сможете мне помочь.
              1. Александр Мальцев
                Александр Мальцев
                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, может из-за него такие проблемы.
                1. Валерия
                  Валерия
                  28.09.2020, 14:56
                  Спасибо, теперь все вышло!
      2. Ruslan
        Ruslan
        28.12.2019, 01:44
        При нажатии ничего не происходит.
        Перестал работать, как выявить причину?
        Я догадываюсь, что это скорее всего что-то с обработчиком action.php
        Посмотреть на сайте
        1. Ruslan
          Ruslan
          29.12.2019, 06:23
          Проблему решил
          1. Александр Мальцев
            Александр Мальцев
            29.12.2019, 13:37
            Отлично!
        2. Ruslan
          Ruslan
          28.12.2019, 01:43
          При нажатии ничего не происходит.
          Перестал работать, как выявить причину?
          Я догадываюсь, что это скорее всего что-то с обработчиком action.php
          1. Ruslan
            Ruslan
            28.12.2019, 01:16
            Здравствуйте.
            Перестал работать, при нажатии ничего не происходит.
            Как выявить причину и с чем это может быть связано?
            Посмотреть на сайте
            1. Евгений Николаевич Мястовский
              Евгений Николаевич Мястовский
              02.12.2019, 20:52
              Александр, подскажите, как кастомизировать звёзды? Сделать меньше, поменять цвет и т.д. Нужно что бы они были примерно как дефолтные-золотистые. Приобрёл goodstar компонент, но что то он не хочет работать корректно.
              1. Александр Мальцев
                Александр Мальцев
                03.12.2019, 02:00
                Сейчас, только правкой изображения, CSS и возможно других файлов.
                В планах улучшить этот компонент, в частности сделать звёзды в формате svg. После этого операции по внешнему оформлению звёзд можно будет очень просто выполнять с помощью CSS.
              2. 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,

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

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

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

                              1. Александр Мальцев
                                Александр Мальцев
                                17.05.2019, 15:46
                                Добрый! Не нужно ничего поправлять. Очистите кэш MODX, браузера. Попробуйте ещё раз.
                              2. 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');
                                  
                                2. Сеокотов
                                  Сеокотов
                                  01.11.2018, 16:15
                                  А реально сделать так чтобы только в комментарии через tickets была возможность ставить оценку?
                                  1. Александр Мальцев
                                    Александр Мальцев
                                    04.11.2018, 04:38
                                    Сделать то всё возможно, но придётся много переделывать.
                                  2. Константин
                                    Константин
                                    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, 13:53
                                      Добрый!
                                      Необходимо проверить, действительно ли такой путь до файла action.php.
                                      Если это так, то проверить можно ли из клиента (браузера) обратиться к нему. Например, введя URL в адресную строку браузера:
                                      https://.../action.php
                                      1. Константин
                                        Константин
                                        06.09.2018, 20:05
                                        Обратился в техподдержку хостинга. Все решили. В чем проблема была я не уточнял. Спасибо за отклик.
                                      2. Константин
                                        Константин
                                        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})
                                      3. Антон
                                        Антон
                                        14.08.2018, 20:12
                                        Александр добрый день подскажите а где можно почистить рейтинг (обнулить например) или посмотреть. Если есть такая возможность)
                                        1. Александр Мальцев
                                          Александр Мальцев
                                          19.08.2018, 07:48
                                          Добрый! Встроенной такой возможности нет. Можно попробывать это реализовать по этой инструкции.
                                        2. Сеокотов
                                          Сеокотов
                                          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",
                                            
                                            1. Сеокотов
                                              Сеокотов
                                              12.07.2018, 16:54
                                              о, супер, спасибо!
                                              а подскажите еще такой момент, как вывести на превьюшке к примеру просто звездочку с текущей оценкой, то есть тот статус который на данный момент имеет страница
                                              либо весь ряд звезд?
                                              1. Александр Мальцев
                                                Александр Мальцев
                                                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> 
                                                
                                          2. Константин
                                            Константин
                                            09.07.2018, 22:08
                                            Добрый вечер! А как переписать вывод рейтинговых ресурсов, но только на Fenom и используя Tickets? Пробую сам, сортирует вроде как нужно, но выводятся только ресурсы, которым поставили оценку, остальные пропадают. Что-то где-то не учел, а что, не могу понять.
                                            1. Александр Мальцев
                                              Александр Мальцев
                                              10.07.2018, 14:02
                                              Добрый! &innerJoin замените на &leftJoin.
                                              1. Константин
                                                Константин
                                                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 работает норм. т.е. все отмеченные галочкой ресурсы закрепляются вначале и даже сортировка по рейтингу среди них происходит отлично. Но в остальных ресурсах происходит хаос. Сортировка по рейтингу не работает. Материал с низшим рейтингом может стоять выше материала с высшим рейтингом.

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

                                                    А Вам огромное спасибо, что находите время, чтобы помочь таким как я!
                                                    1. Александр Мальцев
                                                      Александр Мальцев
                                                      16.07.2018, 16:34
                                                      Отлично!
                                                    2. Константин
                                                      Константин
                                                      15.07.2018, 00:47
                                                      Спасибо, но к сожалению, изменений не произошло. Закрепленные материалы наверху, как и нужно, а дальше сортировка не работает. Попробую спросить на modx.pro. Может там кто подобное реализовывал.
                                              2. Дмитрий
                                                Дмитрий
                                                01.12.2017, 22:33
                                                Добрый вечер. Подскажите пожалуйста как вывести рейтинг в превью на странице вывода нескольких элементов? Чтобы отображал у каждого свой
                                                1. Дмитрий
                                                  Дмитрий
                                                  03.12.2017, 10:37
                                                  Решение нашел
                                                2. 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)
                                                    ));
                                                    
                                                  2. 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})
                                                      Как исправить? Или рейтинг не работает по другой причине?
                                                      1. Александр Мальцев
                                                        Александр Мальцев
                                                        26.10.2017, 11:24
                                                        Здравствуйте. Необходимо подключить библиотеку jQuery.
                                                        1. 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 подключить.
                                                          1. Александр Мальцев
                                                            Александр Мальцев
                                                            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>
                                                    2. Ми
                                                      Ми
                                                      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"
                                                        }`
                                                        
                                                      2. Даниил
                                                        Даниил
                                                        10.10.2017, 21:53
                                                        А есть ли возможность сохранять значение рейтинга в TV?
                                                        1. Александр Мальцев
                                                          Александр Мальцев
                                                          16.10.2017, 17:26
                                                          Нет, такой возможности нет. Дополнение FiveStarRating сохраняет информацию в таблицу simple_rating. Если для этого использовать TV поля, то для этого потребуется заводить не одно, а несколько TV полей. Если же всю информацию сохранять в одно TV, то с ней будет очень затруднительно работать.
                                                          Если вам необходимо обеспечить работу с полями FiveStarRating из админки, то, как это сделать можете взять из этой инструкции.
                                                          1. Илья
                                                            Илья
                                                            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
                                                            1. Александр Мальцев
                                                              Александр Мальцев
                                                              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. Такого обновления не будет, потому что это не улучшит компонент, а наоборот только его ухудшит.
                                                              1. Илья
                                                                Илья
                                                                21.07.2018, 13:26
                                                                Большое спасибо! Всё получилось.
                                                        2. Ivan
                                                          Ivan
                                                          06.09.2017, 09:49
                                                          Александр, благодарю за полезную информацию и ваш труд над сайтом. Подскажите, пожалуйста, можно ли указать id для конкретного рейтинга в списке ресурсов pdoResources? Например:
                                                          [[!SimpleRating?
                                                                  &id=`[[+id]]`
                                                          ]]
                                                          
                                                          1. Александр Мальцев
                                                            Александр Мальцев
                                                            07.09.2017, 15:07
                                                            Новая версия с поддержкой данной возможности отправлена на modx.com. После проверки пакета, он будет доступен через несколько дней для обновления.
                                                            1. Ivan
                                                              Ivan
                                                              07.09.2017, 19:05
                                                              Благодарю за оперативность, Александр!
                                                            2. Александр Мальцев
                                                              Александр Мальцев
                                                              06.09.2017, 17:08
                                                              Спасибо. Пока данной возможности нет. Она появится в следующем релизе.
                                                              Кроме этого защита по COOKIE будет заменена на LocalStorage.
                                                            Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.