Решение. Оценка ноды исходя из оценок в комментариях без использования, fivestar, rate и др. сложных модулей.

Главные вкладки

Аватар пользователя VasyOK VasyOK 7 июня 2019 в 23:27
1

Задача

Статью можно комментировать. В комментариях ставить оценку звездами. Исходя из оценок высчитывается средний балл.

Проблема

При использовании модуля fivestar выясняется http://xandeadx.ru/blog/drupal/790, что один пользователь не может дать оценку материалу 2 раза. Это принципиально, если большинство комментариев пишутся администратором от имени разных людей.

Решение

Понадобятся модули:

  • raty — чтобы пользователь мог задвать оценку звездами, а не цифрами
  • views_merge_rows (хакнутый в приложении к посту) — чтобы высчитать среднее значение оценок из комментариев. Можно по другому.
  • viewfield — чтобы вывести это значение на ноде. Можно и просто блоком.

Поля комментариев

Создаем в полях комментариев ноды поле, через которое задется оценка простым числом. Если установлен модуль raty – оценка выводится звездами, к каждому комментарию. А в сабже проблема — средняя оценка.

Вьюха выводящая среднее значение

Поле Звезды выведено два раза:
первое — для расчета средней оценки
второе — для расчета количества отзывов

Расчет ведется модулем views_merge_rows. В 8-ке функции суммы и среднего значения уже есть в модуле. В 7-ку функцию суммы ввел наш чешский товарищ из Бразилии Лукаш Константино Сильва https://www.drupal.org/project/views_merge_rows/issues/2462845
На основании этого патча я дописал функцию среднего арифметического. Прохаченый модуль в аттаче к посту.

Вьюха

Поле Звезды

Контекстный фильтр

merge rows

Поля ноды

Выводим среднее значение на ноде модулем viewfield. Через блоки тоже можно.

В результате оценка выглядит так:

А где звездочки?

Увы, views_merge_rows не умеет форматировать число, как звезды. views_aggregator кстати умеет, но его сложнее темизировать.

Подходящее мне решение описал финский товарищ Тату Улманен https://stackoverflow.com/questions/1987524/turn-a-number-into-star-rati...

CSS:

span.stars, span.stars span {
    display: block;
    background: url('../images/stars.png') 0 -18px repeat-x; /* 18px - высота звезды */
    width: 100px; /* ширина_звезды*5 */
    height: 18px; /* высота звезды */
}

span.stars span {
    background-position: 0 0;
}

JS (работает без бехейворов):

(function($){
    $(document).ready(function(){        
        $.fn.stars = function() {
            return $(this).each(function() {
                // Get the value
                var val = parseFloat($(this).html());
                // Make sure that the value is in 0 - 5 range, multiply to get width
                // 20px - ширина звезды
                var size = Math.max(0, (Math.min(5, val))) * 20;
                // Create stars holder
                var $span = $('<span />').width(size);
                // Replace the numerical value with stars
                $(this).html($span);
            });
        }  

        $(function() {
            $('span.stars').stars();
        });
 
    });
   
})(jQuery);

Спрайт выглядит так (звездочка подсвечаная, звездочка пустая):

Спрайт звездочек тоже в аттаче.

Думаю как вставлять в свою тему оформления (или в свой модуль) JS и CSS объяснять не надо. Кому надо — пишите Smile

Конечный результат:

Вроде все. Надеюсь кому нибудь понадобится. Особенно распространителям псевдомедицинской ерунды, подделок на брендовые продукты и других вещей, что сейчас модно продавать. Ссылку на работающий сайт по понятным причинам дать не могу Smile

Замечания, вопросы, предложения — пожалуйста.

Комментарии

Аватар пользователя VasyOK VasyOK 9 июня 2019 в 13:53
1

/*Продожение инструкции. Ввиду наличия в views встроенных средств агрегации, для данной задачи модуль views_merge_rows не особо то и нужен. Не нужен также скрипт вывода звездочек из чисел. Все гораздо проще.*/

Вариант 2.

Модуль raty остается. Настройки полей в комментариях тоже остаются. Меняется вьюха, выводящая оценку из комментариев.




Аватар пользователя ogo ogo 23 октября 2020 в 9:36

Спасибо! То что надо. Хорошо что ссылку дали, у меня не работало пока js не сравнил.

// Create stars holder
var $span = $('').width(size);

Оказалось здесь на сайте редактор вырезает часть кода, не знаю почему(
В оригинале