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

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 Me gusta

Thanks for helping! have a nice day!

3 Me gusta

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 Me gusta

not working (

<a id="forgot-password-link" class="forgot-password" href="{{Discourse.SiteSettings.myplugin_link_forgot_password}}" target="_blank">Forgot password?</a>

settings.yml

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

upd:
working!!!
href="{{unbound siteSettings.myplugin_link_forgot_password}}"

how to display text html ?
not working {{unbound siteSettings.forum_text_for_admin}}

upd:
working in *.hbs {{{unbound siteSettings.forum_text_for_admin}}}

Again you need to use a Computed Property and format as safe html. This is EmberJS not vanilla JavaScript. You can’t put ‘code’ directly into templates. Read the ember guides.

1 me gusta

already working with EmberJS

Tengo esto en mi settings.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:

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

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

2 Me gusta

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

Esta documentación (así como el OP) usa la clave plugins. En otros lugares he visto que se usa el nombre del plugin, como has dicho.

1 me gusta

@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:

county_fence:
  county_fence_enabled: true
  ...

en client.en.yml:

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

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 carga el archivo.
  2. SiteSettingExtension llama a setting() con los parámetros generados por YamlLoader
  3. …lo que llama a defaults.load_setting y más tarde a type_supervisor.load_setting
  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() que debería lanzar un ArgumentError si el tipo no se puede detectar.

Creo que toda esta secuencia es llamada por load_settings 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.

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. :thinking:

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. :person_shrugging:

1 me gusta

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

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

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

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!

1 me gusta

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)

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

1 me gusta

¡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:

1 me gusta

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. 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. Estos mismos valores deberían funcionar dentro de un plugin, pero el archivo estaría en config/settings.yml.

3 Me gusta

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
5 Me gusta