Когда-то давно я создал тему Неглобальные доработки движка MyBB (с предложениями по PHP реализации), и весь функционал оттуда уже либо был реализован, либо мы решили его не делать, часть их которых делал лично я...
И вот, у меня появилось немного свободного времени летом, и несколько идей по дополнениям движка, которые либо просто давно напрашиваются и реализуются абсолютно костыльными способами, либо просто пришли мне в голову как возможные инструменты для будущих проектов (не только моих, я уверен, другие тоже найдут применения).
И я решил сделать для них отдельную тему, что бы не перегружать предыдущую.
Отдельно упомяну: это проект. Это значит, что всё, что здесь приведено — это предмет для обсуждения, которые могут быть изменены перед конечной реализации (и, скорее всего, будут). Вы можете оставлять свои предложения и отзывы!
Ну, поехали!
Добавлено спустя 1 день 9 часов 8 минут 24 секунды: Для отслеживания изменений в этом тексте, я сделал репозиторий kozhilya/mybb-ru-updates. В нём будет всё то, что есть здесь, просто можно будет смотреть по изменениям основной ветки, какие изменения были в этим текстом
Эти изменения будут полезны, в первую очередь, для форумов, использующие свой стиль с несколькими темами. Огромное количество ролевых форумов используют эту идею, и все реализации в той или иной степени костыльные и не без проблем.
Демонстрация проблемы, которую предлагается решить1.1. Настройки (Администрирование - Свой стиль)
Использовать свой стиль: да/нет (существует сейчас как поле "Свой стиль").
Использовать стандартный extra.css: да/нет (существует сейчас как опция в "Свой стиль").
API-настройка темы стиля (Новое): короткое поле ввода, допустимы только символы латинского алфавита, дефис и подчёркивание (регулярка [a-zA-Z\-_]+). Настройка отключается, если поле пустое.
Структура style.css (без изменений)
Структура style_cs.css (без изменений)
1.2. Темы форума
Идея в том, что администратор форума может выделить одно из полей API-настроек пользователя так, что бы оно включалось как дата-атрибут тега <body> (возможно сделать к <html>?).
ПримерПусть админ введёт в поле "API-настройка темы стиля" это значение как forum-style, после чего, используя один из распространённых скриптов переключения стиля, устанавливает API-настройку пользователя запросом:
/api.php?method=storage.set&token=***&key=forum-style&value=example_theme
Тогда для этого пользователя форум будет генерировать для страниц форума код
<body data-forum-style="example_theme">...</body>
И администратор может стилизовать эту тему, используя префиксом селектор атрибута
[data-forum-style="example_theme"] .post-content { ... }
Такой метод, будучи довольно простым, позволит стилизовать темы (почти) без использования дополнительного JS (скрипт понадобится для переключения). Но, что важнее, в этом случае нужная тема сможет начать формироваться до того, как начнёт формироваться контент, это позволит избежать "моргания" (см. "Демонстрация проблемы" выше), например, светлого фона по умолчанию, если у пользователя выбрана тёмная тема.
1.3. Дополнительные расширения на обсуждение
Список допустимых значений — сам по себе мало полезен
Встроенный в движок скрипт переключения стилей — список допустимых значений теперь поможет сформировать список значений сюда.
Отдельные таблицы стилей для разных тем — требует сильного изменения бек-енда формирования стилей, я лично не думаю, что это стоит реализовывать.
Речь идёт про использование таблицы style.css для общих элементов стиля, style_example_theme.css для темы "example_theme", style_another_theme.css для темы "another_theme" и т.д. Потребует список допустимых значений.Возможность включить ротацию темы по времени — слишком нишево, потребует использование crontab на бек-енде.
Используются для отправки сообщений внешним сервисам о том, что на форуме произошли изменения.
Идея в том, что сейчас скрипты уведомлений и статистик сейчас используют не особо эффективные скрипты для получения информации об информации о новых сообщениях, которое заключается в тупом сканировании раз в N минут содержимого форума... Что может быть как медленно для активных форумов, так и слишком часто для медленных форумов.
Идея в том, что бы сделать систему, аналогичную Discord или Github... Я ещё подумаю над тем, что бы сделать систему хуков полностью совместимую с этими сервисами, честно, я не задумывался об этом, когда писал черновик
2.1. Манифест
JSON на внешнем сервисе, сообщающий о создателе, его контактах, ссылки для техподдержки и том, какие изменения проверяются внешним сервисом.
Структура:
name — строка, отображаемое в админке название;
description — строка, описание хука;
link — строка, ссылка на полное описание;
version — строка, информация о версии;
author — строка, имя создателя;
receiver — строка, полный URL скрипта на внешнем сервисе, который будет обрабатывать входящие хуки;
hooks — массив строк, содержащий список всех.
2.2. Работа хука
Хуки бывают 2 видов: перед событием (before) и после него (after). Скорее всего, я пока не планирую хуки перед событием, так как они нужны, что бы заранее изменить входящие данные, и я не вижу, как и зачем это нужно: это можно делать через JS перед отправкой формы
Хук совершает curl-запрос по адресу, указанном в манифесте в поле reciever. Данные передаются методом POST, таймаут запроса 10 секунд.
Данные всегда имеют эти поля, в дополнение к указанным в п. 2.3:
forum_id — число, id форума, посылающего хук;
event — строка, событие, из-за которого создан хук;
data — объект, данные о конкретном хуке.
2.3. Хуки
2.3.1. Создание хука (hook.register)
Создаётся после того, как хук был зарегистрирован или обновлён в системе
Данные хука:
url — строка, URL форума (основной домен);
title — строка, Название форума.
2.3.2. Регистрация пользователя (user.create)
После регистрации пользователя
Данные хука:
user_id — число, id нового пользователя.
2.3.3. Изменение пользователя (user.edit)
После изменения профиля пользователя
Данные хука:
user_id — число, id изменённого пользователя.
2.3.4. Создание сообщения (message.post)
После создания нового сообщения
post_id — число, id нового сообщения;
author_id — число, id автора сообщения;
topic_id — число, id темы, в котором было создано сообщение;
forum_id — число, id форума, в котором было создано сообщение.
2.3.5. Редактирование сообщения (message.edit)
После изменения сообщения (втч перемещения)
Данные хука:
post_id — число, id изменённого сообщения;
author_id — число, id автора исходного сообщения;
editor_id — число, id пользоватлея, редактирующего сообщение;
topic_id — число, id темы, в котором было создано сообщение;
forum_id — число, id форума, в котором было создано сообщение.
2.3.6. Удаление сообщения (message.delete)
После создания нового сообщения
Данные хука:
post_id — число, id удалённого сообщения.
2.3.7. Оценка сообщения (message.rate)
После создания нового сообщения
Данные хука:
post_id — число, id оценённого сообщения;
author_id — число, id пользователя, чьё сообщение было оценено;
sender_id — число, id пользователя, кто оценил сообщение$
change — число, значение оценки (+1 или -1).
3.1. Исправление: дефис в атрибутах
kolobdur74 написал(а):kozhilya, кстати во время разработки вкладок вв-кодом столкнулся с тем, что не хватает возможности добавления предустановленных атрибутов. Хотел реализовать вкладки через input и label, но пришлось отказаться. Но это так, а вот, то что в классах нельзя использовать дефис или подчеркивание - это неудобно, то есть так работать не будет: acont[div.window.active-vkladka/data-content]:im, а вот так работает: acont[div.window.activevkladka/data-content]:im. В принципе тоже не критично))
3.2. Исправление: пустые параграфы в заголовках спойлеров
Проблема возникает в заголовках спойлеров, которые имеют тег [align]. Это баг из предыдущего изменения, который никто не решился исправить. Что ж, я его породил, мне его и удалять
ПримерПусть имеется исходный bb-код
[spoiler="[align=center]Пример[/align]"] ... [/spoiler]
Парсер его модифицирует как:
<div onclick="$(this).toggleClass('visible'); $(this).next().toggleClass('visible');">
</p>
<p style="text-align:center;">Пример</p>
<p>
</div>3.3. Тег [kbd]
Для того, что бы вставлять bb-код в строке.
3.3.1. ПримерИсходный код:
Код:Используй тег [kbd][b]имя[/b][/kbd], что бы выделить имя жирным.HTML-код:
Код:<p>Используй тег <kbd>[b]имя[/b]</kbd>, что бы выделить имя жирным.Вообще, конечно, <code> был бы корректнее... Но [code] уже занят просто капитально xD
3.3.2. Добавление в форму ответа3.4. Обновление страницы /help.php
Произвести обновление страницы /help.php
3.4.1. Добавить основную вёрстку форума
... Потому что сейчас её нет. И на кастомных дизайнах это выглядит... Странно.3.4.2. Обновить со всеми новыми тегами
Я сам полезу3.4.3. Возможно
Окно для описания кастомных bb-кодов
Дополнительные страницы и навигация между ними
Добавить изображение для темы, которое будет добавляться в meta-теги темы, которая позволит сделать отображение ссылки на тему в социальных сетях и месcенджерах красивее.
Из самой большой проблемы, которую я вижу сейчас: потребуется изменение структуры БД, правда, незначительное: новый столбец в таблице тем, типа "VARCHAR(255)", значение по умолчанию — пустая строка.
4.1. Форма ответа
При изменении темы, если доступно изменение темы (в частности, есть поле "Название темы") перед формой ответа добавляется дополнительное текстовое поле "Изображение темы".
4.2. Список тем
Код:<td class="tcl tcl-image"> <div class="intd"> <div class="icon"><!-- --></div> <!-- Новое --> <div class="image"> <img src="https://placehold.co/600x400" alt="Название темы"> </div> <!-- Конец нового --> <div class="tclcon"> <span class="acchide">1</span> <a href="https://forum.mybb/viewtopic.php?id=123">Название темы</a> <span class="byuser"> kozhilya</span> </div> </div> </td>tcl-image — класс для обозначения, что у темы есть изображение.
4.3. Мета-теги
Код:<meta property="og:title" content="Название темы"> <meta property="og:url" content="https://forum.mybb/viewtopic.php?id=123"> <!-- Новое --> <meta property="og:image" content="https://placehold.co/600x400"> <meta property="og:description" content="Тут будут первые 100 символов сообщения, из которого удалены все html-теги, используя php-метод strip_tags"> <meta property="og:type" content="article"> <!-- Конец нового -->4.4. Основное изображение
Дополнительное поле в "Администрирование - Настройки" - "Основные".
Баннер форума — Изображение, которое будет добавляться в карточки в мессенджерах, когда вы добавляете ссылку на форум.
Это изображение будет добавляться в <meta property="og:image"> на всех страницах, если на странице нет другого релевантного изображения ()
Идеи по включению популярных скриптов в "Администрирование - Скрипты"
5.1. Стрелочки прокрутки
Популярный скрипт, который используется на многих форумах.
Опции:
Показывать стрелку "В конец страницы" — да/нет;
Всегда показывать стрелки — да/нет, если "нет", то стрелка "вверх" будет скрываться, если страница прокручена в начало (как на этом форуме).
5.2. Переключение стилей
В дополнение к обновлению в п. 1.
Опции:
Список вариантов — многострочный список, возможно, брать список из "Список допустимых значений" (см. п. 1.3).
5.3. Быстрый вход
Используется на многих форумах как "PR-вход". Добавляет пункт в pun-navlinks.
Опции:
id пользователя — id-пользователя, быстрый вход в которого будет происходить.
Потребует дополнения в PHP, который позволит вход без ввода пароля... Ну либо добавить опцию "пароль"
Набор изменений, предлагаемых в системе API
6.1. Метод boart.setSettings
Использовать для передачи настроек в JavaScript-переменную, которая будет установлена в <head>.
Параметры:
token — Значение необходимо брать из JavaScript переменной ForumAPITicket. Обязательный параметр.
data — JSON настроек.
Главная проблема, которую я тут вижу: вопрос безопасности. Какие аккаунты должны иметь право на установку этого значения?
Отредактировано kozhilya (Вс, 9 Июл 2023 13:17:17)