Модификаторы тем: краткое введение

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

Представляем: модификаторы тем :partying_face:

Они указываются с помощью ключа modifiers в файле about.json вашей темы.

Для получения 100% актуального списка модификаторов обратитесь к схеме базы данных в конце файла theme_modifier_set.rb, но вот краткое резюме того, что у нас есть на данный момент:

  • serialize_topic_excerpts boolean (по умолчанию false) — всегда включать отрывки при сериализации списков тем.

  • csp_extensions массив строк — добавлять директивы в CSP. Работает так же, как старый метод настройки темы “extend_content_security_policy”. Но помните, что простые теги <script src=""> разрешены автоматически.

  • svg_icons массив строк — список иконок, которые должны быть включены в подмножество иконок.

  • topic thumbnails массив размеров — запрашивать дополнительные разрешения в наборе миниатюр тем. Обратите внимание, что они генерируются асинхронно, поэтому вы должны использовать исходное изображение в качестве запасного варианта, если запрошенный размер не предоставлен. Дополнительная информация доступна в сообщении коммита.

  • serialize_post_user_badges массив строк — список имен значков (соответствующих записям в таблице значков), которые нужно сериализовать вместе с данными поста. При настройке система включает указанные значки пользователя для каждого поста для рендеринга на стороне клиента.

Одной из тем, которая активно использует эти новые хуки, является Topic List Thumbnails — ознакомьтесь с кодом, чтобы увидеть, как это работает.

Модификаторы, зависящие от настроек

Модификаторы тем также могут быть настроены так, чтобы брать свое значение из настройки темы, позволяя администраторам сайта переопределять поведение модификаторов без редактирования кода темы. Чтобы сделать модификатор зависимым от настройки, используйте следующий синтаксис в вашем файле about.json:

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

Например, если у вас есть настройка темы с именем show_excerpts и вы хотите, чтобы она управляла модификатором serialize_topic_excerpts:

В файле settings.yml:

show_excerpts:
  default: false

В файле about.json:

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

При изменении настройки show_excerpts значение модификатора автоматически обновится в соответствии с ней. Это обеспечивает гибкость для администраторов сайта, позволяя настраивать поведение темы через интерфейс администратора.


Этот документ находится под версионным контролем — предложите изменения на GitHub.

35 лайков

Дэвид, возможно, я немного ленив, чтобы спросить, но есть ли способ получить к этому доступ из плагина:

Темы могут запрашивать дополнительные размеры миниатюр, используя модификатор в своём файле about.json:

Я планирую мигрировать плагин TLP на эту новую схему, и было бы здорово иметь такой же доступ к функциям из плагина, по крайней мере, на время.

2 лайка

Сейчас такого нет, но я посмотрю :eyes:

6 лайков

Дэвид, какой правильный подход для массового пересоздания миниатюр?

Я только что попробовал использовать это на одном из своих сайтов, и, похоже, оно обработало около 10% тем… а затем прекратило работу (или проигнорировало остальное). Я думаю, что это первое, потому что темы, для которых миниатюры были созданы, были последними 10%.

Перепечка постов, похоже, не помогает. На самом деле, я запустил массовую перепечку и wondering, не испортило ли это что-то…

Я заметил, что image_url может быть заполнен, но миниатюр нет.

Любые советы будут очень полезны!

1 лайк

Этот столбец ничего не делает и очень скоро будет удален. Вам нужен image_upload_id.

В этом нет необходимости. Я специально спроектировал систему так, чтобы люди могли устанавливать новые темы без вмешательства в консоль. Миниатюры генерируются асинхронно по мере необходимости. Например:

  • вы добавляете новую тему, которая запрашивает новые разрешения;
  • пользователь запрашивает тему, и мы отображаем существующие миниатюры. Если какие-то размеры отсутствуют, мы планируем задание для Sidekiq.
  • при следующем запросе темы нужные миниатюры уже будут готовы.

Если запрошенный размер миниатюры больше исходного изображения, мы не будем создавать миниатюру.

