Sviluppo di plugin Discourse - Parte 3 - Aggiungi impostazioni personalizzate del sito

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 Mi Piace

Thanks for helping! have a nice day!

3 Mi Piace

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 Mi Piace

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 Mi Piace

already working with EmberJS

Ho questo nel mio settings.yml:

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

Questo viene visualizzato nella mia pagina /admin/plugins:

Non capisco perché non ci sia un pulsante Impostazioni?

Penso che invece di plugins, dovresti scrivere il nome del plugin county_fence.

2 Mi Piace

Ci ho provato anche io, senza alcuna differenza.

Questa documentazione (così come l’OP) usa la chiave plugins. In altri posti ho visto usare il nome del plugin, come hai detto tu.

1 Mi Piace

@bitmage in realtà, potrei conoscere la ragione.

Hai scritto # name: County Fence in plugin.rb?
Se sì, il nome deve essere lo stesso del nome della tua directory.

Il nome del plugin può essere sovrascritto dal locale:

Supponendo tu abbia questo formato di impostazioni:

county_fence:
  county_fence_enabled: true
  ...

in client.en.yml:

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

Impostare il valore predefinito su 0 invece che su -1 l’ha fatto apparire.

C’è un modo per sapere che un tipo non viene rilevato correttamente?

  1. YamlLoader carica il file.
  2. SiteSettingExtension chiama setting() con i parametri generati da YamlLoader
  3. …che chiama defaults.load_setting e successivamente type_supervisor.load_setting
  4. Anche se type_supervisor.load_setting non riceve direttamente il valore, ha accesso ai valori predefiniti perché vengono passati quando TypeSupervisor viene inizializzato tramite DefaultsProvider.
  5. type_supervisor.load_setting chiama quindi get_data_type che chiama parse_value_type() che dovrebbe sollevare un ArgumentError se il tipo non può essere rilevato.

Penso che tutta questa sequenza sia chiamata da load_settings nel modello SiteSetting, e non vedo alcuna gestione delle eccezioni in nessuno stack. Ma non vedo alcun output di errore nel log del server, o altrove.

Sembra che dovrebbe esserci un qualche tipo di feedback utente o log di errore per dire che un’impostazione non è stata analizzata correttamente.

Se ho capito bene, stai dicendo che usare -1 come valore predefinito in un’impostazione fa sì che il pulsante "Impostazioni" non appaia. Riesci a riprodurre questo comportamento ogni volta?

È strano. Non vedo nulla di sbagliato nelle tue impostazioni, non sono sicuro di come sia possibile un errore nell’analisi. :thinking:

Ora che funziona posso riportarlo a -1 e continua a funzionare.

Ho eliminato il database, l’ho reinizializzato e ancora non riesco a riprodurlo. :person_shrugging:

1 Mi Piace

Ho distribuito il plugin sul mio sito live utilizzando l’impostazione predefinita di 0 per sicurezza. Il pulsante delle impostazioni viene visualizzato:

image

Ma quando ci clicco sopra non vengono elencate le impostazioni:

Disabiliterò il plugin mentre continuo a risolvere questo problema.

Ok, penso che in entrambi i casi (dev e produzione) sia stato perché la cartella nella directory dei plugin non corrispondeva a county-fence. Questo è il motivo per cui l’impostazione non veniva visualizzata e potrebbe causare anche altri problemi.

Grazie a tutti!

1 Mi Piace

Non mi è chiaro. La maggior parte dei plugin che ho installato non usa plugins:, inclusi plugin ufficiali e recenti (anche il modello scheletro)

Pensavo che quella parte fosse usata per il filtraggio delle impostazioni, ma potrei sbagliarmi.

1 Mi Piace

Oh interessante! Mi scuso allora.

Quello che dirò è che non è necessario, apparentemente.

Ho perso il conto dei plugin che ho scritto con plugins:

1 Mi Piace

Per espandere la documentazione:

Un elenco completo dei tipi di Impostazioni del sito è disponibile nel codice di type_supervisor.rb. Appena sopra è possibile vedere anche le chiavi figlio valide che un’Impostazione del sito accetta.

Un esempio più avanzato che utilizza più opzioni è disponibile nel componente tema discourse-welcome-link. Questi stessi valori dovrebbero funzionare all’interno di un plugin, ma il file si troverebbe invece in config/settings.yml.

3 Mi Piace

Ci sono differenze tra i tipi di plugin e componenti tematici.

Ho provato a creare una tabella (si prevedono piccoli errori o raggruppamenti)

Categoria Funzionalità Sintassi Plugin Sintassi TC
Tipi di base Stringa type: string
min: ..
max: ..
regex: ..
secret: true/false
global
validator: nome classe
type: string
min: ..
max: ..
-
-
-
-
Testo multilinea type: string
textarea: true
type: string
textarea: true
Intero type: integer
min: ..
max: ..
type: integer
min: ..
max: ..
Float type: float
min: ..
max: ..
type: float
min: ..
max: ..
Booleano type: bool type: bool
Ora type: time -
Null type: null -
Tipi di selezione Enum (menu a discesa) type: enum
choices: [opzione1, opzione2]
enum: ..
type: enum
choices: [opzione1, opzione2]
Categoria type: category -
Colore type: color -
Gruppo type: group -
Email type: email -
Nome utente type: username -
Tipi di lista Lista generica type: list
allow_any: true/false
type: list
Lista semplice/compatta type: simple_list
O
type: list
list_type: compact
list_type: simple
type: list
list_type: compact
list_type: simple
Lista di categorie type: category_list type: list
list_type: category
Lista di gruppi type: group_list type: list
list_type: group
Lista di tag type: tag_list type: list
list_type: tag
Lista di gruppi di tag type: tag_group_list -
Lista di URL type: url_list -
Lista di host type: host_list -
Lista di valori type: value_list -
Lista di emoji type: emoji_list -
Tipi di file Caricamento type: upload type: upload
Lista di immagini caricate type: uploaded_image_list -
Restrizione dimensione file type: file_size_restriction
min: ..
max: ..
-
Tipi speciali HTML (deprecato) type: html_deprecated -
Oggetti JSON deprecato deprecato
Oggetti - type: objects
5 Mi Piace