Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2016-11-28 20:09:58

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

[MOD] Like (similar to Facebook)

Собираюсь написать систему лайков для форума, которая была бы подобна фейсбуковской. А то хочется поблагодарить Висмана, а простой и удобной кнопки нет smile

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

Feature list:
  • если ты зарегистрирован, можешь лайкнуть сообщение,

  • можешь передумать и убрать свой лайк,

  • все видят сколько лайков набрало сообщение,

  • ты видишь лайкал ли ты сам это сообщение

  • graceful degradation, если JS вдруг недоступен, кнопка всё равно должна работать, пусть с перегрузкой страницы.

Как это мне видится на уровне таблиц БД.

В posts добавить колонку num_likes с числом лайков. Это позволит без джойнов выводить цифры в ленте сообщений.
Отдельная таблица post_likes с уникальным составным ключём (user_id, post_id) чтобы определять голосовал ли пользователь за сообщение.

Думается мне, что "лайкать" будут часто, а "разлакивать" очень редко. Поэтому слегка оптимизирую наиболее частый кейс. Не буду делать предварительный select чтобы узнать лайкал ли уже пользователь это сообщение. База сама подскажет через возвращаемое число добавленных записей.

$db->query("INSERT IGNORE INTO post_likes(user_id, post_id, created_on) VALUES($uid, $pid, $now)");
if ($db->affected_rows()) {
    // Yes, I like it
    $db->query("UPDATE posts SET num_likes = num_likes + 1 WHERE id = $pid");
} else {
    // No, I changed my mind
    $db->query("UPDATE posts SET num_likes = num_likes - 1 WHERE id = $pid");
    $db->query("DELETE FROM post_likes WHERE user_id = $uid AND post_id = $pid");
}

Продолжение следует…


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

  • Нравится: 3

#2 2016-11-28 20:17:29

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

Итак, для вывода количества лайков в каждом сообщении нам не надо добавлять джойны. Достаточно впилить одну колонку в таблицу posts. Но выше я включил фичу, что пользователь будет видеть статус лайкал ли он сам конкретное сообщение. То есть нам таки понадобится обращение к post_likes при выводе ленты.

Я думаю можно это сделать один раз, когда у нас будет накоплен список сообщений на странице. Причем только в случае если пользователь не Guest.

$pids = implode(',', $post_ids);
$result = $db->query("SELECT post_id FROM post_likes WHERE user_id = $uid AND post_id IN($pids)");

Итоговый список будем использовать для добавления класса active в кнопки Like.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

  • Нравится: 1

#3 2017-01-08 16:10:02

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

Применил мод к нашему форуму. Если вы зарегистрированный пользователь, обратите внимание на строку под каждым сообщением. Там должна появиться ссылка "Понравилось"/"Разонравилось".

Лайкайте!!! Задавайте вопросы, предлагайте улучшения (я всё равно сделаю по своему).


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

  • Нравится: 2

#4 2017-01-08 16:30:13

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,013

Re: [MOD] Like (similar to Facebook)

@artoodetoo, счас народ красивостей просить будет smile


Моя сборка FluxBB 1.5

Offline

#5 2017-01-08 18:01:04

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

Не знаю когда соберусь с силами чтобы оформить мод как принято. Пока некогда.
Как есть скачать можно отсюда (пробелы уберите):

https: // dl.dropboxusercontent.com/u/11837706/flux-likes-20160108.zip
https : //www.dropbox.com/s/2022e93oux82nes/flux-likes-20160108.zip?dl=0

во viewtopic все изменения можно найти diff-ом либо посиком подстроки "vote"
в стили добавил только один селектор .postnumvotes


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

  • Нравится: 1

#6 2017-01-09 16:02:44

Aлександр
Участник
Зарегистрирован: 2016-08-12
Сообщений: 52

Re: [MOD] Like (similar to Facebook)

artoodetoo пишет:

Не знаю когда соберусь с силами чтобы оформить мод как принято. Пока некогда.
Как есть скачать можно отсюда (пробелы уберите):

https: // dl.dropboxusercontent.com/u/11837706/flux-likes-20160108.zip

во viewtopic все изменения можно найти diff-ом либо посиком подстроки "vote"
в стили добавил только один селектор .postnumvotes

Этого мода явно не хватало, к тому же сама реализация в стилях это дело техники, главное что теперь можно выводить самый топовый пост, или про100 сделал вывод сообщений по рейтингу.

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

Offline

#7 2017-01-09 16:38:46

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,013

Re: [MOD] Like (similar to Facebook)

По аналогии можно сделать дизлайк и....

И тут начинается война wink


Моя сборка FluxBB 1.5

Offline

  • Нравится: 3

#8 2017-01-10 01:14:38

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

Добавил csrf_token и иконку.
Думаю как бы органично впилить лайки в поиск и пользовательский профиль.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

  • Нравится: 1

