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

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>`
]]

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

Вcq
Вcq

Здравствуйте. Что то странное стало происходить. Три сайта. На каждом из них можно проголосовать только 1 раз за ресурс. Потом вообще не активный рейтинг со всех устройств. Можете подсказать в чем дело? Вызов не кэшированный. Скрипт подключен без defer. Jquery есть.

P.S.

Вопрос снимается. Проблема в css. Точнее в том, что z-index ratingcurrent нужно сделать ниже остального, иначе он блокировал видимость.

MaxGmm
MaxGmm

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

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

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

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

И у меня возник вопрос, вот зачем записывать страницы на которых я уже ставил рейтинг в localStorage??? Проверка IP все равно производится на сервере!
Zulya
Zulya
Здравствуйте, Александр!
При наведении курсора мышки на звезду, возможно ли чтобы предыдущие звездочки также приняли зеленый цвет? Сейчас окрашивается только та звезда, на котором стоит курсор мышки.
sapa.dev
sapa.dev
В файле: «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');
        } );
    });
Zulya
Zulya
Здравствуйте! Спасибо, что поделились кодом. Попробовала у себя, все отлично работает! Спасибо!
MarCantas-602
MarCantas-602
Добрый день
Установил плагин, прописал пути к css и js файлам, они открываются по ссылкам из исходного кода. Только вот при наведении на звёздочки ничего не происходит. Там data-id и width у меня не цепляются prnt.sc/1v9fkuy
Не могу найти причину почему. Вот пример страницы
Александр Мальцев
Александр Мальцев
Здравствуйте! Скрипт написан на jQuery, проверьте подключен ли перед ним jQuery.
MarCantas-602
MarCantas-602
jQuery у меня прописан также в футере. Дело в том, что рейтинг вызывается в виде сниппета [[!SimpleRating]] непосредственно из контента ресурса, т.е. страницы. А если я вызываю его через чанк [[$SimpleRating]] или тот же сниппет [[!SimpleRating]] в шаблоне статейных страниц, то id ресурса не цепляется
MarCantas-602
MarCantas-602
В общем, заработало у меня через такой сниппет, прописанный в шаблоне статейных страниц:
[[!SimpleRating?
                   &id = `[[~[[+id]]]]`
                ]]
Валерия
Валерия
Здравствуйте, Александр!
Подскажите, пожалуйста, почему нет выводятся звезды? Только текстовое содержимое чанка — prnt.sc/ullesv
Код был использован по умолчанию:
[[!SimpleRating?
            &tpl = `tplSimpleRating`
]]
Александр Мальцев
Александр Мальцев
Здравствуйте! Проверьте путь к файлу со звездочками (изображению).
Валерия
Валерия
Причина в том, что не подключаются стили к чанку. Путь к стилям во всех файлах указан верно. Но почему-то блоки не видят стили — prnt.sc/umi6f3.
Александр Мальцев
Александр Мальцев
Подключение стилей происходит в сниппете SimpleRating:
<?php
$modx->regClientCSS(MODX_ASSETS_URL . 'components/simplerating/css/web/default.css');
$modx->regClientScript(MODX_ASSETS_URL . 'components/simplerating/js/web/default.js');
...
Проверьте, где у вас на сервере находятся эти файлы. После этого откройте страницу в браузере и перейдите в консоль. Если браузер их не нашёл, то он это выведет в неё. В сообщениях будут указаны пути к ним. Далее нужно их сравнить. Если они не совпадают, то ошибка кроется в них. А если нет, то нужно разбираться дальше. Можно также ещё попробовать очистить кэш.
Валерия
Валерия
Путь верный, файлы доступны по ссылкам. В консоли нет ошибок касаемо этих стилей.
Но в источниках нет папки сниппета simplerating.
Вот ссылка на сайт, может так Вы сможете мне помочь.
Александр Мальцев
Александр Мальцев
Да, они не подхватываются. Подключите их на страницу самостоятельно:
<link rel="stylesheet" href="/assets/components/simplerating/css/web/default.css">
<script src="/assets/components/simplerating/js/web/default.js"></script>
Вы используете MinifyX, может из-за него такие проблемы.
Валерия
Валерия
Спасибо, теперь все вышло!
Ruslan
Ruslan
При нажатии ничего не происходит.
Перестал работать, как выявить причину?
Я догадываюсь, что это скорее всего что-то с обработчиком action.php
Посмотреть на сайте
Ruslan
Ruslan
Проблему решил
Александр Мальцев
Александр Мальцев
Отлично!
Ruslan
Ruslan
При нажатии ничего не происходит.
Перестал работать, как выявить причину?
Я догадываюсь, что это скорее всего что-то с обработчиком action.php
Ruslan
Ruslan
Здравствуйте.
Перестал работать, при нажатии ничего не происходит.
Как выявить причину и с чем это может быть связано?
Посмотреть на сайте
Евгений Николаевич Мястовский
Евгений Николаевич Мястовский
Александр, подскажите, как кастомизировать звёзды? Сделать меньше, поменять цвет и т.д. Нужно что бы они были примерно как дефолтные-золотистые. Приобрёл goodstar компонент, но что то он не хочет работать корректно.
Александр Мальцев
Александр Мальцев
Сейчас, только правкой изображения, CSS и возможно других файлов.
В планах улучшить этот компонент, в частности сделать звёзды в формате svg. После этого операции по внешнему оформлению звёзд можно будет очень просто выполнять с помощью CSS.
Mish
Mish
Доброго. Скажите пожайлуста как сделать рейтинг из 10 звезд?
Александр Мальцев
Александр Мальцев
Привет! Для этого нужно произвести изменения в 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,

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

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

P.S. кому в лом рисовать 10 звездочек вот: ibb.co/YDyyxXC
Александр Мальцев
Александр Мальцев
Да, там размер числа не позволяет это выполнить.
Для этого нужно выполнить следующие шаги:
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. Выполнить данный файл.
Александр Мальцев
Александр Мальцев
В текущей версии нет учета оценок, оставленных авторизированными пользователями.
Андрей
Андрей
Здравствуйте, Александр!
Скажите пожалуйста, как я могу кастомизировать звёзды? Хотелось бы вместо png поставить svg звёзды.
Заранее благодарю за ответ
Александр Мальцев
Александр Мальцев
Привет!
В компоненте это реализовано через спрайт, и, следовательно, так просто это изменить нельзя. Сначала нужно хорошее решение для вывода звёздного рейтинга через SVG? Например, как с помощью SVG звездочек отобразить рейтинг 4.3?
Андрей
Андрей
Точно, в целом с точки зрения реализации верстки это весьма проблематично.
Ладно, тогда вопрос другой, как тогда убрать цифры в спрайте так, чтобы ничего не съехало?
Андрей
Андрей
Александр, еще один вопрос возник, касаемо вывода ресурсов с рейтингом.
Сейчас по Вашей формуле в pdoPage выводит ресурсы по популярности.
Но в случае, если у ресурса еще не было голосов, еще нет в списке. Как можно поправить данный момент?
Александр Мальцев
Александр Мальцев
Заменить &innerJoin на &leftJoin.
Александр Мальцев
Александр Мальцев
Как с помощью SVG это реализовать идея появилась, тут нужно просто использовать наложение изображений.
Чтобы убать цифры необходимо просто изменить стили, а именно CSS-свойство height:
.rating {
  height: 25px;
}
.rating__best {
  height: 25px;
}
.rating__current {
  height: 25px;
}
.rating__star {
  height: 25px;
}
Сергей
Сергей
Добрый день. Как можно сделать 10 звездочек вместо 5 и можно ли? Почему-то не реагирует вообще на параметр tpl — прописал там 10 все равно 5 выводит, прописал 4 — тоже 5 выводит
Сергей
Сергей
Кажется стал разбираться, потом отпишу решение
Александр Мальцев
Александр Мальцев
Хорошо
Сергей
Сергей
Александр, скажите есть возможность из коробки только вывести рейтинг без возможности голосования?
Александр Мальцев
Александр Мальцев
Конечно можно. Делаете копию чанка tplSimpleRating, удаляете в нём [[+rating_active]] и указываете его сниппету SimpleRating.
[[!SimpleRating?
  &tpl = `mytplSimpleRating`
]]
Максим
Максим
Приветствую Александр,
Спасибо за проделанную работу и вопрос: Я использую популярную МОДХ экстра Babel для создания мультиязычного вебсайта. Каждая языковая версия «живет» на отдельном контексте и имеет свой id. То есть языковые версии представляют собой разные, хотя и связанные ресурсы. Можно ли сделать так, чтобы рейтинг не дробился между английской и русской страницами сайта?
Максим
Максим
Ответ подсказали, делюсь если вдруг кому-то будет интересно.
У моего сайта два языка (русский и английский). На русском рейтинг выводится [[!SimpleRating]].
На англйском [[!SimpleRating? &id=`[[BabelTranslation? &contextKey=`web`]]`]]
где BabelTranslation? &contextKey=`web` это id русского ресурса, с которым залинкован данный английский ресурс.
flintotake
flintotake
Доброго времени суток. Подскажите, есть ли возможность в выводе популярных ресурсов через pdoResources результаты вывода сделать ссылками на сами ресурсы?
Спасибо.
Александр Мальцев
Александр Мальцев
Доброго. Выберите uri ресурса, оберните с помощью элемента a нужные элементы и укажите выбранное поле в качестве значения href.
flintotake
flintotake
можно пример?
Александр Мальцев
Александр Мальцев
Например, так:
[[!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>`
]]
greeg
greeg
добрый день у меня перестал работать FiveStar Rating после переноса каталога core на уровень выше, не зашитует голоса. где надо поправить? зарание спасибо

