Pull to refresh

Интуитивная доработка Vote Up/ Down и User Karma (радостные эмоции новичка друпалиста)

Drupal *
imageХочу поделиться радостью от проделанной сегодня успешной работы (на интуитивном уровне) по доработке алгоритмов подсчета кармы и рейтинга пользователей в Drupal 6. Но для начала надо немного рассказать о моем уровне подготовки, чтобы стало понятно, насколько универсализация API и принципы ООП украшают жизнь людям. Надеюсь, будет полезно для новичков, вроде меня и поможет им преодолеть первые трудности на пути освоения Drupal. Кто хочет сразу перейти к сути статьи, листайте до заголовка «Долгожданные оценки и карма».



Первое знакомство с web-программированием и CMS



Чуть больше года я плотно знаком с таким понятием как CMS. Сделал несколько нормальных (функциональных, разнообразных и полюбившихся пользователям) сайтов на Joomla, сначала 1.10, потом 1.5 (до 1.6 пока не добрался). При этом всегда использовал только стандартные механизмы. Подключаемые штучки (модули, плагины, компоненты) ставил только в исходном варианте. Своим рукам позволял только немного щупать шаблоны (тем оформления) и CSS. Никуда дальше не лез.

С основами ООП я знаком довольно плотно, но с web-применением этих принципов практически не сталкивался. Принципы очень похожие и понятные. Больше всего трудностей, скорее из-за разницы терминологии. Меня долго пугала фраза «учи Drupal API». Или слово hook — «ловушка, крючок». Но когда дошло, что хуки — это, по-сути, обработчики событий, то сразу стало и легче и понятнее.

Своеобразные вкрапления исполняемого кода <?php ..... ?> внутри html-страниц тоже как-то непривычно, также как и синтаксис этого нового для меня языка. Ну и географическая разрозненность твоего детища необычна: скрипты и темы в одном месте, как бы сами по себе, а база данных, из которой формируется основная информация сайта, может быть совсем в другой стране. И из нее надо вытягивать ниточки и вязать странички. Большая часть автоматически конечно делается, но, тем не мене…

Почему я изменил Джумле



От лени мозгов и следуя принципу утенка, я изо всех сил старался не связываться ни с чем, кроме Джумлы. Но когда речь зашла о создании коллективного блога с широкими возможностями голосования, я пришел к выводу, что Drupal подходит для этого лучше. А точнее — идеально подходит, в то время как Джумла вообще не подходит (по-крайней мере такое у меня возникло убеждение после изучения многочисленных сравнений и описаний подключаемых компонентов к этим двум CMS).

Знакомство с чем-то кардинально новым, когда чувствуешь себя полным полным нулем, ничтожеством, убитым и раздавленным большим количеством непонятной информации, которую надо обработать и въехать в тему… Это такой кайф. У меня аж адреналин хлещет в кровь, что ночами спать не могу. (Но я не хвастаюсь, что делаю это эффективно, а только эмоционально).

Вместе с изучением Друпала параллельно я начал учить и php и знакомиться с jQuery, а также вспоминать уроки SQL. Сначала это было просто чтение описания разных модулей, их поочередное подключение и тестирование. А потом я стал заглядывать в API, написал свой модуль (сперва по уроку, а теперь уже доделываю свой оригинальный).


Долгожданные оценки и карма



Сразу же установил Vote Up/Down. О, это было то, что мне нужно! Можно голосовать за ноды, комменты и таги (разделы таксономии).

Затем встала задача аккумулировать оценки, сливая их в единую цифру рейтинга пользователя. Выбор пал на User Karma. Этот модуль позволил идеально воплотить задумку — начислять очки по некоему алгоритму в зависимости от действий пользователя и голосований через заданные коэффициенты значимости.

Например, по моему алгоритму, букет рейтинга складывается из таких цветочков:

Рейтинг (Репутация) = ГолосаЗаНоды * 3 + ГолосаЗаКомменты * 1 + ДобавлениеНод*1 + ОставленнаяОценка*0.2

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

Но с тех пор, как недавно я зарегистрировался на Хабре, мне захотелось повторить механизм кармы, который находится здесь. Как бы показатель поддержки со стороны сообщества. Сколько человек за тебя, а сколько — против. Не голос за какой-то твой материал, а именно голос за твою личность. Каждый может подарить тебе либо один Плюс, либо Минус. И только один раз.

