Сразу хочу сказать, что этот модуль написан лично мной и он вполне может быть немного корявым, так как, во-первых, у меня не такой уж и большой опыт в написании модулей для фреймворка Kohana и рука «не набита», а во-вторых, модуль писался после трудного рабочего дня и под бутылочку пивка. Поэтому просьба сильно не ругать. Как говорится работает — и ладно. Впрочем претензиям, высказанным по существу, я буду даже рад.
Сама мысль написания модуля для оценки материалов возникла после
В итоге таблицы у меня получились следующие (вам нужно тоже их создать, файл с этими запросами есть в архиве):
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;
Теперь
'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 минут, при этом делалась наживую и сайт ни на секунду не прекратил свою работу. Что получилось, можно посмотреть на его сайте с клипами (ссылка есть на форуме).
Надеюсь данный модуль будет кому-то полезен. Если возникнут вопросы — пишите в комментариях или на форуме.
Пожалуйста, зарегистрируйтесь для комментирования.
Здравствуйте, очень понравился Ваш сайт, за труды и старания огромное спасибо, по возможности буду рекомендовать знакомым программистам.
А по поводу содержимого папки 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, да и вообще разработать систему с пользователями и разграничением доступа.