Александр Мальцев
Александр Мальцев
Добрый! Не нужно ничего поправлять. Очистите кэш MODX, браузера. Попробуйте ещё раз.
alex G
alex G
Здравствуйте, возникла необходимость скрытия блока после голосования (сохранить оценку текстовую а звёздочки скрыть), и запустить js действие, подскажите пожалуйста как правильно это реализовать?
Александр Мальцев
Александр Мальцев
Здравствуйте!
Для этого в 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');
Сеокотов
Сеокотов
А реально сделать так чтобы только в комментарии через tickets была возможность ставить оценку?
Александр Мальцев
Александр Мальцев
Сделать то всё возможно, но придётся много переделывать.
Константин
Константин
Добрый день! Александр, может Вы мне поможете. При переносе сайта на новый хостинг. перестало правильно работать голосование. А именно, при клике на звездочку ничего не происходит. Не видно сразу, что я оставил оценку, хотя данные в базу заносятся и при обновлении странички оставленную мной оценку я вижу. Еще я могу проголосовать бесконечное количество раз. И все оценки засчитываются и средний рейтинг выводится.
В консоли браузера следующие ошибки:
POST https://.../assets/components/simplerating/action.php 500 (Internal Server Error)
POST https://.../assets/components/simplerating/action.php 502 (Bad Gateway)
В админке, в журнале ошибок ничего нет.

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

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

