instantsoft / icms2

Self-hosted Site Management System
https://instantcms.ru
GNU General Public License v2.0
295 stars 120 forks source link

Просьба изменить определение $average_rating. #1260

Closed Risgit closed 3 years ago

Risgit commented 4 years ago

Используемая версия InstantCMS: 2.13.1

При использовании своего шаблона голосовалки, если рейтинг многобалльный, результирующее значение округляется. То есть, если значение $score отлично от нуля - результат голосования округляется. У меня многобалльный рейтинг, но округления не требуется. Просьба сделать определение $average_rating как-нибудь по-другому. Может в опциях шаблона голосовалки что-то добавить? Вроде is_average ?

fuzegit commented 3 years ago

Не очень понял что не получается.

$rating = round($this->model->getTargetAverageRating($vote), 0, PHP_ROUND_HALF_DOWN);

Эта строка округляет?

Risgit commented 3 years ago

Не очень понял что не получается.

// флаг, что рейтинг считать как среднее арифметическое $average_rating = true;

    // приоритет за $score
    if(!$score){

        $score = ($direction == 'up' ? 1 : -1);

        $average_rating = false;

    } else {
        // валидация оценки
        if(method_exists($controller, 'validate_rating_score') && !$controller->validate_rating_score($score)){
            return $this->cms_template->renderJSON(array(
                'success' => false,
                'message' => LANG_ERROR
            ));
        }
    }

Мне НЕ нужно среднеарифметическое. Мне нужна сумма. И приходится править файл \system\controllers\rating\actions\vote.php при каждом обновлении.

fuzegit commented 3 years ago

У меня пока нет идей, как это сделать универсально, без потенциальной возможности подделки рейтинга. Максимум что могу предложить, так это функция формирования рейтинга, по типу, как валидация оценки. Но так или иначе, потом придётся править её.

Risgit commented 3 years ago

У меня пока нет идей, как это сделать универсально

Не определять $average_rating в зависимости от балльности рейтинга, а просто объявлять в \templates\default\controllers\rating\widget.tpl.php $average = true или $average = false. Я сделаю свой шаблон голосовалки и объявлю в нём, что $average = false. И всё!

fuzegit commented 3 years ago

Там рейтинг пишется в базу. Толку от того, что в шаблоне вы определите переменную? В vote ее всё равно передавать. А этот флаг не должен определяться параметром запроса.

Risgit commented 3 years ago

В vote ее всё равно передавать

Ну, да. Я этого и прошу.

А этот флаг не должен определяться параметром запроса.

Почему?

fuzegit commented 3 years ago

Почему?

Потому что можно будет влиять на логику. Что помешает подменять этот параметр? Например в типе контента новости один рейтинг, в постах другой рейтинг. В новостях рейтинг +1/-1, в постах можно за раз +5 поставить. Подменяем параметр, ставим себе +5.

fuzegit commented 3 years ago

Как то так

Выделение_050

Я сделаю свой шаблон голосовалки и объявлю в нём, что $average = false. И всё!

Не используйте такой подход никогда, за исключением совсем редких случаев, которые не влияют на логику контроллера. Что называется, яйца курицу не учат, шаблоны - для вывода информации.