# Desarrollando Plugins de Discourse - Parte 3 - Añadir configuraciones personalizadas del sitio

**URL:** https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115
**Category:** Developer Guides
**Tags:** plugin-guides, tutorial
**Created:** [16 Julio, 2015 15:35 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115 "2015-07-16T15:35:33Z")
**Posts on this page:** 20
**Page:** 2

<div class="post-metadata">

### Author: ![Mittineague](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mittineague/32/114259_2.png) [@Mittineague](https://meta.discourse.org/u/Mittineague)
#### Post date: [28 Abril, 2018 19:48 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/21 "2018-04-28T19:48:13Z")

</div>

> [@1c7](#):
>
> the translation missing hint

You simply need to add a

```plaintext
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.

---

<div class="post-metadata">

### Author: ![1c7](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/1c7/32/94822_2.png) [@1c7](https://meta.discourse.org/u/1c7)
#### Post date: [29 Abril, 2018 05:52 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/22 "2018-04-29T05:52:52Z")

</div>

Thanks for helping! have a nice day!

---

<div class="post-metadata">

### Author: ![eatcodetravel](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/eatcodetravel/32/94385_2.png) [@eatcodetravel](https://meta.discourse.org/u/eatcodetravel)
#### Post date: [19 Julio, 2018 21:09 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/23 "2018-07-19T21:09:16Z")

</div>

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.

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

```

You can check the [UsernameSettingValidator](https://github.com/discourse/discourse/blob/master/lib/validators/username_setting_validator.rb) class to see the interface of validators.

Cheers!

---

<div class="post-metadata">

### Author: ![Dev\_Work](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dev_work/32/124200_2.png) [@Dev\_Work](https://meta.discourse.org/u/Dev_Work)
#### Post date: [18 Diciembre, 2019 07:52 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/24 "2019-12-18T07:52:14Z")

</div>

no funciona (

```plaintext
<a id="forgot-password-link" class="forgot-password" href="{{Discourse.SiteSettings.myplugin_link_forgot_password}}" target="_blank">¿Olvidaste tu contraseña?</a>

```

settings.yml

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

```

actualización:  
¡funciona!!!  
`href="{{unbound siteSettings.myplugin_link_forgot_password}}"`

---

<div class="post-metadata">

### Author: ![Dev\_Work](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dev_work/32/124200_2.png) [@Dev\_Work](https://meta.discourse.org/u/Dev_Work)
#### Post date: [28 Diciembre, 2019 12:20 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/25 "2019-12-28T12:20:40Z")

</div>

¿Cómo mostrar texto HTML?  
No funciona `{{unbound siteSettings.forum_text_for_admin}}`

 ![2019-12-28_152158](https://global.discourse-cdn.com/meta/original/3X/b/7/b7de978ca1684d1ce9b546c5103df3167bee4415.png)

Actualización:  
Funciona en \*.hbs {{{unbound siteSettings.forum\_text\_for\_admin}}}

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [28 Diciembre, 2019 12:29 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/26 "2019-12-28T12:29:56Z")

</div>

Nuevamente, necesitas usar una Propiedad Computada y formatearla como HTML seguro. Esto es EmberJS, no JavaScript vanilla. No puedes poner ‘código’ directamente en las plantillas. Lee las guías de Ember.

---

<div class="post-metadata">

### Author: ![Dev\_Work](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dev_work/32/124200_2.png) [@Dev\_Work](https://meta.discourse.org/u/Dev_Work)
#### Post date: [28 Diciembre, 2019 12:36 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/27 "2019-12-28T12:36:16Z")

</div>

ya trabajando con EmberJS

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [28 Febrero, 2025 16:22 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/33 "2025-02-28T16:22:40Z")

</div>

Tengo esto en mi `settings.yml`:

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

```

Esto aparece en mi página /admin/plugins:

 ![image](https://global.discourse-cdn.com/meta/original/4X/a/4/e/a4e2472cda29b0b17e5ab33643ef90b45903a8e0.png)

¿No entiendo por qué no hay un botón de Configuración?

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [28 Febrero, 2025 17:00 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/34 "2025-02-28T17:00:19Z")

</div>

Creo que en lugar de `plugins`, deberías escribir el nombre del plugin `county_fence`.

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [4 Marzo, 2025 00:40 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/35 "2025-03-04T00:40:05Z")

</div>

Ya he intentado eso también, sin ninguna diferencia.

[Esta documentación](https://github.com/discourse/discourse-developer-docs/blob/main/docs/04-plugins/03-site-settings.md) (así como el OP) usa la clave `plugins`. En otros lugares he visto que se usa el nombre del plugin, como has dicho.

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [4 Marzo, 2025 01:14 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/36 "2025-03-04T01:14:09Z")

</div>

@bitmage en realidad, podría conocer la causa.

¿Escribiste `# name: County Fence` en `plugin.rb`?  
Si es así, el nombre debe ser igual que el nombre de tu directorio.

El nombre del plugin puede ser sobrescrito desde el locale:

Suponiendo que tengas este formato de configuración:

```yaml
county_fence:
  county_fence_enabled: true
  ...

```

en `client.en.yml`:

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

```

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [4 Marzo, 2025 03:21 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/37 "2025-03-04T03:21:33Z")

</div>

Establecer el valor predeterminado en 0 en lugar de -1 hizo que apareciera.

¿Hay alguna forma de saber que un tipo no se está detectando correctamente?

1. [YamlLoader](https://github.com/discourse/discourse/blob/main/lib/site_settings/yaml_loader.rb) carga el archivo.
2. [SiteSettingExtension llama a setting()](https://github.com/discourse/discourse/blob/main/lib/site_setting_extension.rb#L713) con los parámetros generados por YamlLoader
3. …lo que llama a [defaults.load\_setting](https://github.com/discourse/discourse/blob/main/lib/site_settings/defaults_provider.rb#L16) y más tarde a [type\_supervisor.load\_setting](https://github.com/discourse/discourse/blob/main/lib/site_setting_extension.rb#L770)
4. A pesar de que `type_supervisor.load_setting` no recibe directamente el valor, tiene acceso a los valores predeterminados porque se pasan cuando se inicializa TypeSupervisor a través de DefaultsProvider.
5. `type_supervisor.load_setting` llama entonces a `get_data_type` que llama a [parse\_value\_type()](https://github.com/discourse/discourse/blob/main/lib/site_settings/type_supervisor.rb#L65) que debería lanzar un ArgumentError si el tipo no se puede detectar.

Creo que toda esta secuencia es llamada por [load\_settings](https://github.com/discourse/discourse/blob/main/app/models/site_setting.rb#L38) en el modelo SiteSetting, y no veo ningún manejo de excepciones en ninguna parte de la pila. Pero no veo ninguna salida de error en el registro del servidor, ni en ningún otro lugar.

Parece que debería haber _algún_ tipo de retroalimentación al usuario o registro de errores para indicar que una configuración no se pudo analizar.

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [4 Marzo, 2025 04:08 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/38 "2025-03-04T04:08:15Z")

</div>

Si entiendo bien, dices que usar -1 como valor predeterminado en una configuración hace que el botón “Configuración” no aparezca. ¿Puedes reproducir este comportamiento siempre?

Eso es extraño. No veo nada malo en tu configuración, no estoy seguro de cómo es posible que falle el análisis. 🤔

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [4 Marzo, 2025 04:40 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/39 "2025-03-04T04:40:26Z")

</div>

Ahora que funciona, puedo volver a cambiarlo a -1 y sigue funcionando.

Eliminé la base de datos, la reinicialicé y todavía no puedo reproducirlo. 🤷

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [6 Marzo, 2025 16:40 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/40 "2025-03-06T16:40:02Z")

</div>

He implementado el plugin en mi sitio web en producción usando el valor predeterminado de 0, solo para estar seguro. El botón de configuración se muestra:

![image](https://cdck-file-uploads-global.s3.dualstack.us-west-2.amazonaws.com/meta/optimized/4X/9/f/7/9f7bd5bc1f9c40007eeb04faf556db2218a22453_2_690x55.png)

Pero cuando hago clic en él, no se muestran configuraciones:

 ![image](https://global.discourse-cdn.com/meta/original/4X/6/a/8/6a84452d17f447ac47d642a3dbdd424f271db34b.png)

Desactivaré el plugin mientras continúo solucionando este problema.

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [6 Marzo, 2025 20:26 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/42 "2025-03-06T20:26:32Z")

</div>

Ok, creo que en ambos casos (desarrollo y producción) se debió a que la carpeta en el directorio de plugins no coincidía con `county-fence`. Esa es la razón por la que la configuración no se mostraba, y tal vez podría causar otros problemas también.

¡Gracias a todos!

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [6 Marzo, 2025 20:31 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/43 "2025-03-06T20:31:08Z")

</div>

> [@merefield](#):
>
> Eso no es correcto. Debería ser `plugins` según el OP.

No me queda claro. La mayoría de los plugins que he instalado no usan `plugins:`, lo que incluye plugins oficiales y recientes (también la [plantilla esqueleto](https://github.com/discourse/discourse-plugin-skeleton/blob/main/config/settings.yml))

Pensé que esa parte se usaba para filtrar la configuración, pero quizás me equivoque.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [6 Marzo, 2025 20:41 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/44 "2025-03-06T20:41:21Z")

</div>

¡Oh, interesante! Disculpas entonces.

Lo que diré es que aparentemente no es necesario.

He perdido la cuenta de la cantidad de plugins que he escrito con `plugins:`

---

<div class="post-metadata">

### Author: ![bitmage](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bitmage/32/389881_2.png) [@bitmage](https://meta.discourse.org/u/bitmage)
#### Post date: [15 Marzo, 2025 18:42 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/45 "2025-03-15T18:42:50Z")

</div>

Para ampliar la documentación:

Una lista completa de los tipos de Configuración del sitio está disponible [en el código de type\_supervisor.rb](https://github.com/discourse/discourse/blob/0ebd0a0bd5e44d3604e89ec47168f1065c6139cb/lib/site_settings/type_supervisor.rb#L32). Justo encima también puedes ver las claves secundarias válidas que acepta una Configuración del sitio.

Un ejemplo más avanzado que utiliza más de estas opciones se puede encontrar en el [componente temático discourse-welcome-link](https://github.com/discourse/discourse-welcome-link-banner/blob/c4e78f57e16dd44e916db9b22aedece8fd3a1790/settings.yml#L66). Estos mismos valores deberían funcionar dentro de un plugin, pero el archivo estaría en `config/settings.yml`.

---

<div class="post-metadata">

### Author: ![Arkshine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/arkshine/32/298682_2.png) [@Arkshine](https://meta.discourse.org/u/Arkshine)
#### Post date: [15 Marzo, 2025 23:08 UTC](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115/46 "2025-03-15T23:08:09Z")

</div>

Existen diferencias entre los tipos de componentes de plugins y temas.

Intenté crear una tabla (se esperan errores menores o agrupaciones)

| Categoría | Funcionalidad | Sintaxis de Plugin | Sintaxis de TC |
| --- | --- | --- | --- |
| **Tipos Básicos** | Cadena | `type: string`  
`min: ..`  
`max: ..`  
`regex: ..`  
`secret: true/false`  
global  
`validator: nombre de clase` | `type: string`  
`min: ..`  
`max: ..`  
-  
-  
-  
- |
| | Texto multilínea | `type: string`  
`textarea: true` | `type: string`  
`textarea: true` |
| | Entero | `type: integer`  
`min: ..`  
`max: ..` | `type: integer`  
`min: ..`  
`max: ..` |
| | Flotante | `type: float`  
`min: ..`  
`max: ..` | `type: float`  
`min: ..`  
`max: ..` |
| | Booleano | `type: bool` | `type: bool` |
| | Hora | `type: time` | - |
| | Nulo | `type: null` | - |
| **Tipos de Selección** | Enum (desplegable) | `type: enum`  
`choices: [opción1, opción2]`  
`enum: ..` | `type: enum`  
`choices: [opción1, opción2]` |
| | Categoría | `type: category` | - |
| | Color | `type: color` | - |
| | Grupo | `type: group` | - |
| | Correo electrónico | `type: email` | - |
| | Nombre de usuario | `type: username` | - |
| **Tipos de Lista** | Lista genérica | `type: list`  
`allow_any: true/false` | `type: list` |
| | Lista simple/compacta | `type: simple_list`  
O  
`type: list`  
`list_type: compact`  
`list_type: simple` | `type: list`  
`list_type: compact`  
`list_type: simple` |
| | Lista de categorías | `type: category_list` | `type: list`  
`list_type: category` |
| | Lista de grupos | `type: group_list` | `type: list`  
`list_type: group` |
| | Lista de etiquetas | `type: tag_list` | `type: list`  
`list_type: tag` |
| | Lista de grupos de etiquetas | `type: tag_group_list` | - |
| | Lista de URL | `type: url_list` | - |
| | Lista de hosts | `type: host_list` | - |
| | Lista de valores | `type: value_list` | - |
| | Lista de emojis | `type: emoji_list` | - |
| **Tipos de Archivo** | Cargar | `type: upload` | `type: upload` |
| | Lista de imágenes cargadas | `type: uploaded_image_list` | - |
| | Restricción de tamaño de archivo | `type: file_size_restriction`  
`min: ..`  
`max: ..` | - |
| **Tipos Especiales** | HTML (obsoleto) | `type: html_deprecated` | - |
| | Objetos JSON | _obsoleto_ | _obsoleto_ |
| | Objetos | - | `type: objects` |

[Previous page](https://meta.discourse.org/t/developing-discourse-plugins-part-3-add-custom-site-settings/31115.md?page=1)