[[!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]]

Александр Мальцев
Александр Мальцев
Необходимо в &select перечислить поля, которые нужно получить. Ну, или использовать *, чтобы получить все поля.
&select=`{
    "modResource":"id,pagetitle,alias",
Сеокотов
Сеокотов
о, супер, спасибо!
а подскажите еще такой момент, как вывести на превьюшке к примеру просто звездочку с текущей оценкой, то есть тот статус который на данный момент имеет страница
либо весь ряд звезд?
Александр Мальцев
Александр Мальцев
Можно, в данном случае, в чанк 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> 
Константин
Константин
Добрый вечер! А как переписать вывод рейтинговых ресурсов, но только на Fenom и используя Tickets? Пробую сам, сортирует вроде как нужно, но выводятся только ресурсы, которым поставили оценку, остальные пропадают. Что-то где-то не учел, а что, не могу понять.
Александр Мальцев
Александр Мальцев
Добрый! &innerJoin замените на &leftJoin.
Константин
Константин
Спасибо! Все работает! Не могли бы Вы еще помочь в одной проблеме. Мне, кроме сортировки по рейтингу понадобилась возможность закреплять некоторые записи в начале списка. Для это я создал доп. поле 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 работает норм. т.е. все отмеченные галочкой ресурсы закрепляются вначале и даже сортировка по рейтингу среди них происходит отлично. Но в остальных ресурсах происходит хаос. Сортировка по рейтингу не работает. Материал с низшим рейтингом может стоять выше материала с высшим рейтингом.

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

А Вам огромное спасибо, что находите время, чтобы помочь таким как я!
Александр Мальцев
Александр Мальцев
Отлично!
Дмитрий
Дмитрий
Добрый вечер. Подскажите пожалуйста как вывести рейтинг в превью на странице вывода нескольких элементов? Чтобы отображал у каждого свой
Дмитрий
Дмитрий
Решение нашел
ilyaib
ilyaib
А с fenome не дружит? пытаюсь заменить в чанке [[+id]] на {$id} не выводит
Александр Мальцев
Александр Мальцев
Для поддержки 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)
));
kalisto
kalisto
Здравствуйте Александр!
Почему-то идет ошибка.
Как исправить?
kalisto
kalisto
Ой прошу прощения убрала расширение .html
Выдает ошибку в 42 строке (файл default.js):
$.post('/assets/components/simplerating/action.php', {'action': 'setRating', 'id': id, 'title': title})
Как исправить? Или рейтинг не работает по другой причине?
Александр Мальцев
Александр Мальцев
Здравствуйте. Необходимо подключить библиотеку jQuery.
kalisto
kalisto
Спасибо за ответ. Я подключаю биб-ку в проекте (скачала, 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 подключить.
Александр Мальцев
Александр Мальцев
Нужно обычный jQuery, не slim. Slim — это урезанная версия jQuery без AJAX функций и прочих «вкусностей». migrate — он предназначен для поддержки устаревших функций, которые не стало в 3 версии jQuery. Данный компонент не использует устаревшие функции jQuery, его можете не подключать.
В вашем коде необходимо 1 строчку заменить на следующую:
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
Ми
Ми
Добрый вечер!
возникла проблема что не выводит список согласно количества голосов

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

вот вывод
[[!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` 
        ]]
