# Добавление настроек в тему Discourse

**URL:** https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557
**Category:** Developer Guides
**Tags:** how-to, theme-guides
**Created:** [08.Март.2018 22:28:58 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557 "2018-03-08T22:28:58Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![Discourse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/discourse/32/148734_2.png) [@Discourse](https://meta.discourse.org/u/Discourse)
#### Post date: [08.Март.2018 22:28:59 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/1 "2018-03-08T22:28:59Z")

</div>

Discourse позволяет темам иметь «настройки», которые разработчики тем могут добавлять, чтобы владельцы сайтов могли настраивать темы через интерфейс, не изменяя ни одной строки кода и не беспокоясь о потере изменений при будущих обновлениях темы.

Темы также могут изменять определенные настраиваемые параметры сайта. Для получения дополнительной информации см. тему [Настраиваемые параметры сайта](https://meta.discourse.org/t/-/374376).

## ➕ Добавление настроек в вашу тему

Добавление настроек в тему немного отличается от добавления кода CSS и JS: это невозможно сделать через интерфейс.

Способ добавить настройки — создать [репозиторий для вашей темы](https://meta.discourse.org/t/how-to-develop-custom-themes/60848?u=osama) и в корневой папке вашего репозитория создать новый файл `settings.yaml` (или `settings.yml`). В этом файле вы будете использовать язык [YAML](https://en.wikipedia.org/wiki/YAML) для определения настроек вашей темы.

> 📢 **Примечание:** Вам может пригодиться использование [Theme CLI](https://meta.discourse.org/t/discourse-theme-cli-console-app-to-help-you-build-themes/82950?u=osama), которое значительно упрощает процесс разработки.

Если вы знакомы с разработкой плагинов, это не будет для вас новостью — в основном это работает так же, как добавление параметров сайта в ваш плагин. Просто добавьте валидный YAML в файл настроек, и всё будет готово.

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

```yaml
simple_setting: true

```

Как вы, вероятно, догадались, это создаст настройку с именем `simple_setting`, и её значением по умолчанию будет `true`.

Аналогичным образом, вы можете добавить что-то вроде этого:

```yaml
site_name: My Forums
max_avatars: 7

```

И у вас появится две дополнительные настройки: `site_name`, которая будет строковой настройкой со значением по умолчанию “My Forums”, и `max_avatars` как целочисленная настройка со значением по умолчанию 7.

 ![image](https://global.discourse-cdn.com/meta/original/4X/f/1/8/f184f8f16a50a7e3c15efc462e1f07b6dbada223.jpeg)

Вы можете обращаться к своим настройкам в JS-коде так: `settings.your_setting_key`.

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

## 🔣 Поддерживаемые типы

Существует 9 типов настроек:

1. `integer`
2. `float`
3. `string`
4. `bool` (для логических значений)
5. `list`
6. `enum`
7. `objects` (замена для `json_schema`)
8. `upload` (для изображений)
9. `icon` (для одной иконки из набора иконок Discourse)

И вы можете указать тип, добавив атрибут `type` к вашей настройке, как здесь:

```yaml
float_setting:
  type: float
  default: 3.14

```

Следует отметить, что вам не всегда нужно явно устанавливать атрибут `type`, потому что Discourse достаточно умный, чтобы определить тип настройки по её значению по умолчанию. Поэтому вы можете сократить приведенный выше пример до такого:

```yaml
float_setting:
  default: 3.14

```

Тем не менее, вы _должны_ установить атрибут типа при работе с настройками **`list`** , **`enum`** и **`icon`** , иначе Discourse не распознает их правильно.

**Настройка списка (List Setting):**

```yaml
whitelisted_fruits:
  default: apples|oranges
  type: list

```

**Настройка перечисления (Enum Setting):**

```yaml
favorite_fruit:
  default: orange
  type: enum
  choices:
    - apple
    - banana

```

 ![image](https://global.discourse-cdn.com/meta/original/4X/8/f/3/8f3a9f54ad0312a9435d9559eadeeeb9978f5145.jpeg)

Если разница между настройками списка и перечисления вам не ясна: настройки перечисления позволяют пользователям вашей темы выбирать только _одно_ значение из набора значений, определенных вами (см. атрибут `choices`).

С другой стороны, настройки списка позволяют вашим пользователям создавать собственный _список_ (т.е. массив) значений. Они могут добавлять в список значений по умолчанию настройки или удалять из него.  
Вы можете установить список значений по умолчанию для настройки, соединив значения символом вертикальной черты |. См. настройку списка в примере выше.

Вы можете увидеть реальный пример использования настроек списка здесь: [Auto-Linkify Words](https://meta.discourse.org/t/linkify-words-in-post-theme-component/82193?u=osama).

> 📢 **Примечание** : Обращайте внимание на отступы при работе с YAML, так как YAML очень чувствителен к пробелам и выдаст ошибку синтаксиса, если отступы в вашем коде неверны.

**Настройка иконки (Icon Setting):**

```yaml
banner_icon:
  default: bullhorn
  type: icon

```

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

### Тип `objects`

Тип настройки `objects` — это специальный тип, который позволяет вам создавать продвинутые настройки с настраиваемой структурой и валидациями. Для этого типа есть [отдельная документация](https://meta.discourse.org/t/objects-type-for-theme-setting/305009).

## 🔠 Описание настроек и локализация

Вы можете добавить текст описания к настройке темы, и он будет отображаться как метка непосредственно под настройкой. Для этого просто добавьте атрибут `description` к вашей настройке, как здесь:

```yaml
whitelisted_fruits:
  default: apples|oranges
  type: list
  description: "Этот текст будет отображаться под этой настройкой и объяснять, что она делает!"

```

И вы получите это:

 ![image](https://global.discourse-cdn.com/meta/original/4X/6/3/4/634e39cb47a710b98844f08b871563f8c283a651.jpeg)

### Поддержка нескольких языков

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

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

> **Список языков**
>
> | Код | | | | Название |
> | --- | --- | --- | --- | --- |
> | ar | | | | اللغة العربية |
> | bs\_BA | | | | bosanski jezik |
> | ca | | | | català |
> | cs | | | | čeština |
> | da | | | | dansk |
> | de | | | | Deutsch |
> | el | | | | ελληνικά |
> | en | | | | English |
> | es | | | | Español |
> | et | | | | eesti |
> | fa\_IR | | | | فارسی |
> | fi | | | | suomi |
> | fr | | | | Français |
> | gl | | | | galego |
> | he | | | | עברית |
> | id | | | | Indonesian |
> | it | | | | Italiano |
> | ja | | | | 日本語 |
> | ko | | | | 한국어 |
> | lv | | | | latviešu valoda |
> | nb\_NO | | | | Norsk bokmål |
> | nl | | | | Nederlands |
> | pl\_PL | | | | język polski |
> | pt | | | | Português |
> | pt\_BR | | | | Português (BR) |
> | ro | | | | limba română |
> | ru | | | | Русский |
> | sk | | | | slovenčina |
> | sq | | | | Shqip |
> | sr | | | | српски језик |
> | sv | | | | svenska |
> | te | | | | తెలుగు |
> | th | | | | ไทย |
> | tr\_TR | | | | Türkçe |
> | uk | | | | українська мова |
> | ur | | | | اردو |
> | vi | | | | Việt Nam |
> | zh\_CN | | | | 中文 |
> | zh\_TW | | | | 中文 (TW) |

(Если вы не видите свой язык в списке, возможно, вам стоит взглянуть на [How to add a new language](https://meta.discourse.org/t/how-to-add-a-new-language/14970?u=osama))

Затем вам нужно найти код вашего языка из списка выше и использовать код языка как ключ под атрибутом `description`, а перевод как значение для этого ключа, как здесь:

```yaml
whitelisted_fruits:
  default: apples|oranges
  type: list
  description:
    en: English text
    ar: نص باللغة العربية
    fr: Texte français

```

И теперь у вас есть поддержка 3 языков: английского, арабского и французского.

## Дополнительные атрибуты и опции настроек

### Атрибуты Min и max

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

Чтобы указать ограничения, просто добавьте атрибут `min` или `max` или оба к вашей настройке, как здесь:

```yaml
integer_setting:
  default: 10
  min: 5
  max: 100

```

Вы можете указать ограничения для настроек типа `integer`, `float` и `string`. Для настроек `integer` и `float` само значение настройки проверяется на соответствие ограничениям. А для настроек `string` длина значения проверяется на соответствие указанным ограничениям.

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

### Доступ к настройкам в вашем JS/CSS/Handlebars

Настройки темы доступны глобально как переменная `settings` в файлах JavaScript темы. Например:

```gjs
// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  console.log("settings are", settings);
});

```

Этот объект `settings` также можно использовать как обычный внутри тегов `<template>` в `.gjs`.

### Установка CSS-переменных

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

Так что, если у вас была настройка float с именем `global_font_size` и строковая настройка с именем `site_background`, вы могли бы сделать что-то вроде этого в CSS вашей темы:

```scss
html {
  font-size: #{$global-font-size}px;
  background: $site-background;
}

```

### Разрешение членства в группах

Компонентам темы иногда необходимо показывать или скрывать функцию на основе того, находится ли текущий пользователь в настроенной группе. Избегайте проверки `currentUser.groups` для этого, так как он включает только группы, видимые пользователю, и может упускать скрытые группы.

Для настроек списка, основанных на группах, добавьте `resolve_group_membership: true`, чтобы разрешить проверку на стороне сервера:

```yaml
copy_button_allowed_groups:
  default: "1|3"
  type: list
  list_type: group
  resolve_group_membership: true

```

Этот вариант действителен только тогда, когда настройка имеет `type: list` и `list_type: group`. Когда он включен, объект `settings` на фронтенде не включает исходный список групп. Вместо этого Discourse добавляет булево значение с тем же именем настройки, но с префиксом `user_in_`:

```gjs
// {theme}/javascripts/discourse/api-initializers/init-theme.gjs
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  if (!settings.user_in_copy_button_allowed_groups) {
    return;
  }

  // Пользователь находится хотя бы в одной выбранной группе.
});

```

Сгенерированное булево значение также работает с автоматическими группами, такими как `logged_in_users` и `anonymous_users`. Настройки объектов темы могут использовать тот же вариант для свойств `type: groups`. Подробности см. в [objects type for theme settings](https://meta.discourse.org/t/-/305009).

## 🔗 Связанные темы

- [Developing Discourse Themes & Theme Components](https://meta.discourse.org/t/developer-s-guide-to-discourse-themes/93648)

* * *

Этот документ управляется по версиям - предложите изменения [на github](https://github.com/discourse/discourse/blob/main/docs/developer-guides/docs/05-themes-components/09-theme-settings.md).

---

<div class="post-metadata">

### Author: ![mcwumbly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcwumbly/32/103861_2.png) [@mcwumbly](https://meta.discourse.org/u/mcwumbly)
#### Post date: [19.Май.2024 11:28:26 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/84 "2024-05-19T11:28:26Z")

</div>

> [@Osama](#):
>
> ### Тип `json_schema`
> 
> Настройка типа JSON Schema — это новый и уникальный тип настройки, который позволяет решать множество сложных задач.

Интересно, стоит ли нам заменить этот раздел чем-то, касающимся: [Objects type for theme setting](https://meta.discourse.org/t/objects-type-for-theme-setting/305009)

Возможно, нам также стоит добавить ссылку из этой документации на: [Migrate Discourse theme settings](https://meta.discourse.org/t/migrate-discourse-theme-settings/287783)

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [03.Январь.2025 15:33:53 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/85 "2025-01-03T15:33:53Z")

</div>

> [@Discourse](#):
>
> ### Тип `json_schema`
> 
> Настройка типа JSON Schema — это новый и уникальный тип настройки, который позволяет решать множество сложных задач.

> [@Dave McClure](#):
>
> Интересно, не стоит ли заменить этот раздел чем-то вроде: [Тип объектов для настройки темы](https://meta.discourse.org/t/objects-type-for-theme-setting/305009)

Да. Я потратил почти час, пытаясь заставить json\_schemas работать. (Хотя я знал о новом и улучшенном способе решения этой задачи!!)

@Osama, если ты не можешь обновить это самостоятельно, пожалуйста, попроси кого-нибудь, кто может. Спасибо.

---

<div class="post-metadata">

### Author: ![Osama](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/osama/32/98013_2.png) [@Osama](https://meta.discourse.org/u/Osama)
#### Post date: [04.Январь.2025 12:12:41 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/87 "2025-01-04T12:12:41Z")

</div>

Извините, что это произошло. Вот PR для обновления документации: [Replace references to `json_schema` with `objects` type documentation by OsamaSayegh · Pull Request #26 · discourse/discourse-developer-docs · GitHub](https://github.com/discourse/discourse-developer-docs/pull/26)

---

<div class="post-metadata">

### Author: ![gormus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gormus/32/428592_2.png) [@gormus](https://meta.discourse.org/u/gormus)
#### Post date: [04.Июль.2025 10:00:32 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/89 "2025-07-04T10:00:32Z")

</div>

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

К сожалению, следующий вариант не работает. Интересно, есть ли для этого специальный метод. Или вообще, возможно ли это?

Есть ли способ динамически получить URL ресурса, чтобы использовать его в качестве значения по умолчанию?

```json
// about.json
{
  "assets": {
    "box_default_image": "assets/box-default-image.png"
  }
}

```

```yaml
# settings.yml

box_image:
  type: upload
  default: settings.theme_uploads.box_default_image

```

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [07.Июль.2025 07:16:23 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/90 "2025-07-07T07:16:23Z")

</div>

Вы пробовали ключ из `about.json`? Что-то вроде

```plaintext
# settings.yml

box_image:
  type: upload
  default: "box_default_image"

```

---

<div class="post-metadata">

### Author: ![gormus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gormus/32/428592_2.png) [@gormus](https://meta.discourse.org/u/gormus)
#### Post date: [08.Июль.2025 19:43:17 UTC](https://meta.discourse.org/t/add-settings-to-your-discourse-theme/82557/91 "2025-07-08T19:43:17Z")

</div>

@moin Это работает отлично! Спасибо!
