[xLike] Идеальная система лайков с оптимистичным интерфейсом и правильной формулой
Пакет довольно прост и одновременно функционален. Выполняет систему рейтинга для любого объекта, по-умолчанию, для ресурсов. Чем-то напоминает систему лайков на YouTube, в частности, в пакете реализован оптимистичный интерфейс.
Также, особенностью компонента является правильный подсчет рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли. По-простому: эта формула не даст встать новым записям с 1 лайком и 0 дизлайками выше более старых записей с сильным рейтингом.
Список преимуществ:
Выводит систему рейтинга на месте вызова.
mode — режим работы сниппета: db или local. В режиме local сниппет обходится без запроса к базе для того, чтобы узнать кол-во лайков/дизлайков и рейтинг, вместо этого вам необходимо передать эти цифры в сниппет в качестве параметров. По-умолчанию, db.
guest — разрешить гостям голосовать. По-умолчанию, Да.
parent — ID объекта. По-умолчанию, ID текущего ресурса.
class — класс объекта. По-умолчанию, modResource.
list — название списка (дополнительный параметр группировки). По-умолчанию, default.
Вывод рейтинга для текущего тикета без возможности голосовать гостям:
Вывод рейтинга для текущего ресурса в режиме local:
Данное событие срабатывает после голосования пользователем и всех проверок.
class — класс объекта,
list — название списка,
likes — кол-во лайков,
dislikes — кол-во дизлайков,
rating — текущий рейтинг, уже пересчитанный.
Код плагина:
Демо-сайт
Скачать в Modstore
Если есть желание отблагодарить:
ЯД — 4100159550314
PayPal — pavelgvozdb@yandex.ru
Также, особенностью компонента является правильный подсчет рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли. По-простому: эта формула не даст встать новым записям с 1 лайком и 0 дизлайками выше более старых записей с сильным рейтингом.
Список преимуществ:
- Оптимистичный интерфейс,
- Наиболее правильная формула вычисления рейтинга,
- Работа с любыми объектами (modResource, modUser, кастомные объекты),
- Голосование гостями,
- Анимированное изменение полосы/числа рейтинга,
- Событие плагина — xLikeOnVote.
Сниппет xLike
Выводит систему рейтинга на месте вызова.
Параметры
tpl — чанк шаблона вывода. По-умолчанию, tpl.xLike.mode — режим работы сниппета: db или local. В режиме local сниппет обходится без запроса к базе для того, чтобы узнать кол-во лайков/дизлайков и рейтинг, вместо этого вам необходимо передать эти цифры в сниппет в качестве параметров. По-умолчанию, db.
guest — разрешить гостям голосовать. По-умолчанию, Да.
parent — ID объекта. По-умолчанию, ID текущего ресурса.
class — класс объекта. По-умолчанию, modResource.
list — название списка (дополнительный параметр группировки). По-умолчанию, default.
Примеры
Вывод рейтинга для текущего ресурса с возможностью голосовать гостям:{'!xLike' | snippet}
Вывод рейтинга для текущего тикета без возможности голосовать гостям:
{'!xLike' | snippet : [
'guest' => false,
'class' => 'Ticket',
]}
Вывод рейтинга для текущего ресурса в режиме local:
{'!xLike' | snippet : [
'mode' => 'local',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
Подразумевается, что в ТВ полях likes, dislikes, rating хранится соответствующая информация.Событие xLikeOnVote
Данное событие срабатывает после голосования пользователем и всех проверок.
Параметры плагина
parent — ID объекта, к которому привязан рейтинг,class — класс объекта,
list — название списка,
likes — кол-во лайков,
dislikes — кол-во дизлайков,
rating — текущий рейтинг, уже пересчитанный.
Практическое применение
Задача: при голосовании в рейтинге (с параметрами сниппета class=modResource, list=default), записывать текущий рейтинг в ТВ поле rating.Код плагина:
switch ($modx->event->name) {
case "xLikeOnVote":
if ($class == 'modResource' && $list == 'default') {
if ($resource = $modx->getObject($class, array('id' => $parent))) {
$resource->setTVValue('rating', $rating);
}
}
break;
}
Таким образом, мы сможем сортировать ресурсы (или любые другие объекты) по правильно подсчитанному рейтингу.Демо-сайт
Скачать в Modstore
Если есть желание отблагодарить:
ЯД — 4100159550314
PayPal — pavelgvozdb@yandex.ru
Поблагодарить автора
Отправить деньги
Комментарии: 110
Отличный компонент, спасибо, Павел! Выглядит красиво и функционально. Единственный минус как по мне — нужно вызывать сниппет, а если это делать это из чанка например pdoResources, увеличится количество запросов к БД и время генерации страницы. Есть ли в планах сделать возможным голосование без вызова сниппета (вручную назначить класс/id для кнопок и полосы рейтинга в чанке pdoResources)?
А как вы будете получать рейтинг и кол-во голосов без запросов к БД?
Количество голосов можно из tv поля, или джоином, голоса ведь в бд хранятся? Если правильно проставить js-* классы и data атрибуты должно работать, не понятно только что в propkey попадает, пока не могу «пощупать».
Да, все верно, если сохранять данные рейтинга и кол-ва голосов в полях ресурса или другого объекта, то можно обойтись и без лишних запросов к БД. Вот тут код компонента, а тут непосредственно сниппет, который формирует propkey.
Отправил «спасибо» на яндекс кошелек. Если будет работать без сниппета — будет вообще круто. Позже посмотрю код, как там все устроено.
На счёт дополнительного режима сниппета без запросов к БД можно подумать, хорошая идея!
Единственное, запрос к БД в любом случае будет совершаться, чтобы узнать, голосовал ли юзер уже.
Готово! У сниппета появился дополнительный параметр &mode, позволяет выбрать режим вывода сниппета: db или local. В режиме local сниппет обходится без запроса к базе для того, чтобы узнать кол-во лайков/дизлайков и рейтинг, вместо этого вам будет необходимо передать эти цифры в качестве параметров в сниппет:
{'!xLike' | snippet : [
'mode' => 'local',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
Подразумевается, что в ТВ полях likes, dislikes, rating хранится соответствующая информация.
объясните, куда этот код вообще вставлять и чтобы записывало в ТВ поля.
Объясните пожалуйста, как вот это работает?
Если он «голосует» то в БД попадает соответствующая запись. (НО другому пользователю опять выведется то же значение TV что и было)
Я переношу систему рейтингов и думала, что к значению в TV будут прибавляться значения из БД, но видимо это не так.
Чтобы обновлять TV создала плагин
Так как он должен работать?
Делать как-то так?
{'!xLike' | snippet : [
'mode' => 'local',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
В TV записаны значения и они нормально выводятся пользователю. Если он «голосует» то в БД попадает соответствующая запись. (НО другому пользователю опять выведется то же значение TV что и было)
Я переношу систему рейтингов и думала, что к значению в TV будут прибавляться значения из БД, но видимо это не так.
Чтобы обновлять TV создала плагин
<?php
switch ($modx->event->name) {
case "xLikeOnVote":
if ($class == 'modResource' && $list == 'default') {
if ($resource = $modx->getObject($class, array('id' => $parent))) {
$resource->setTVValue('myLike', $rating);
$resource->setTVValue('likes', $likes);
$resource->setTVValue('dislikes', $dislikes);
$resource->save();
}
}
break;
}
но он все предыдущие значения TV обнуляет.Так как он должен работать?
Делать как-то так?
$resource->setTVValue('likes', $resource->getTVValue('likes') + $likes);
Делать как-то так?Нет, у вас всё верно в плагине, кроме
$resource->save();
, можно без него. MODX при $resource->setTVValue()
уже выполняет сохранение. Поправил в посте.Вероятно у вас что-то закешено. Может база, не знаю. У меня работает корректно на демо-сайте.
Очень странно. Все настройки кэширования по умолчанию.
в tv like стояло 520 стало 2
в tv dislike стояло 70 стало 0
то есть просто записались(посчитались) данные из БД, минуя значения в tv
в tv like стояло 520 стало 2
в tv dislike стояло 70 стало 0
то есть просто записались(посчитались) данные из БД, минуя значения в tv
А, вот вы о чём. Так да, в плагине в переменных $likes и $dislikes реальные значения лайков и дизов, а не накрученные.
Попробуйте ваши накрученные значения вместо записи в ТВшки likes и dislikes, писать их в соседние, например likes_fake, dislikes_fake. В плагине конечно оставить всё, как есть, а при выводе суммировать likes + likes_fake и с дизами тоже самое.
Я с fenom как-то совсем ни как
в снипете заменить
PS Значения не накрученные, попрошу, просто переношу данные из LikeDislike )
в снипете заменить
'likes' => $_modx->resource['likes']
на 'likes' => $_modx->resource['likes_fake'] + $_modx->resource['likes']
?PS Значения не накрученные, попрошу, просто переношу данные из LikeDislike )
'likes' => ($_modx->resource['likes_fake'] + $_modx->resource['likes']),
Примерно…Значения не накрученные, попрошу, просто переношу данные из LikeDislike )Без разницы. Ради удобства повествования.
Спасибо, всё заработало как надо.
PS При использовании tv надо в настройках системы cache_resource выставить на Нет
PS При использовании tv надо в настройках системы cache_resource выставить на Нет
Привет, классно!
Вопросы от меня:
1. пример выборки для pdoResources (с LEFT JOIN имею ввиду) можно?
2. Как реализована защита от повторного голосования гостями и авторизованными пользователями?
Вопросы от меня:
1. пример выборки для pdoResources (с LEFT JOIN имею ввиду) можно?
2. Как реализована защита от повторного голосования гостями и авторизованными пользователями?
1) Пример выборки чего?
2) IP или номер сессии. Для авторизованных юзеров не вижу смысла объяснять…
2) IP или номер сессии. Для авторизованных юзеров не вижу смысла объяснять…
Даже не знаю чего у нас pdoResources выбирает… может быть ресурсы? :)
Например — отсортировать по популярности.
Например — отсортировать по популярности.
Для справки: pdoResources способен выбирать все, что угодно. xLike способен работать с любыми объектами.
Записываете рейтинг в ТВ при голосовании на событии xLikeOnVote и сортируете. Ничего сложного.
Записываете рейтинг в ТВ при голосовании на событии xLikeOnVote и сортируете. Ничего сложного.
Не люблю TV плодить, да и как по нему сортировать то, он строка. С приведением типов разве, что тоже не гуд на больших объемах. Вот и спросил.
Ну можно в таком случае добавить еще одно поле в таблицу ресурсов и прописать его в map массив. В этом случае в плагине на событие xLikeOnVote писать данные рейтинга в него. Тогда можно будет и сортировать без приведения типа.
Думаю Алексей имел ввиду что-то вроде этого:
{'pdoResources' | snippet : [
'loadModels' => 'xLike',
'where' => [
'xlVote.class' => 'modResource'
],
'leftJoin' => [
'xlVote' => [
"class" => "xlVote",
"on" => "modResource.id = xlVote.parent"
]
],
'select' => [
'modResource' => '*',
'xlVote' => [
'COUNT(xlVote.value) as total',
'SUM(xlVote.value = 1) as likes',
'SUM(xlVote.value = -1) as dislikes'
]
]
]}
Можно даже рейтинг посчитать, но это зашквар какой-то:'(((SUM(xlVote.value = 1) + 1.9208) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1)) - 1.96 * sqrt((SUM(xlVote.value = 1) * SUM(xlVote.value = -1)) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1)) + 0.9604) / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1))) / (1 + 3.8416 / (SUM(xlVote.value = 1) + SUM(xlVote.value = -1))) * 100) as rating'
А зачем делать все эти подсчёты на стороне MySQL и джоины, когда в описанном мной способе преимущество в плане быстродействия и ресурсопотребления на лицо?
Согласен, вариант с расширением таблицы гораздо лучше.
Здравствуйте! Прошу помощи — не накапливаются лайки.
В шаблоне вызываю чанк
Меняла
Все равно не накпливаются лайки. как исправить?
В шаблоне вызываю чанк
[[!xLike?
&parent=[[*id]]
&tpl=`tpl.xLikeMy`
]]
Не работают и на xLike.tpl Меняла
&mode=`local`
и &mode=`db`
Пример здесьВсе равно не накпливаются лайки. как исправить?
1) Для начала корректно пропишите вызов сниппета, строго по формату MODX.
2) Потом мне не ясно, что вы хотите накапливать и куда?
3) Я показал конкретные примеры на демо сайте, как надо вызывать и что из этого получается. Если почитать внимательно, то поймете, что к чему и как с этим работать.
2) Потом мне не ясно, что вы хотите накапливать и куда?
3) Я показал конкретные примеры на демо сайте, как надо вызывать и что из этого получается. Если почитать внимательно, то поймете, что к чему и как с этим работать.
Вы решили вопрос с накоплением лайков? Не могли бы, если не сложно, здесь выложите решение и причину? Спасибо заранее.
Наверно до конца не решила, взяла другой плагин LikeDislike
Понял. Спасибо за отклик.
Также ставлю в списке ресурсов вывод
Fenom pdotools_fenom_parser активировала
<small>Число голосов - {$likes | number_format : 0 : '' : ' '}</small>
Верно ли? Или как правильно вывести число лайков?Fenom pdotools_fenom_parser активировала
4) Где вы вызываете {$likes}? В чанке компонента xLike, надеюсь? Тогда работать должно.
Здравствуйте. Подскажите как отсортировать ресурсы по рейтингу? Сейчас сортирует так: Если на одном ресурсе 1 лайк (рейтинг 20,65) а на другом 1 лайк / 1 дизлайк (рейтинг 9,45), то выводится на первое место 2-й ресурс с рейтингом 9,45.
Создал плагин: xLikeOnVote с кодом который вы приводите в описании
Вывод делаю так:
Создал плагин: xLikeOnVote с кодом который вы приводите в описании
Вывод делаю так:
[[!pdoPage?
&element=`getTickets`
&parents=`[[*id]]`
&tpl=`afisha-popular`
&hideContainers=`1`
&includeTVs=`image, rating`
&limit=`4`
&sortby=`{"rating":"DESC"}`
]]
В чанке afisha-popular вызываю [[!xLike? &parent=`[[+id]]` &tpl=`rating`]]
Подскажите, как вывести на первое место ресурс с большим рейтингом?
Так как всё же фильтровать ресурсы по рейтингам? В разделе используется mFilter
Здравствуйте, как скачать? не находит xLike в админке на сайте
нужно добавить нового поставщика: modstore.pro/info/connection и выбрав его найти это дополнение
Подскажите как вывести текущее место в рейтинге для отдельного обьекта голосования? Если подробнее, то на сайте есть голосование за учасниц конкурса (modUser) и нужно на странице учасницы указать на каком она сейчас месте в рейтинге. Дизлайки скрыты, можно только ставить лайк, что и считаеться как один голос.
Здравствуйте, подскажите, как правильно вставить в шаблон. Конструкция
[[!xLike?
&guest = false
]]
работает, но на гостей никак не влияет и гости так же могут ставить лайки. или вызов параметров снипета в данном случае не сработают?
Не понятно как считаеся рейтинг какие то проценты. Процент чего он считает?
Внимательнее.
особенностью компонента является правильный подсчет рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернуллиhabrahabr.ru/company/darudar/blog/143188/
Это вычисление понятно только Вильсону и Бернулли )))) Обычный пользователь не поймёт ни чего…
Добрый день. Напишите пожалуйста как этот компонент привязать к сниппету TicketComments, чтоб можно было комментарии лайкать без авторизации. Желательно без шаблонизатора феном.
Как сделать конструкцию такого плана, аналогичную как на пикабу:
<span class="xlike__count xlike__count_like [ js-xlike-number ]">{$likes}-{$dislikes}</span>
Что бы обновлялось не при перезагрузке страницы, а ajax
только таким образом получилось показывать общую цифру рейтинга
<span class="xlike__count xlike__count_like xlike__count_dislike [ js-xlike-number ]">{$likes-$dislikes}</span>
Но обновляется только после перезагрузки страницы
Как правильно записать это
{'!xLike' | snippet : [
'mode' => 'local',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
не в fenom?[[!xLike?
&parent=[[*id]]
&mode=`local`
&likes=`tv.likes`
&dislikes=`tv.dislikes`
&rating=`tv.myLike`
&tpl=`tpl.xLike`
]]
что-то не работает корректно
Павел, подскажите пжл
Как правильно прописать чтобы после нажатия на likes появлялось кол-во лайков и рейтинг?
Как правильно прописать чтобы после нажатия на likes появлялось кол-во лайков и рейтинг?
Как будет работать, так и прописывайте. Нет тут понятия «правильно».
Подскажите, как сделать чтобы при нажатии на like потом кнопка становилась не кликабельна?
Правками в JS.
Мда… ответ убедительный… :) Спасибо
Добрый день. Подскажите такой момент.
Есть товары. miniShop2
В карточке товара вызываю:
[[!xLike?
&parent=[[*id]]
&mode=`db`
&likes=`$_modx->resource['likes']`
&dislikes=`$_modx->resource['dislikes']`
&rating=`$_modx->resource['rating']`
&tpl=`tpl.xLike`
&class=`msProduct`
&list=`default`
]]
Создал дополнительные TV поля:
likes
dislikes
rating
Далее ставлю лайк товару. Но при редактировании товара поля likes, dislikes, rating по-прежнему пусты. Что я сделал не так? Или чего-то не сделал? Заранее спасибо.
Есть товары. miniShop2
В карточке товара вызываю:
[[!xLike?
&parent=[[*id]]
&mode=`db`
&likes=`$_modx->resource['likes']`
&dislikes=`$_modx->resource['dislikes']`
&rating=`$_modx->resource['rating']`
&tpl=`tpl.xLike`
&class=`msProduct`
&list=`default`
]]
Создал дополнительные TV поля:
likes
dislikes
rating
Далее ставлю лайк товару. Но при редактировании товара поля likes, dislikes, rating по-прежнему пусты. Что я сделал не так? Или чего-то не сделал? Заранее спасибо.
Плагин нужен.
Павел, а можно чуть подробнее? В описании есть код плагина и в комментах есть что-то похожее. И поясните пожалуйста. Создаю плагин в папке xLine? Как назвать, где его прописать, чтобы работало? Если не затруднит. Спасибо.
switch ($modx->event->name) {
case "xLikeOnVote":
if ($class == 'modResource' && $list == 'default') {
if ($resource = $modx->getObject($class, array('id' => $parent))) {
$resource->setTVValue('rating', $rating);
$resource->setTVValue('likes', $likes);
$resource->setTVValue('dislikes', $dislikes);
}
}
break;
}
Спасибо
Добрый день! Как правильно вызвать xLike не в текущем Тикете, а в списке Тикетов, с возможностью голосовать?
В текущем тикете так:
Как сниппет вызвать в списке?
В текущем тикете так:
{'!xLike' | snippet : [
'mode' => 'db',
'tpl'=>'myXLikeTpl',
'class' => 'Ticket',
'likes' => $_modx->resource['likes']
]}
Данные лайков заносятся в TV likes с помощью плагина.Как сниппет вызвать в списке?
Решил проблему. Так вызвал:
{'!xLike' | snippet : [
'mode' => 'db',
'parent'=> $id,
'tpl'=>'myXLikeTpl',
'class' => 'Ticket',
'likes' => $_modx->resource.id | resource : 'likes'
]}
Это не проблема. Это незнание базовых моментов.
Как временно убрать ограничение голосования с одного IP, чтобы можно было проголосовать за ресурс несколько раз?Никак.
Это не проблема. Это незнание базовых моментов.Я с Вами совершенно согласен. Мне стыдно, но я учусь.
По-поводу IP, мне бы хотелось отключать эту проверку где-нибудь в настройках. Сейчас ситуация такая. Есть фотография, которой пытаются поставить оценку, к примеру, три пользователя (каждый со своего устройства), подключенные к одной точке wi-fi. И если кто-то из них первый поставил оценку, то максимум, что могут сделать другие, это отменить оценку, поставленную первым проголосовавшим пользователем, а не оставить свою.
Обновляйтесь.
На демо сайт добавил возможность «потыкать». Второй пример.
Укажите сниппету xLike
1.0.3-beta (30.07.2018)
==============
- В сниппет добавлен параметр &ip, позволяющий отключить проверку по IP
На демо сайт добавил возможность «потыкать». Второй пример.
Укажите сниппету xLike
'ip' => false,
Спасибо. Оперативно.
Как временно убрать ограничение голосования с одного IP, чтобы можно было проголосовать за ресурс несколько раз?
Павел, делаю с помощью Вашего компонента голосование, скажите, можно ли убрать логику правильного подсчета рейтинга на основе вычисления нижней границы доверительного интервала Вильсона для параметра Бернулли?
Т.е. чтобы было как нормальное голосование без учета дизлайка? Куда копать вообще?
Т.е. чтобы было как нормальное голосование без учета дизлайка? Куда копать вообще?
Убрать кнопку дизлайка не получается?
Я убрал, но мне тут заявляют, что голосование работает не так как надо и что типа у кого больше голосов там должно быть 100% на шкале…
Сейчас к примеру 4 голоса и 51%, при скольки голосах будет 100%?
Сейчас к примеру 4 голоса и 51%, при скольки голосах будет 100%?
А как надо? И кто вам это заявляет?..
Тот кто вам это заявляет не понимает принципа работы компонента. Шкала рейтинга не на основании всего кол-ва записей, за которые голосовали (хотел бы я посмотреть, как долго будет отрабатывать такой скрипт, учитывая, что записи постоянно пополняются, а кол-во голосов увеличивается), а на основании формулы, упомянутой вами выше, относительно кол-ва лайков и дизлайков и ещё некоторых моментов, которые используются в формуле.
Проще говоря, если вам надо отсортировать записи на основании только лайков, то сортируйте по лайкам, а не по рейтингу. А если вам надо вывести процентный рейтинг текущей записи, учитывая все записи, то пишите эту логику самостоятельно.
Проще говоря, если вам надо отсортировать записи на основании только лайков, то сортируйте по лайкам, а не по рейтингу. А если вам надо вывести процентный рейтинг текущей записи, учитывая все записи, то пишите эту логику самостоятельно.
Спасибо.
Вот логика
www.strawpoll.me/107782
Т.е. например, проголосовало 10 человек — это 100%
1 работа — 5 человек — 50%
2 работа — 3 человека — 30%
3 работа — 2 человека — 20%
Всего — 10 человек — 100 %
Вашим компонентом такого не сделаешь?
www.strawpoll.me/107782
Т.е. например, проголосовало 10 человек — это 100%
1 работа — 5 человек — 50%
2 работа — 3 человека — 30%
3 работа — 2 человека — 20%
Всего — 10 человек — 100 %
Вашим компонентом такого не сделаешь?
Не сделаешь.
Здравствуйте! Немного странный вопрос, есть большое желание настроить на сервере fastcgi_cache (то есть фактически кешируется весь html код страницы, если произошли изменения он обновляется.)
Проблема в том, что если один юзер проголосовал, на странице подставится класс link_active и она закешируется. Зайдет другой пользователь и ему отдастся страница уже с классом link_active (если он нажмет кнопку с этим классом, по идее ему отдастся окно access denied, но не уверен) Есть возможность настраивать исключения для кеширования, но что тут исключать не понятно. Если кто сталкивался с подобным, поделитесь опытом.
Upd хотя вроде всё работает…
Периодически откуда-то всплывает класс link_active там где его не должно быть, но после обновления страницы уходит
Проблема в том, что если один юзер проголосовал, на странице подставится класс link_active и она закешируется. Зайдет другой пользователь и ему отдастся страница уже с классом link_active (если он нажмет кнопку с этим классом, по идее ему отдастся окно access denied, но не уверен) Есть возможность настраивать исключения для кеширования, но что тут исключать не понятно. Если кто сталкивался с подобным, поделитесь опытом.
Upd хотя вроде всё работает…
Периодически откуда-то всплывает класс link_active там где его не должно быть, но после обновления страницы уходит
Класс .xlike__link_active ставится на тот элемент, который был выбран пользователем. По fastcgi_cache вряд ли подскажу.
Добрый день,
Ни у кого не было проблем после обновления версии до 1.0.3-beta? У меня после обновления перестали работать лайки, нажимаешь на лайк и ничего не происходит. В журнале ошибок ничего нет. Вызываю сниппет так: [[!xLike]]
Ни у кого не было проблем после обновления версии до 1.0.3-beta? У меня после обновления перестали работать лайки, нажимаешь на лайк и ничего не происходит. В журнале ошибок ничего нет. Вызываю сниппет так: [[!xLike]]
Нет. На демо сайте новая версия и всё работает корректно. Ищите проблему локально. Смотрите в консоль браузера.
Хорошо, спасибо
А можно сделать так, чтобы когда лайк поставят заблокировать последующие изменения? и убрать дизлайк. Только одна возможность поставить лайк у любого ресурса? Никак не могу разобраться как это сделать, если вообще возможно.
Только допиливать.
а убрать дизлайк в шаблоне тоже нельзя без допиливания?
вернее закоментировать тэг с «дизлайком» ведь можно, знать бы что это никак не отразиться негативно на работоспособности всего компонента.
Можно. Не отразится.
спасибо за ответ!!!
Добрый день, возможно вывести количество лайков к статье, которую лайкают?
В демке как-то выводится.
Разобрался, может кому поможет:
[[!xLike? &tpl=`tpl_count_like` &parent=`[[+id]]`]]
tpl_count_like{$likes | number_format : 0 : '' : ' '}
Привет! Заметил, что xlike инициализируется и подключает свои скрипты без возможности исключить в настройках шаблоны, а может даже контексты целиком, где он не будет использоваться, или наоборот.
Речь про фронт? Я посмотрю позже.
Да, сниппет ни где на сайте не вызывается, но если xlike установлен то везде подключаются стили и скрипты
<link rel="stylesheet" href="/assets/components/xlike/css/web/default.css" type="text/css" />
</head>
<script type="text/javascript" src="/assets/components/xlike/js/web/default.js"></script>
<script type="text/javascript">
if (typeof(xLikeCls) == "undefined") {
var xLikeCls = new xLike({"actionUrl":"\/assets\/components\/xlike\/action.php"});
}
</script>
Обновляйтесь до 1.0.4.
1.0.4-beta (06.03.2019)
==============
- Поправлена инициализация фронт-энд скриптов
Теперь без вызова сниппета скрипты не будут подключаться.
Павел, приветствую.
Скажите, вы могли бы доработать дополнение, чтобы оно сохраняло в тв-поле список проголосовавших (зарегистрированные пользователи)? Я готов профинансировать.
Заранее благодарен.
Скажите, вы могли бы доработать дополнение, чтобы оно сохраняло в тв-поле список проголосовавших (зарегистрированные пользователи)? Я готов профинансировать.
Заранее благодарен.
Сохранять в ТВ поле id-шники проголосовавших юзеров через запятую? Думаю можно что-то придумать. Пишите в телегу, контакты в профиле.
После установки в панели управления сайтом не появилось интерфейса управления компонентом. В пакетах ведь должен?
Не должен.
Понял, значит ничего не искать :)
Павел, подскажи пожалуйста, можно при дизайле показывать форму Formit что бы получить обратную связь, почему дизлайк?
Повесь modal окно на кнопку с ajaxForm и все
Вариант, но наверное нужно не модалку, а блок display: none при клике display: block
Мысль интересная, спасибо
Мысль интересная, спасибо
Скажите, я можно вывести общее кол-во на весь сайт?
Условно: 76% пользователей считают, что сайт хороший
Условно: 76% пользователей считают, что сайт хороший
Привязать голосовалку к главной странице, наверное.
Не-не, интересует общая статистка, со всех ресурсов. Возможно?
Из коробки – нет.
А можно как то сделать так чтобы пользователь мог поставить лайк только на один пост из всех? Допустим есть 100 постов и лайкнуть он может только 1 из 100.
Не пробовал такое делать. Может и можно что-то придумать. Но на вскидку из коробки вряд ли.
Привет, тут трабл. Не сохраняются лайки, подскажи в чём дело пожалуйста. Все что тут, то и делал, больше нечего. Поле называет rating, всё выводится через pdoResources и $id это ID каждого выведенного ресурса. Буду благодарен! Крутое дополнение :)
Вызов:
{'!xLike' | snippet: [
'parent' => $id,
'class' => 'modResource',
'mode' => 'db',
'list' => 'default',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
tpl.xLike:
{*@formatter:off*}
<{$can? 'a': 'span'}
class=«xlike__link {$value > 0? 'xlike__link_active': ''} [ {$can? 'js-xlike-button': ''} ]»
{$can? 'data-xlike-value=«1» href=«javascript:undefined;»': ''}
>
<svg version=«1.1» id=«Слой_1» xmlns=«www.w3.org/2000/svg» xmlns:xlink=«www.w3.org/1999/xlink» x=«0px» y=«0px»
width=«31px» height=«27px» viewBox=«0 0 31 27» enable-background=«new 0 0 31 27» xml:space=«preserve»>
/>
{$likes | number_format: 0: '': ' '}
</{$can? 'a': 'span'}>
Добавление в TV поле (Плагин: add-rating):
<?php
switch ($modx->event->name) {
case «xLikeOnVote»:
if ($class == 'modResource' && $list == 'default') {
if ($resource = $modx->getObject($class, array('id' => $parent))) {
$resource->setTVValue('rating', $rating);
$resource->save();
}
}
break;
}
{'!xLike' | snippet: [
'parent' => $id,
'class' => 'modResource',
'mode' => 'db',
'list' => 'default',
'likes' => $_modx->resource['likes'],
'dislikes' => $_modx->resource['dislikes'],
'rating' => $_modx->resource['rating'],
]}
tpl.xLike:
{*@formatter:off*}
<{$can? 'a': 'span'}
class=«xlike__link {$value > 0? 'xlike__link_active': ''} [ {$can? 'js-xlike-button': ''} ]»
{$can? 'data-xlike-value=«1» href=«javascript:undefined;»': ''}
>
<svg version=«1.1» id=«Слой_1» xmlns=«www.w3.org/2000/svg» xmlns:xlink=«www.w3.org/1999/xlink» x=«0px» y=«0px»
width=«31px» height=«27px» viewBox=«0 0 31 27» enable-background=«new 0 0 31 27» xml:space=«preserve»>
/>
{$likes | number_format: 0: '': ' '}
</{$can? 'a': 'span'}>
Добавление в TV поле (Плагин: add-rating):
<?php
switch ($modx->event->name) {
case «xLikeOnVote»:
if ($class == 'modResource' && $list == 'default') {
if ($resource = $modx->getObject($class, array('id' => $parent))) {
$resource->setTVValue('rating', $rating);
$resource->save();
}
}
break;
}
подскажите, пожалуйста, как взять параметр из likes_fake? fenom почемуто на сайте не работает, при включении dom обнуляется, так что нужно обойтись без фенома)
вывожу так:
[[!xLike?
&parent=`[[*id]]`
&class=`modResource`
&list=`default`
&likes=`$_modx->resource['likes']`
&dislikes=`$_modx->resource['dislikes']`
&rating=`$_modx->resource['rating']`
]]
вывожу так:
[[!xLike?
&parent=`[[*id]]`
&class=`modResource`
&list=`default`
&likes=`$_modx->resource['likes']`
&dislikes=`$_modx->resource['dislikes']`
&rating=`$_modx->resource['rating']`
]]
fenom почемуто на сайте не работает, при включении dom обнуляется, так что нужно обойтись без фенома)Это проще поправить — Проблемы и решения, как правило мешает какая-нибудь метрика или скрипт на странице.
Можно ли получить список залайканых постов пользователем? Хочу совместить кнопку лайков и избранное.
В коробке нет. Напишите для этого свой сниппет.
Не работает, ругается на конкретный код в переменной var:
<script type="text/javascript">
if (typeof(xLikeCls) == "undefined") {
var xLikeCls = new xLike({"actionUrl":"\/assets\/components\/xlike\/action.php"});
}
</script>
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.