LikeDislike

По мотивам топика. Спасибо за компонент говорим lex . Я выкладываю только общий вариант, без комментариев к дизлайкам: github.com/Pathologic/LikeDislike.


В коробке:
  • сниппет LikeDislike, который и дает возможность ставить оценки;
  • сниппет ldController для запуска DocLister с расширенным контроллером site_content;
  • модуль LikeDislike, чтобы видеть оценки в админке.
Защита от накруток никакая простая — куки, ip, также можно разрешить оценивать только зарегистрированным пользователям.

Установка
После установки нужно запустить модуль, чтобы создались таблицы.

На странице документа нужно подключить скрипт jGrowl:

<script type="text/javascript" src="assets/js/jGrowl/jquery.jgrowl.min.js"></script>
<link rel="stylesheet" href="assets/js/jGrowl/jquery.jgrowl.min.css">

И скрипт для ajax-обработчика:

<script type="text/javascript" src="assets/snippets/LikeDislike/likedislike.js"></script>
<link rel="stylesheet" href="assets/snippets/LikeDislike/likedislike.css">


Вызов сниппета выглядит так:

[!LikeDislike? 
&enabledTpl=`@CODE:
<div class="likedislike" data-id="[+rid+]"><a href="#" class="like"><i class="fa fa-lg fa-thumbs-up"></i> <span>[+like+]</span></a> <a href="#" class="dislike"><i class="fa fa-lg fa-thumbs-down"></i> <span>[+dislike+]</span></a></div>
` 
&disabledTpl=`@CODE: 
<div class="likedislike"><span class="like">За: <span>[+like+]</span></span><span class="dislike">Против: <span>[+dislike+]</span></span></div>
`!]

Скрипт likedislike.js написан под верстку в этом примере.

Кроме вывода шаблонов сниппет задает плейсхолдеры [+modResource.like.{id}+] и [+modResource.dislike.{id}+].

Параметры сниппета LikeDislike
  • rid — id оцениваемого ресурса, если параметр не задан, то по возможности используется id текущего ресурса;
  • classKey — параметр позволяющий разделять оцениваемые сущности. Сделано на будущее, вдруг понадобится ставить оценки пользователям или еще чему-нибудь. По умолчанию — modResource.
  • action — действие: like, dislike, stat (по умолчанию — stat);
  • enabledTpl — шаблон, если разрешено оценивать;
  • disabledTpl — шаблон, если запрещено оценивать;
  • onlyUsers — разрешено оценивать только зарегистрированным пользователям;
Если не задавать шаблоны, то сниппет вернет массив с ключами like и dislike.

Параметры сниппета ldController
  • allowLD — разрешить оценивать в списке (по умолчанию — 0);
  • enabledTpl — шаблон, если разрешено оценивать;
  • disabledTpl — шаблон, если запрещено оценивать;
  • onlyUsers — разрешено оценивать только зарегистрированным пользователям;
  • classKey;
Для вывода в основном шаблоне (&tpl) нужно использовать плейсхолдер [+likedislike+]. Имена полей в параметрах для выборки и сортировки лучше задавать с префиксом таблицы («c» для site_content и «ld» для likedislike). Поле like обязательно должно быть в обратных кавычках — `like`, иначе поломаются запросы.

15 комментариев

avatar
лайкнул, и здесь и там
avatar
Макс крут, спасибо!
avatar
Протестил, все работает, но есть вопросы — они касаются взаимодействия (совместного использования) с другими компонентами.

Поясню.
Поставил LikeDislike на уже готовый интернет магазин с eFilter. По странице товаров — вопросов нет. По выводу в каталог — оключил eFilter и вместо него поставил ldController — все работает.
Дальше надо чтобы работал и фильтр.
В сниппете eFilterResult в runSnippet меняю DocLister на ldController, проверяю до использования фильтра — работает. В вот если предварительно что-то отфильтровать — то уже не работает, при клике на lile или dislike перебрасывает на главную. Такой вот конфликт.
Это первый вопрос.

