Если брать phpBB 3.3.x и, например, готовое расширение
Thanks for posts, то схема может выглядеть примерно так.
1. Не писать систему лайков с нуля
За основу ставится готовое расширение
Thanks for posts. У него уже есть:
- добавление/удаление лайка;
То есть дописывать нужно только логику, определяющую, где и кому эта система доступна.
2. Добавить два параметра в базу
Через стандартную migration расширения добавить:
Код: Выделить всё
phpbb_posts:
post_likes_enabled TINYINT(1) NOT NULL DEFAULT 1
Это настройка конкретного сообщения:
Код: Выделить всё
1 = автор разрешил лайки
0 = автор запретил лайки
И:
Код: Выделить всё
phpbb_users:
user_show_likes TINYINT(1) NOT NULL DEFAULT 1
Это личная настройка пользователя:
Код: Выделить всё
1 = показывать мне систему лайков
0 = вообще не показывать мне лайки
То есть существующая таблица самих лайков остаётся за расширением
Thanks for posts. Эти два поля только управляют доступностью и отображением.
3. Добавить галочку в редактор сообщения
Для этого не нужно редактировать posting.php или шаблоны phpBB напрямую.
В расширении можно использовать template event:
и вывести в форме:
Код: Выделить всё
<input type="checkbox"
name="post_likes_enabled"
value="1"
checked>
Разрешить лайки для этого сообщения
При редактировании существующего сообщения состояние галочки берётся из
post_likes_enabled.
В PHP-части для формы можно использовать событие:
и передавать в Twig, например:
4. Сохранить выбор автора вместе с сообщением
При нажатии «Отправить» расширение получает:
Код: Выделить всё
$request->variable('post_likes_enabled', 0)
и через штатное событие phpBB:
добавляет это значение в SQL, которым phpBB создаёт или обновляет запись в
phpbb_posts.
То есть при обычной отправке сообщения фактически сохраняется:
Код: Выделить всё
post_id = 12345
poster_id = 100
post_text = ...
post_likes_enabled = 0
Никакой отдельной таблицы для этой настройки даже не требуется.
5. При открытии темы передать это значение в шаблон сообщения
При формировании
viewtopic.php значение
post_likes_enabled нужно получить вместе с данными сообщения.
Для этого у phpBB есть события:
Код: Выделить всё
core.viewtopic_get_post_data
core.viewtopic_modify_post_row
В
post_row можно добавить, например:
Код: Выделить всё
'S_POST_LIKES_ENABLED' => (bool) $row['post_likes_enabled'],
'S_USER_SHOW_LIKES' => (bool) $this->user->data['user_show_likes'],
После этого для каждого сообщения форум уже знает одновременно:
Код: Выделить всё
разрешил ли лайки автор сообщения;
хочет ли текущий читатель видеть лайки.
6. Условие отображения получается простым
Кнопку и счётчик показывать только при условии:
То есть условно:
Код: Выделить всё
Автор разрешил + читатель разрешил = показываем лайки.
Автор запретил + читатель разрешил = ничего не показываем.
Автор разрешил + читатель отключил лайки = ничего не показываем.
Автор запретил + читатель отключил = ничего не показываем.
У пользователя, отключившего лайки в профиле, интерфейс форума фактически будет выглядеть так, как будто функции лайков вообще нет.
7. Одного скрытия кнопки недостаточно
Это важно: запрет автора нужно проверять ещё и непосредственно при AJAX-запросе на постановку лайка.
То есть обработчик Thanks for posts перед добавлением записи должен получить:
Код: Выделить всё
SELECT post_likes_enabled
FROM phpbb_posts
WHERE post_id = ...
и если:
не добавлять лайк вообще.
Иначе технически кнопку можно было бы скрыть, но запрос отправить вручную.
Иными словами, проверка должна быть и в интерфейсе, и на сервере.
8. Отключение лайков пользователем
В личном разделе phpBB (UCP) можно добавить настройку:
Она меняет только:
Если выбрано «Нет», расширение не выводит этому пользователю:
- связанные с лайками элементы интерфейса.
При необходимости туда же можно привязать отключение уведомлений о лайках.
9. Уже поставленные лайки при запрете можно не удалять
Если автор сначала разрешил лайки, получил несколько, а затем при редактировании сообщения снял галочку, сами записи можно оставить в таблице расширения.
Просто:
и они перестают отображаться/приниматься.
Если автор снова разрешит лайки, прежние данные останутся. Это проще и безопаснее, чем физически удалять записи при каждом переключении.
10. В самом phpBB менять файлы ядра не требуется
Это можно оформить отдельным расширением, например:
Код: Выделить всё
ext/
└── vendor/
└── likecontrol/
├── composer.json
├── ext.php
├── config/
│ └── services.yml
├── event/
│ └── listener.php
├── migrations/
│ └── v100.php
├── styles/
│ └── prosilver/
│ └── template/
│ └── event/
│ └── posting_editor_options_prepend.html
└── language/
└── ru/
└── common.php
Самая специфическая часть - связать эту проверку с конкретным расширением лайков, чтобы его AJAX-обработчик тоже учитывал
post_likes_enabled. Это уже зависит от того, какое именно расширение будет выбрано.
Но сама логика "настройка у каждого сообщения + настройка отображения у каждого пользователя" укладывается в обычный механизм расширений phpBB и не требует переписывания форума.
Могу поднять тестовый сервер phpBB и попробовать сначала реализовать эту систему на нём, чтобы убедиться, что это реализуемо и правильно работает.