Фильтр сообщества, реализация
Умолчательная настройка узла: community_filter = true
Актуальный чеклист разработки
NB: Всё, помеченное красным — в старом баг-трекере (он не сохранился).
Модификация БД
- Патч в БД (написать, внедрить, внести в БТ)
-
Загружать поле filter в _Load*
-
Сохранять поле filter наравне с crossposted
Второй патч — «шторки» (написать, внедрить, внести в БТ)
-
Внедрить на все доступные мне узлы второй патч
-
Распознавание фильтра по НПЖ-адресу
-
Работать только по наличию настройки $rh->community_filter=1;
-
внести in, by в число резервированных слов
-
INIT: сохранять распознанное в $this->npj_filter, больше нигде не отмечать
-
Распознавание фильтра по URL-адресу
-
Работать только по наличию настройки $rh->community_filter=1;
-
http://npj.ru/in/prodesign/by/kuso/8721
-
http://npj.ru/prodesign/by/kuso/8721
-
http://npj.ru/in/prodesign/by/foreign/pixelapes/mendokusee/8721
-
Конвертация НПЖ-адресов в URL
-
Работать только по наличию настройки $rh->community_filter=1;
-
Линк не должен рисовать «трупики» вокруг in/by
-
Конвертация адреса вида in/.../by/... (принудительная установка фильтра)
-
Пробовать загрузить из кэша и проверить, можем ли применять фильтр
-
Конвертация адреса, когда он без фильтра
-
Пробовать загрузить из кэша и проверить, можем ли применять фильтр
-
Использовать $rh->account->npj_filter для постановки
-
Принудительное создание адреса без фильтра in/kuso@npj
-
NpjObject::_Load должен игнорировать in/../by/ & in/
-
Вака-разметка: в логине может присутствовать /
-
Ссылки вида in/slipper/by/kuso@synpj:4565/comments
- Использование фильтра
-
Работать только по наличию настройки $rh->community_filter=1;
-
Используем $rh->object->npj_filter
-
Сообщение: редиректить, если фильтр не совпадает
-
Это в handlers/record/show.php
-
Комментарии: научиться фильтровать на базе фильтра
-
Это в handlers/comments/show.php outer join or stuff
- Action feed: посты только в рамках фильтра — кажется сделать слишком сложно, откладываем
- Работать только по наличию настройки $rh->community_filter=1;
- Используем $rh->object->npj_filter
-
Интерфейсы
-
Работать только по наличию настройки $rh->community_filter=1;
-
Комментарии: флип между доступными фильтрами
-
Комментарии, модерация: уметь показывать и «зашторенные» для модератора (оставаясь в фильтре)
-
Комментарии: показывать ссылку на установку или сброс шторки
-
Комментарии, модерация: вкл./выкл. шторки в текущем фильтре, если можем
-
Работать только по наличию настройки $rh->community_filter=1;
-
типичный конфирм
-
проверять права как у модераторов фильтра
-
важно, что шторка должна быть установлена независимо на всё поддерево
-
Не забыть размножить шаблоны и CSS между шкурами
-
academic
-
minikui
Разное
Метод реализации
- Правка в БД filter — содержит imploded через , логины аккаунтов «местного» узла, где может быть показано сообщение
- При постановке ссылки всегда пользуемся filter
- Если он не пустой, то берём первый элемент
- Правка в БД r1_filtered_comments таблица, содержит comment_id, filter_user_id, moderator_id, created_datetime
- Первые два понятно для чего
- Вторые два пока для статистики
- Альтернативный вариант реализации: поле filter в таблице r1_comments. А там фильтры перечислены через запятую, как у поста
- Плюсы варианта: похоже на пост, не нужно дополнительной таблицы
- Минусы варианта: обрезку фильтра придётся делать дополнительным проходом по комментам.
- С другой стороны, если фильтеренный комментарий скрывает и всё поддерево, наверное это самый простой способ сделать это дополнительным проходом.
- Однако, на каждый коммент придётся делать explode + array_flip + hash-search.
- Выбран основной вариант
Восстанавливаем адресную схему
Предлагаемый URL-формат:
-
http://npj.ru/in/prodesign/by/kuso/8721
-
http://npj.ru/in/prodesign/by/foreign/pixelapes/mendokusee/8721
Предлагаемый НПЖ-формат:
- in/prodesign/by/kuso@npj
- in/prodesign/by/mendokusee@pixelapes/npj
- in/kuso@npj
Как это делается:
- in — новое ключевое слово, которое говорит, что мы используем эту схему адресации
- by — разделитель пространства, сквозь которое адресуем
- понятно, что это пространство всегда на том же узле, где находится [реплицированный] профиль автора сообщения.