Второй вопрос.
Вполне может оказаться, что в сниппете eFilterResult в runSnippet уже нет DocLister'а, потому как он уже раньше был заменен на sgController (делал недавно такой сайт) — как быть в таком случае? Как сделать матрешку eFilterResult — sgController — ldController — DocLister и правильный ли это путь, учитывая дальнейшее развитие и увеличения количества подобных компонентов?
avatar
если предварительно что-то отфильтровать — то уже не работает

Так и должно быть, ведь загруженным элементам не назначен обработчик событий. можно изменить в likedislike.js:

//$('.likedislike').on('click','a',function(e){
$(document).on('click','.likedislike > a',function(e){
avatar
Спасибо, сейчас все ОК
avatar
Сейчас контроллер likedislike расширяет контроллер site_content, его же расширяет sg_site_content. А нужно чтобы было так: class likedislikeDoclister extends sg_site_contentDoclister, class sg_site_content extends site_contentDoclister.

Сам сниппет, пусть будет условно ldsgController:

<?php
include_once(MODX_BASE_PATH . 'assets/lib/APIHelpers.class.php');

$prepare = array();
$prepare[] = \APIhelpers::getkey($modx->event->params, 'BeforePrepare', '');
$prepare[] = 'DLldController::prepare,DLsgController::prepare';
$prepare[] = \APIhelpers::getkey($modx->event->params, 'AfterPrepare', '');
$modx->event->params['prepare'] = trim(implode(",", $prepare), ',');
$params = array_merge(array(
    "controller"    =>  "likedislike",
    "dir"        =>  "assets/snippets/LikeDislike/DocLister/",
    //выше я написал, что контроллер likedislike должен расширять sg_site_content
    "selectFields" => "c.*,ld.*"
), $modx->event->params);
if(!class_exists("DLldController", false)){
    class DLldController{
        //prepare от ldController
        ...
    }
}
if(!class_exists("DLsgController", false)){
    class DLsgController{
        //prepare от sgController
        ...
    }
}
return $modx->runSnippet("DocLister", $params);
?>
avatar
Добавил поле ld_rating в котором находится разница между like и dislike. Для обновления нужно пересоздать таблицы или же выполнить запросы:

ALTER TABLE `modx_likedislike` ADD COLUMN `ld_rating` INT(10) NOT NULL DEFAULT 0
ALTER TABLE `modx_likedislike` ADD INDEX`ld_rating` (`ld_rating`)
UPDATE TABLE `modx_likedislike` SET `ld_rating`=`like`-`dislike`


Ну и очистить кэш браузера, чтобы в модуле появилась новая колонка.
avatar
не работало, пока не добавил еще новое поле updatedon
avatar
Не думал я, что кто-то успел поставить до того, как появилось это поле (:
avatar
Может подскажите как вывести к-во лайков к рес-су в шаблоне Ditto?) [+modResource.like.[+id+]+] и [+like+] не срабатывает
avatar
Это троллинг такой или что?
avatar
Если честно нет. Возможно не корректно сформулировал вопрос.Или что либо не понимаю) вызываю дитто [!Ditto? &startID=`[*id*]` &orderBy=`menuindex ASC` &tpl=`item_tpl` &filter=`template,7,1` &depth=`3`!],
item_tpl:
<div class="likes-readmore no-style">
[!LikeDislike? &rid=`[+id+]`
&enabledTpl=`@CODE:
<div class="likedislike" data-id="[+id+]"><a href="#" class="like nolikes gray_like"><span>[+like+]</span></a></div>
` &disabledTpl=`@CODE:  <span class="like"></span><span class="like-count">[+like+]</span>
`!]
<span class="readmore"><a href="[~[+id+]~]">Подробнее</a></span>
avatar
Ditto давно уже никто не использует.
avatar
Перешёл на DocLister, спасибо)
А реально ли, чтобы лайк работал на подобии, как в контакте. т.е. человек нажал на лайк, потом передумал, нажал на него опять, и лайк отменился.
avatar
Реально, но мне лень это доделывать.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.