Рейтинг для ресурсов и вывод их по рейтингу

UPD: Решение в комментах ниже.

Решил использовать дополнение CSS Star Rating для создания рейтинга ресурсов. (Может быть есть что то поновее?)

В общем рейтинг ресурсам присваивается, всё ок. А вот как теперь при помощи pdoResources вывести ресурсы с сортировкой по этому рейтингу не понятно.

Может быть кто то сталкивался?
Михаил
05 июня 2016, 16:40
modx.pro
3 439
0

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

Борис И
05 июня 2016, 20:28
0
Ставил css rating stars — не понравилось (появились дубли страниц). Конечно сейчас может что и изменилось, но у себя давно снес.
По мне, так LikeDislike лучше будет, только стандартных звездочек не хватает, зато есть возможность записывать результат голосования в tv, а потом сортировать по нему.
Есть VoteForms, но только для авторизованных, для анонимов никак.
    but1head
    06 июня 2016, 01:36
    +1
    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`
    ]]
      Михаил
      06 июня 2016, 07:24
      0
      Немного не то. Нашёл вот решение, но строка
      $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);
        Михаил
        06 июня 2016, 08:19
        0
        Отвечу сам себе, вдруг пригодится кому нибудь. В общем в пункте 1.4

        Вместо
        $this->modx->resource->setTVValue('имя-вашего-tv', $voteStats['average']);
        надо писать
        $this->xpdo->resource->setTVValue('strtv', $voteStats['average']);
        Видимо с 2013 года что то в modx поменялось :)

        Всё работает, значение в тв записывает.
        Апдейтну сам пост и можно наверное в готовые решения перенести, а ещё лучше собрал бы кто нибудь в готовый пакет.
          Игорь Терентьев
          07 июня 2016, 14:06
          0
          [[!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`
                      ]]
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            5