Developing Discourse Plugins - Part 3 - Add custom site settings

You simply need to add a

config/locales/server.zh_CN.yml

file (and similar for any other locales you want to support) with the same English tokens but with language specific values and the plugin will use that instead of falling back to the English.

2 лайка

Thanks for helping! have a nice day!

3 лайка

I was looking how to create a site setting that validates a username, but found there’s a username type to do this. Here the list of site setting types we have today:

  • email
  • username
  • integer
  • regex
  • string
  • list
  • enum

Also, you can do custom validations for your plugin settings, it accepts a validator field that expects a Ruby class. You use it like this.

plugins:
  my_custom_username_validation:
    default: 'system'
    validator: 'UsernameSettingValidator'

You can check the UsernameSettingValidator class to see the interface of validators.

Cheers!

10 лайков

не работает (

<a id="forgot-password-link" class="forgot-password" href="{{Discourse.SiteSettings.myplugin_link_forgot_password}}" target="_blank">Забыли пароль?</a>

settings.yml

plugins:
  myplugin_enabled:
    default: true
    client: true
  myplugin_link_forgot_password:
    default: ''
    client: true

upd:
работает!!!
href="{{unbound siteSettings.myplugin_link_forgot_password}}"

Как отобразить текст HTML?
Не работает {{unbound siteSettings.forum_text_for_admin}}

Обновление:
Работает в *.hbs {{{unbound siteSettings.forum_text_for_admin}}}

Снова вам нужно использовать вычисляемое свойство и отформатировать его как безопасный HTML. Это EmberJS, а не обычный JavaScript. Вы не можете напрямую вставлять «код» в шаблоны. Прочтите руководство по Ember.

1 лайк

уже работает с EmberJS

У меня в settings.yml указано следующее:

plugins:
  county_fence_enabled:
    default: false
    client: true
  county_fence_latrine_category:
    default: -1
    client: true

Это отображается на моей странице /admin/plugins:

Не понимаю, почему там нет кнопки «Настройки»?

Думаю, вместо plugins нужно написать имя плагина county_fence.

2 лайка

Я тоже пробовал это, но разницы нет.

Эта документация (как и автор оригинального вопроса) использует ключ plugins. В других местах я видел, что использовалось название плагина, как вы и сказали.

1 лайк

@bitmage, на самом деле я, возможно, знаю причину.

Вы написали # name: County Fence в plugin.rb?
Если да, то имя должно совпадать с именем вашей директории.

Имя плагина можно переопределить через локаль:

Предположим, у вас такой формат настроек:

county_fence:
  county_fence_enabled: true
  ...

in client.en.yml:

en:
  admin_js:
    admin:
      site_settings:
        categories:
          county_fence: "County Fence"

Установка значения по умолчанию в 0 вместо -1 привела к тому, что настройка стала отображаться.

Есть ли способ узнать, что тип определяется некорректно?

  1. YamlLoader загружает файл.
  2. SiteSettingExtension вызывает setting() с параметрами, сгенерированными YamlLoader.
  3. …что вызывает defaults.load_setting, а затем позже type_supervisor.load_setting.
  4. Хотя type_supervisor.load_setting не получает значение напрямую, у него есть доступ к значениям по умолчанию, так как они передаются при инициализации TypeSupervisor через DefaultsProvider.
  5. type_supervisor.load_setting затем вызывает get_data_type, который вызывает parse_value_type(), что должно вызывать ArgumentError, если тип не может быть определён.

Похоже, что вся эта последовательность вызывается методом load_settings в модели SiteSetting, и я не вижу никакой обработки исключений ни в одном месте этого стека. Однако я не вижу никаких сообщений об ошибках в логе сервера или где-либо ещё.

Кажется, должно быть какое-то уведомление пользователю или запись в журнале ошибок, указывающая на сбой разбора настройки.

Если я правильно понял, вы говорите, что использование значения -1 по умолчанию для настройки приводит к тому, что кнопка «Настройки» не отображается. Можете ли вы воспроизвести это поведение каждый раз?

Это странно. Я не вижу ничего неправильного в ваших настройках, не понимаю, как может произойти сбой при их анализе. :thinking:

Теперь, когда это работает, я могу вернуть значение -1, и всё продолжает функционировать.

Я удалил базу данных, переинициализировал её, но всё ещё не могу воспроизвести проблему. :person_shrugging:

1 лайк

Я развернул плагин на своём рабочем сайте, установив значение по умолчанию 0, чтобы быть уверенным. Кнопка настроек отображается:

image

Но при нажатии на неё список настроек не появляется:

Я отключу плагин, пока продолжаю устранять эту проблему.

Хорошо, я думаю, что в обоих случаях (разработка и продакшн) проблема заключалась в том, что имя папки в директории плагинов не совпадало с county-fence. Именно поэтому настройка не отображалась, и это могло вызвать и другие проблемы.

Спасибо, ребята!

1 лайк

Мне это непонятно. Большинство установленных мной плагинов не используют plugins:, включая официальные и недавние плагины (также шаблон скелета).

Я думал, что эта часть используется для фильтрации настроек, но, возможно, я ошибаюсь.

1 лайк

О, интересно! Извините тогда.

Что я скажу, так это то, что это, apparently, не обязательно.

Я уже потерял счёт количеству плагинов, которые я написал с plugins:.

1 лайк

Чтобы расширить документацию:

Полный список типов настроек сайта доступен в коде type_supervisor.rb. Чуть выше вы также можете увидеть допустимые дочерние ключи, которые принимает настройка сайта.

Более продвинутый пример, использующий больше этих опций, можно найти в компоненте темы discourse-welcome-link. Эти же значения должны работать и внутри плагина, но файл будет находиться по пути config/settings.yml.

3 лайка

Существуют различия между типами компонентов плагинов и тем.

Я попытался составить таблицу (возможны незначительные ошибки или группировка)

Категория Функциональность Синтаксис плагина Синтаксис TC
Базовые типы Строка type: string
min: ..
max: ..
regex: ..
secret: true/false
глобальный
validator: class name
type: string
min: ..
max: ..
-
-
-
-
Многострочный текст type: string
textarea: true
type: string
textarea: true
Целое число type: integer
min: ..
max: ..
type: integer
min: ..
max: ..
Число с плавающей точкой type: float
min: ..
max: ..
type: float
min: ..
max: ..
Булево значение type: bool type: bool
Время type: time -
Null type: null -
Типы выбора Перечисление (выпадающий список) type: enum
choices: [option1, option2]
enum: ..
type: enum
choices: [option1, option2]
Категория type: category -
Цвет type: color -
Группа type: group -
Электронная почта type: email -
Имя пользователя type: username -
Типы списков Общий список type: list
allow_any: true/false
type: list
Простой/компактный список type: simple_list
Или
type: list
list_type: compact
list_type: simple
type: list
list_type: compact
list_type: simple
Список категорий type: category_list type: list
list_type: category
Список групп type: group_list type: list
list_type: group
Список тегов type: tag_list type: list
list_type: tag
Список групп тегов type: tag_group_list -
Список URL type: url_list -
Список хостов type: host_list -
Список значений type: value_list -
Список эмодзи type: emoji_list -
Типы файлов Загрузка type: upload type: upload
Список загруженных изображений type: uploaded_image_list -
Ограничение размера файла type: file_size_restriction
min: ..
max: ..
-
Специальные типы HTML (устарело) type: html_deprecated -
JSON-объекты устарело устарело
Объекты - type: objects
5 лайков