Таким образом, ключевым моментом для корректной работы этого механизма является:

Пример такой логики возврата есть в компоненте темы для миниатюр, который я создал — не стесняйтесь заимствовать оттуда логику.

5 лайков

Фолбэк сериализуется как thumbnailsl[0]? Да, я уже обрабатываю это (кстати, отличное решение, очень легко обрабатывать).

Возможно, некоторые изображения не «проходят проверку» или не соответствуют критериям?

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

Например, если у вас есть время, взгляните на эти примеры:

Мне кажется, эти превью не проходят отбор. Превью сериализуются как null.

Да, это сделано намеренно — у нас было несколько запросов на удаление маленьких миниатюр onebox. Например, пользователи получали свой аватар GitHub в качестве миниатюры темы, что редко бывает намеренным.

Обратите внимание, что для onebox, где изображение является фактическим контентом (например, фотографии в Instagram/Twitter и т. д.), они будут выбраны.

Что касается видео на YouTube, я исправил это вчера.

5 лайков

Отлично, спасибо за подтверждение.

Это странно, сборка была более свежей, но некоторые всё ещё, похоже, остаются незамеченными.

Да, это отчасти причина, по которой я реализовал выбор миниатюры для ситуаций, когда автоматический выбор не был оптимальным. Возможно, мне всё же потребуется изменить это поведение, но я постараюсь сделать это в плагине.

Спасибо за ваше время, Дэвид!

2 лайка

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

Потом меня осенило. Дело в этом:

Поэтому я предлагаю, что, возможно, действительно потребуется пересобрать контент после установки этого значения на гораздо большее число (например, 365?).

Кажется, я прав, утверждая, что если что-то не загружено локально, то для него не будет создана миниатюра? …

4 лайка

:+1: верно, это работает только для локальных загрузок… возможно, нам стоит пересмотреть настройку «максимальный возраст» :thinking:

8 лайков

У меня есть план, постараюсь реализовать это на этой неделе. Один вопрос: нужно ли, чтобы значения были динамическими?

Т.е. будут ли разрешения определены при загрузке? Или во время выполнения (например, через настройки сайта)?

Первый вариант проще… но второй тоже может быть возможен :thinking:

2 лайка

Спасибо за уделённое время.

Мне нужен фиксированный вариант, точно такой же, как в компоненте темы.

Хотя настройка сайта тоже была бы кстати.

Для полноты картины добавлю: я хотел бы отказаться от плагина, поэтому паритет с решением на основе компонента темы был бы более чем достаточным.

2 лайка

@merefield вот:

Надеюсь, сообщение коммита объясняет, как это работает, но дайте знать, если у вас возникнут вопросы.

7 лайков

Отлично. Только что добавил в TLP, и похоже, что всё работает! Спасибо за помощь!

4 лайка

4 сообщения были перенесены в новую тему: Получение миниатюр из JSON-эндпоинтов

Можно ли сделать так, чтобы это работало и для изображений с удалённого сервера? Например, для изображений с Blogger, Picasa или Amazon S3?

Поскольку Discourse поддерживает размещение на Amazon S3 для сайтов с большими и крупными изображениями, теперь, если всё должно размещаться напрямую на локальном сервере, такая методика проектирования выглядит недостатком.

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

Это решение предназначено только для работы с загрузками Discourse. Они могут размещаться в S3 или в другом сервисе, если вы используете

Мы рекомендуем использовать параметр сайта download_remote_images для автоматической загрузки изображений, которые подключены по горячей ссылке с других сайтов.

4 лайка

Привет, Дэвид, нужно ли что-то особенное сделать, чтобы в TC можно было использовать иконки Pro?

1 лайк

Ничего особенного, нет. Это должно работать точно так же, как и использование Pro-иконок в других местах Discourse. Я полагаю, вы используете этот плагин для включения Pro-иконок?

Если это не работает, дайте мне знать, и я займусь этим :eyes:

2 лайка

Да, мы будем. Попробуем ещё раз. Спасибо за ответ поздно вечером!

2 лайка