Рейтинг

Комментарии: 14  Просмотры: 7 393

Сразу хочу сказать, что этот модуль написан лично мной и он вполне может быть немного корявым, так как, во-первых, у меня не такой уж и большой опыт в написании модулей для фреймворка Kohana и рука «не набита», а во-вторых, модуль писался после трудного рабочего дня и под бутылочку пивка. Поэтому просьба сильно не ругать. Как говорится работает — и ладно. Впрочем претензиям, высказанным по существу, я буду даже рад.
Сама мысль написания модуля для оценки материалов возникла после данного сообщения на форуме, где требовалась помощь в переделывании некого «PHP рейтинга» под Кохану. Принцип работы я оставил тот же, изменил только некоторые технические моменты. Например, не совсем понятно, зачем в таблице использовать сразу два поля — up и down, если все равно выводится их суммарное значение? Или зачем отводить под поле ip 255 символов ?
В итоге таблицы у меня получились следующие (вам нужно тоже их создать, файл с этими запросами есть в архиве):

CREATE TABLE IF NOT EXISTS `rating` (
  `id` int(10) NOT NULL,
  `mark` int(10) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
CREATE TABLE IF NOT EXISTS `rating_ip` (
  `id` int(10) NOT NULL,
  `ip` varchar(16) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Теперь скачайте архив с «Модулем рейтинга» и распакуйте его. Содержимое папки modules (а это папка rating) скопируйте также в папку modules, но только своего проекта. В файле bootstrap.php подключите новый модуль:

'rating'   => MODPATH.'rating', // Rating

Содержимое папки media нужно поместить туда, где вы храните стили, изображения и ява-скрипты и подключить файлы rating.css, rating.js и jquery.js, которые содержались в этой папке, на страницы, где планируется использовать данный модуль. Изначально я эти файлы также запихнул в модуль, но тут же возникла такая проблема, что поскольку вывод рейтинга может производиться несколько раз на странице (а чаще всего так и происходит), то данные файлы тоже будут подключаться несколько раз, что совершенно не нужно и совсем даже вредно. Как это обойти, я пока не придумал (может кто что посоветует).
На этом подготовительные работы можно считать завершенными и пора перейти к использованию модуля. Пользоваться им очень просто, достаточно в нужном месте написать:

echo Rating::instance()->render($id);

Где $id — это идентификатор материала (изображения, новости, статьи итд), который предлагается оценивать. Также модуль содержит конфигурационный файл с небольшим количеством опций:

return array(
	'view'            => 'rating/arithmetic',
	'rating_table'    => 'rating',
	'rating_table_ip' => 'rating_ip'
);

Параметр view отвечает за отображение рейтинга. rating/arithmetic — отображение в виде знаков плюс/минус и rating/hands — отображение в виде рук с поднятым и опущенным большим пальцем. rating_table и rating_table_ip — это названия задействованных таблиц. На случай если такие названия уже присутствуют в вашей базе данных, их можно поменять.
Данный модуль был дан для тестирования одному хорошему знакомому (ник eBasher на форуме) и он поставил его себе на сайт. Говорит, что полная интеграция заняла около 15 минут, при этом делалась наживую и сайт ни на секунду не прекратил свою работу. Что получилось, можно посмотреть на его сайте с клипами (ссылка есть на форуме).
Надеюсь данный модуль будет кому-то полезен. Если возникнут вопросы — пишите в комментариях или на форуме.

Обсудить на форуме


К записи оставлено 14 коммент.

Здравствуйте, очень понравился Ваш сайт, за труды и старания огромное спасибо, по возможности буду рекомендовать знакомым программистам.
А по поводу содержимого папки media, почему бы не сделать что-то вроде флага, а в методе render() проверять его. При первом обращении подставлять перед строкой с рейтингом подключение стилей и js и переключать флаг, а следующие разы выводить только строку с рейтингом.

Спасибо за отзыв, очень приятно.
По скрипту, что-то вроде флага думал, можно попробовать. Вообще хотел поискать какие-нибудь модули, где тоже реализован вывод несколько раз и посмотреть, как там сделано.

Йэх, хотел в выходной допилить скрипт, а система на компе накрылась, пока не судьба.

Хороший рейтинг устанавливать 2 минуты, только ссылку на сайт этого «eBasher»а вы бы убрали так как при нажатии на
рейтинг выскакивает порносайтец с разводом на смс…

Все руки не доходят доделать рейтинг до конца. Сегодня вообще только вот за комп сел.
Ссылку убрал, спасибо за замечение. Я и не видел, что у него там. Там попандер или как его там (вылазит при клике в любое место экрана, не только на рейтинг) стоит. Не люблю их. Но их лепят сейчас почти на все сайты. Причем часто в совокупности с рекламой в углу экрана, где показывается какое-то видео со звуком.

Да, рейтинг работает.
Но, я бы хотел внести ряд советов по доработке:

1. В табл. rating.id сделать не int(), а varchar(32), чтобы можно было самому указывать префикс материала, например, для игр и статей => game_7 и article_7. В итоге получится для каждого материала свой рейтинг. Как я полагаю сейчас, если ID одинаковые, то и считать будет неправильно.

2. Допилить бы его не в стиле +/-, а ещё и шкалой 1-5. Мне по-крайней мере шкала нужна. Ну это я сам, если наберусь сил =)

3. Голая проверка по IP давно себя изжила. Для ресурса «не домашняя страница» не будет давать голосовать большому числу желающих (+- 50%), т.к. желающие очень часто сидят под одним внешним IP в офисных сетках, да и дома уже привыкли через роутеры сидеть с разных устройств.

Вобщем могу залить на github и в свободное время подпиливать под универсальный модуль.

Да, и я там pagination подпилил для более разумного построения страниц навигации в стиле 1 4 [5] 6 9
Визуал как выглядит в живую http://tinyurl.com/99oyt4t

Тот механизм, который сейчас строит строку 1 2 3 … 8 9 10 … 15 16 17 по-моему это ад (очень длинная и замороченная получается) и я очень мало где встречал такую навигацию.

Вобщем, если есть интерес, то можно углубиться в разработку. Буду рад комментариям.

И mysql_escape_string() уже deprecated в 30 строке /classes/kohana/rating.php

Угу. Творческая копипаста — зло.
Этот рейтинг — это как пример переделки чьего-то рейтинга под кохану. На форуме один человек очень долго мучился. По уму тут вообще все надо переписать. Я хочу рейтинг сделать, где оценку ставишь от 1 до 5 и считается среднее арифметическое и округляет. Видели наверное на дле количество звездочек к статьям.

среднее арифметическое не катит для таких целей, лучше считать по медиане.

почему не катит. катит.

Следует использовать Request::$client_ip

Здравствуйте Денис, скажите зачем в папке classes в модуле rating лежит класс `Rating`, расширяющий класс `Kohana_Rating` который лежит в папке kohana? Так сделано почти во всех модулях, но зачем?

Для возможности расширения.

Денис, будут ещё уроки? Не плохо было бы изучить модуль auth, да и вообще разработать систему с пользователями и разграничением доступа.



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.