Александр Мальцев
Александр Мальцев
Добрый вечер!
Если необходимо вывести ресурсы у которых нет рейтинга, то необходимо использовать параметр leftJoin.
Если необходимо отсортировать сначала по значению рйтинга, а потом по количеству голосов, то так:
&sortby = `{"SimpleRating.rating_value":"DESC","SimpleRating.rating_count":"DESC"}`
&select=`{
    "modResource":"*",
    "SimpleRating":"rating_value, rating_count"
}`
Даниил
Даниил
А есть ли возможность сохранять значение рейтинга в TV?
Александр Мальцев
Александр Мальцев
Нет, такой возможности нет. Дополнение FiveStarRating сохраняет информацию в таблицу simple_rating. Если для этого использовать TV поля, то для этого потребуется заводить не одно, а несколько TV полей. Если же всю информацию сохранять в одно TV, то с ней будет очень затруднительно работать.
Если вам необходимо обеспечить работу с полями FiveStarRating из админки, то, как это сделать можете взять из этой инструкции.
Илья
Илья
Доброго всем дня!
Такой вопрос. Мне нужно сделать сортировку по 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
Александр Мальцев
Александр Мальцев
Чтобы соединить записи из таблиц используются соединения (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. Такого обновления не будет, потому что это не улучшит компонент, а наоборот только его ухудшит.
Илья
Илья
Большое спасибо! Всё получилось.
Ivan
Ivan
Александр, благодарю за полезную информацию и ваш труд над сайтом. Подскажите, пожалуйста, можно ли указать id для конкретного рейтинга в списке ресурсов pdoResources? Например:
[[!SimpleRating?
        &id=`[[+id]]`
]]
Александр Мальцев
Александр Мальцев
Спасибо. Пока данной возможности нет. Она появится в следующем релизе.
Кроме этого защита по COOKIE будет заменена на LocalStorage.
Александр Мальцев
Александр Мальцев
Новая версия с поддержкой данной возможности отправлена на modx.com. После проверки пакета, он будет доступен через несколько дней для обновления.
Ivan
Ivan
Благодарю за оперативность, Александр!