Рейтинг для ресурсов и вывод их по рейтингу
UPD: Решение в комментах ниже.
Решил использовать дополнение CSS Star Rating для создания рейтинга ресурсов. (Может быть есть что то поновее?)
В общем рейтинг ресурсам присваивается, всё ок. А вот как теперь при помощи pdoResources вывести ресурсы с сортировкой по этому рейтингу не понятно.
Может быть кто то сталкивался?
Решил использовать дополнение CSS Star Rating для создания рейтинга ресурсов. (Может быть есть что то поновее?)
В общем рейтинг ресурсам присваивается, всё ок. А вот как теперь при помощи pdoResources вывести ресурсы с сортировкой по этому рейтингу не понятно.
Может быть кто то сталкивался?
Комментарии: 5
Ставил css rating stars — не понравилось (появились дубли страниц). Конечно сейчас может что и изменилось, но у себя давно снес.
По мне, так LikeDislike лучше будет, только стандартных звездочек не хватает, зато есть возможность записывать результат голосования в tv, а потом сортировать по нему.
Есть VoteForms, но только для авторизованных, для анонимов никак.
По мне, так LikeDislike лучше будет, только стандартных звездочек не хватает, зато есть возможность записывать результат голосования в tv, а потом сортировать по нему.
Есть VoteForms, но только для авторизованных, для анонимов никак.
https://modstore.pro/packages/utilities/voteforms
[[pdoResources?
&class=`modResource`
&parents=`0`
&tpl=`@INLINE <li>[[+pagetitle]] - <span class="badge">[[+rating]]</span> </li>`
&leftJoin=`{
"VoteFormThread": {
"class": "VoteFormThread",
"on": "modResource.id = VoteFormThread.resource AND VoteFormThread.form = 1"
}
}`
&select=`{
"modResource": "*",
"VoteFormThread": "rating"
}`
&sortby=`VoteFormThread.rating`
&sortdir=`DESC`
]]
Немного не то. Нашёл вот решение, но строка
даёт ошибку
Сами доработки:
$this->modx->resource->setTVValue('strtv', round($voteStats['average'], 1));
даёт ошибку
mod_fcgid: stderr: PHP Fatal error: Call to a member function setTVValue() on null
Сами доработки:
1. Файл /core/components/star_rating/model/star_rating/starrating.class.php
1.1. После строки
public $output = '';
добавить
public $modx = null;
1.2. Заменить
public function initialize() {
на
public function initialize(modX &$modx) {
1.3. В самый конец этого же метода (initialize) добавить:
$this->modx = $modx;
1.4. в метод renderVote() после строки
$currentText = round($voteStats['average'] . '/' . $this->config['maxStars'], 2);
добавить строку:
$this->modx->resource->setTVValue('имя-вашего-tv', $voteStats['average']);
2. Изменить сниппет starRating:
заменить строку
$starRating->initialize();
на
$starRating->initialize($modx);
Отвечу сам себе, вдруг пригодится кому нибудь. В общем в пункте 1.4
Вместо
Всё работает, значение в тв записывает.
Апдейтну сам пост и можно наверное в готовые решения перенести, а ещё лучше собрал бы кто нибудь в готовый пакет.
Вместо
$this->modx->resource->setTVValue('имя-вашего-tv', $voteStats['average']);
надо писать$this->xpdo->resource->setTVValue('strtv', $voteStats['average']);
Видимо с 2013 года что то в modx поменялось :)Всё работает, значение в тв записывает.
Апдейтну сам пост и можно наверное в готовые решения перенести, а ещё лучше собрал бы кто нибудь в готовый пакет.
[[!pdoResources?
&leftJoin=`{ "rating": { "class": "starRating", "on": "rating.star_id = modResource.id" } }`
&select=`{ "modResource":"*", "rating":"rating.vote_count as vote_count,rating.vote_total as vote_rating" }`
&sortby=`{"(vote_rating/vote_count)":"DESC"}`
&sortdir=`DESC`
]]
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.