#9 2017-01-11 02:18:52

Aлександр
Участник
Зарегистрирован: 2016-08-12
Сообщений: 52

Re: [MOD] Like (similar to Facebook)

artoodetoo пишет:

Добавил csrf_token и иконку.
Думаю как бы органично впилить лайки в поиск и пользовательский профиль.

Может сделать опцию возможности ставить лайки только на тему, для первого поста?

$voted = array_search($cur_post['id'], $voted_ids) !== false;
if (!empty($cur_post['num_votes']) && $pun_config['o_postlike'] == '1' &&  $cur_topic['first_post_id']  {
if ($voted)
$post_actions[] = '<li class="postnumvotes">'.sprintf($lang_vote['Num Votes w. You'], $cur_post['num_votes']).'</li>';
else
$post_actions[] = '<li class="postnumvotes">'.sprintf($lang_vote['Num Votes'], $cur_post['num_votes']).'</li>';
}
else if($pun_config['o_postlike'] == '2' && !empty($cur_post['num_votes'])) {
if ($voted)
$post_actions[] = '<li class="postnumvotes">'.sprintf($lang_vote['Num Votes w. You'], $cur_post['num_votes']).'</li>';
else
$post_actions[] = '<li class="postnumvotes">'.sprintf($lang_vote['Num Votes'], $cur_post['num_votes']).'</li>';
}

Offline

  • Нравится: 1

#10 2017-01-11 10:21:23

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

Может сделать опцию возможности ставить лайки только на тему, для первого поста?

Да, в этом есть смысл.

Есть такая идея: считать лайк первого сообщения особым образом — лайкать саму тему. Как на StackOverflow: есть баллы за вопросы и есть баллы за ответы. Если сделать так, то можно будет сортировать темы по лайкам.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#11 2017-04-03 16:49:54

wwput
Участник
Зарегистрирован: 2011-03-06
Сообщений: 31

Re: [MOD] Like (similar to Facebook)

@artoodetoo,
По ссылке https: //dl.dropboxusercontent.com/u/11837706/flux-likes-20160108.zip файла больше нет.
Если не сложно, перезалейте пожалуйста.

2017-04-15 18:18:31 artoodetoo пишет:

я делал ссылку некликабельной. наверное есть причины :) не надо это "исправлять" пожалуйста

Offline

#12 2017-04-15 18:19:08

artoodetoo
Admin by chance
Зарегистрирован: 2008-09-09
Сообщений: 860
Сайт

Re: [MOD] Like (similar to Facebook)

https: //www.dropbox.com/s/2022e93oux82nes/flux-likes-20160108.zip?dl=0


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Offline

#13 2017-04-16 22:46:04

wwput
Участник
Зарегистрирован: 2011-03-06
Сообщений: 31

Re: [MOD] Like (similar to Facebook)

спасибо

Offline

#14 2017-06-12 13:53:32

serpech
Новичок
Зарегистрирован: 2017-06-12
Сообщений: 8

Re: [MOD] Like (similar to Facebook)

При переходе в темы получаю такую неприятность

File: \viewtopic.php
Line: 232

FluxBB reported: Unable to fetch vote info 

Database reported: Table 'fbb.post_votes' doesn't exist (Errno: 1146)

Догадываюсь что нужно создать таблицу.Как правильно это сделать?

Offline

#15 2017-06-12 16:03:32

Visman
Administrator
Из Сибирь
Зарегистрирован: 2009-06-08
Сообщений: 2,013

Re: [MOD] Like (similar to Facebook)

@serpech, видимо такая табличка нужна

 CREATE TABLE `fx15_post_votes` (
   `post_id` int(10) unsigned NOT NULL DEFAULT '0',
   `user_id` int(10) unsigned NOT NULL DEFAULT '0',
   `voted` int(10) unsigned NOT NULL DEFAULT '0',
   PRIMARY KEY (`user_id`, `post_id`)
 );

 ALTER TABLE `prefix_posts` 
 ADD COLUMN `num_votes` mediumint(8) unsigned NOT NULL DEFAULT '0';

Вместо fx15_ и prefix_ нужно подставить префикс своих таблиц и выполнить оба запроса в phpMyAdmin на базе форума.


Моя сборка FluxBB 1.5

Offline

  • Нравится: 2

#16 2017-06-12 17:52:06

serpech
Новичок
Зарегистрирован: 2017-06-12
Сообщений: 8

Re: [MOD] Like (similar to Facebook)

Спасибо!Работает прекрасно.

Offline

Подвал доски

Под управлением FluxBB. Хостинг Digital Ocean

[ Сгенерировано за 0.056 сек, 10 запросов выполнено - Использовано памяти: 528.93 KB (Пик: 613.59 KB) ]