Немного погуглив в рунете я не нашел желаемого решения (по доработке Vote Up/Down), и решил сам по-разбираться как устроен модуль, в учебных целях. И сразу обратил внимание, что за все виды голосований там отвечают под-модули в папках vud_node, vud_comment, vud_term. Набрав в гугле vud_user, я нашел то, что мне нужно.

В январе этого года один человек поднял вопрос о голосовании за пользователей, на что разработчики VoteUpDown ответили, что для Drupal 6 они эту возможность реализовывать не будут, а для 7-й версии планируют сделать голосование за произвольные поля материалов (как я понял, но не следует доверять моему англ.).

В феврале один человек в комменте выложил под-модуль vud_user, как он говорит, смастерил его из модуля vud_comment. Его-то я и скачал, и он у меня заработал, прямо как карма на Хабре, от чего я сильно обрадовался.

Но тут же моя радость сменилась глубокой задумчивостью. Ведь по логике задуманной Репутации, голос за пользователя тоже должен влиять на нее, и очень весомо. А для этого надо доработать User Karma.

Внутреннее чутье подсказало мне, что такую доработку (мелких самодельных вещей) я вряд ли найду, и поэтому сделал странный для меня ход, положившись лишь на интуицию.

Модуль User Karma состоял из 4-х подмодулей.
user_karma_receive_vote_node // — очки при голосовании за твою ноду
user_karma_receive_vote_comment — голосование за твой коммент
user_karma_insert_node — добавление статьи
user_karma_give_vote — оценивание тобой материалов

Я взял первый попавшийся, и логически подходящий мне _receive_vote_node и скопировал все файлы, связанные с этим под-модулем. А слово node в названиях заменил на user.

Зайдя в эти файлы, я сделал «Поиск — Замена» node ---> user.

И установил их на сайт. В разделе модули (админки) появился новый под-модуль _receive_vote_node. Включил его. А в настройках User Karma появилось новое слагаемое «голосований за пользователя». Я задал ему коэффициент 10. Тут же зашел в профиль случайного пользователя, предварительно запомнив его рейтинг. Проголосовал за него и обновился, в ожидании роста скачка репутации на 10-ку.

SQL начал материть Друпал, что не существует таблицы {user} и в ней не существует полей nid. Я исправил на {users} и uid соответственно.

И у меня все заработало! Прямо так, как я хотел! Теперь стоит кому-то проголосовать за профиль пользователя, как его Рейтинг взлетает на +10 (или падает на -10).

Итак, подведем итоги моему кармадр...эксперименту.

Vote Up/Down добавляет в ваши статьи, комментарии и термины таксономии кнопки для голосования, которые посредством chaos tools через Ajax эффектно срабатывают, изменяя оценки на глазах пользователя. Vote Up/Down также складывает оценки в базу данных аккуратно по полочкам (user1 минуснул такой-то коммент usera2 в такой-то статье в 7-30 утра и т.д.). Потом вы можете использовать эту информацию, например, для вычисления анонимных минусистов, неадекватных плюсистов и нормальных людей, а также продавать результаты голосований обиженным, которым жестоко накакали в карму много человек, и они хотят знать: «кто же это со мной так обошелся!?»

User Karma агрегирует все оценки в одно число, которое прилепляется к пользователю. Это как ВВП страны примерно. Дядя Вася выкопал 3 мешка картошки, Абрамович выкопал 50 тонн алмазов, ВАЗ собрал 100 тысяч «Калин», Мегафон потерял 2 млн.$ из-за Skype — казалось бы столько разных цифр, а в итоге получаем суммарную цифру, которая подводит итог всем нашим совместным усилиям. ВВП России в 2010г. составил Х млрд. рублей. И вся эта куча плюсов и минусов за ноды, комменты, картошку и алмазы, приписывается в итоге России и фигурирует в разных отчетах как показатель ее успешности.

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

Мораль истории, думаю, такая: «Вот к чему приводит универсализация названий функций и грамотно продуманное API». В Друпале все очень строго и продуманно. Новички, не бойтесь, осваивайте логику API и скоро сможете на лету творить чудеса в web-программировании.

С учетом того, что я сам новичек и в Друпале и на Хабре, буду рад, если меня не лишат возможности писать здесь, а также советам, чтобы исправить свое понимание каких-то вещей, которые я пока не понимаю. Спасибо за внимание.

Ну а больше всего на свете я мечтаю завести хороших опытных друзей, кто бы помогали мне осваивать Друпал.
Tags:
Hubs:
Total votes 58: ↑43 and ↓15 +28
Views 1.9K
Comments Comments 32