Здравствуйте. Решил доработать компонент отзывов, добавив возможность публиковать комментарий не выставляя оценку/рейтинг. Почти всё получилось, кроме правильного пересчета среднего арифметического всех оценок. Проблема в том, что система учитывает отзыв без рейтинга как 0 и он участвует в расчете, что существенно портит общую картину. Посоветуйте , пожалуйста, как сделать так, чтобы при расчете ноль не учитывался? Код вывода средней оценки: Код (Text): $rate_count = $this->analytic['review']->count_rate; $rate_avg = $rate_count==0? 0 : $this->analytic['review']->sum_rate/$rate_count;
В каком смысле чтобы ноль не учитывался? Распиши подробно алгоритм, какие входные данные, как считаешь.
При написании отзыва пользователи выставляют оценки, далее эти оценки между собой суммируются и делятся на количество самих оценок. Если просто опубликовать отзыв не выставляя рейтинг, то система его учитывает как 0 и он суммируется с остальными оценками. И из-за этого общий рейтинг будет существенно занижаться. Потому нужно, чтобы отзывы с оценкой 0 не учитывались.
Сдается мне, вы не поняли, что я написал от слова совсем? Давайте начнем с нуля - вы знаете, что такое оператор ветвления if?
Я так понял нужно найти API объекта, получаемого из $this->analytic['review'] и там уже добавить этот код.
например присвой -1 тем, кто не оценил. далее если(не -1), то суммируй, увеличивай счетчик оценивших. иначе ничего не делай. Добавлено спустя 2 минуты 40 секунд: а, стоп, или ноль это уже недопустимое значение? тогда вообще проблемы не понял) Добавлено спустя 15 минут 1 секунду: $this->analytic['review']->count_rate - хранит сколько человек оценили $this->analytic['review']->sum_rate - хранит их суммарную оценку тут дописывать уже поздно. надо искать место (скорее всего в каком нибудь методе addRateItem() ), в котором этим свойствам присваиваются значения и там уже прописывать влияние нуля
Вроде нашел это место: Код (PHP): ... public function get_analytics($object, $object_id, $object_key = '') { $params = JLexReviewFactory::getParams (); $result1 = null; $result2 = null; if ($params->get ( 'show_summary_board' ) && $params->get ( 'show_rating_board' )) { $rate_max = $params->get ( 'rate_max' ); $where_clause = array (); $where_clause [] = "object=" . $this->getDbo ()->quote ( $object ); $where_clause [] = "object_id=" . $this->getDbo ()->quote ( $object_id ); $where_clause [] = "published=1"; $where_clause [] = "review_rate<={$rate_max}"; if (trim ( $object_key ) != '') $where_clause [] = "object_key=" . $this->getDbo ()->quote ( $object_key ); $tmp = new stdClass (); $tmp->count_rate = 0; $tmp->sum_rate = 0; $tmp->count_vote = 0; $query = "SELECT COUNT(review_rate) count_rate"; $query .= ",SUM(review_rate) sum_rate"; $query .= ",SUM(CASE WHEN rate=1 THEN 1 ELSE 0 END) count_vote"; for($i = 1; $i <= $rate_max; $i ++) { $query .= ",SUM(CASE WHEN review_rate= {$i} THEN 1 ELSE 0 END) star{$i}"; $var = 'star' . $i; $tmp->$var = 0; } $query .= "\nFROM #__jlexreview"; $query .= "\nWHERE " . implode ( " AND ", $where_clause ); $query .= "\nGROUP BY object"; $dt = $this->getDbo ()->setQuery ( $query, 0, 1 )->loadObject (); $result1 = ! $dt ? $tmp : $dt; } ... Если это не оно, то подскажите, пожалуйста, как найти именно то место? PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
попробуйте найти где описан stdClass. а лучше, где значения с оценкой, пришедшие из формы, куда-то присваиваются.