Desenvolvendo Plugins Discourse - Parte 3 - Adicionar configurações personalizadas do site

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 curtidas

Thanks for helping! have a nice day!

3 curtidas

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 curtidas

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 curtida

already working with EmberJS

Eu tenho isto no meu settings.yml:

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

Isto aparece na minha página /admin/plugins:

Não entendo por que não há botão de Configurações?

Acho que, em vez de plugins, você deve escrever o nome do plugin county_fence.

2 curtidas

Já tentei isso também, sem diferença.

Esta documentação (assim como o OP) usa a chave plugins. Em outros lugares, vi o nome do plugin sendo usado, como você disse.

1 curtida

@bitmage na verdade, talvez eu saiba o motivo.

Você escreveu # name: County Fence em plugin.rb?
Se sim, o nome deve ser o mesmo que o nome do seu diretório.

O nome do plugin pode ser sobrescrito a partir da localidade:

Supondo que você tenha este formato de configurações:

county_fence:
  county_fence_enabled: true
  ...

em client.en.yml:

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

Definir o padrão como 0 em vez de -1 fez com que ele aparecesse.

Existe alguma maneira de saber que um tipo não está sendo detectado corretamente?

  1. YamlLoader carrega o arquivo.
  2. SiteSettingExtension chama setting() com os parâmetros gerados pelo YamlLoader
  3. …que chama defaults.load_setting e, posteriormente, type_supervisor.load_setting
  4. Embora type_supervisor.load_setting não receba diretamente o valor, ele tem acesso aos padrões porque eles estão sendo passados quando o TypeSupervisor é inicializado via DefaultsProvider.
  5. type_supervisor.load_setting então chama get_data_type que chama parse_value_type() que deve levantar um ArgumentError se o tipo não puder ser detectado.

Acho que toda essa sequência é chamada por load_settings no modelo SiteSetting, e não vejo nenhum tratamento de exceção em nenhum lugar da pilha. Mas não estou vendo nenhuma saída de erro no log do servidor, ou em qualquer outro lugar.

Parece que deveria haver algum tipo de feedback do usuário ou log de erro para dizer que uma configuração falhou ao analisar.

Se entendi bem, você está dizendo que usar -1 como valor padrão em uma configuração faz com que o botão "Configurações" não apareça. Você consegue reproduzir esse comportamento todas as vezes?

Isso é estranho. Não vejo nada de errado com suas configurações, não tenho certeza de como é possível falhar na análise. :thinking:

Agora que está funcionando, posso alterá-lo de volta para -1 e ele continua funcionando.

Eu dropei o banco de dados, reinicializei e ainda não consigo reproduzi-lo. :person_shrugging:

1 curtida

Implantei o plugin no meu site ativo usando o padrão de 0, apenas para garantir. O botão de configurações é exibido:

image

Mas quando clico nele, nenhuma configuração é listada:

Desativarei o plugin enquanto continuo a solucionar este problema.

Ok, em ambos os casos (dev e produção), acredito que foi porque a pasta no diretório de plugins não correspondia a county-fence. É por isso que a configuração não estava sendo exibida e talvez pudesse causar outros problemas também.

Obrigado, pessoal!

1 curtida

Não está claro para mim. A maioria dos plugins que instalei não usa plugins:, o que inclui plugins oficiais e recentes (também o modelo esqueleto)

Eu pensei que essa parte era usada para a filtragem de configurações, mas posso estar errado.

1 curtida

Ah, interessante! Peço desculpas então.

O que direi é que não é necessário, aparentemente.

Perdi a conta do número de plugins que escrevi com plugins:

1 curtida

Para expandir a documentação:

Uma lista completa dos tipos de Configurações do Site está disponível no código do type_supervisor.rb. Logo acima, você também pode ver as chaves filhas válidas que uma Configuração do Site aceita.

Um exemplo mais avançado que usa mais dessas opções pode ser encontrado no componente de tema discourse-welcome-link. Esses mesmos valores devem funcionar dentro de um plugin, mas o arquivo estaria em config/settings.yml.

3 curtidas

Existem diferenças entre os tipos de componentes de plugins e temas.

Tentei criar uma tabela (espera-se pequenos erros ou agrupamentos)

Categoria Funcionalidade Sintaxe de Plugin Sintaxe de TC
Tipos Básicos String type: string
min: ..
max: ..
regex: ..
secret: true/false
global
validator: nome da classe
type: string
min: ..
max: ..
-
-
-
-
Texto multilinha type: string
textarea: true
type: string
textarea: true
Inteiro type: integer
min: ..
max: ..
type: integer
min: ..
max: ..
Float type: float
min: ..
max: ..
type: float
min: ..
max: ..
Booleano type: bool type: bool
Hora type: time -
Nulo type: null -
Tipos de Seleção Enum (dropdown) type: enum
choices: [option1, option2]
enum: ..
type: enum
choices: [option1, option2]
Categoria type: category -
Cor type: color -
Grupo type: group -
Email type: email -
Nome de usuário type: username -
Tipos de Lista Lista Genérica type: list
allow_any: true/false
type: list
Lista Simples/Compacta type: simple_list
Ou
type: list
list_type: compact
list_type: simple
type: list
list_type: compact
list_type: simple
Lista de Categorias type: category_list type: list
list_type: category
Lista de Grupos type: group_list type: list
list_type: group
Lista de Tags type: tag_list type: list
list_type: tag
Lista de Grupos de Tags type: tag_group_list -
Lista de URLs type: url_list -
Lista de Hosts type: host_list -
Lista de Valores type: value_list -
Lista de Emojis type: emoji_list -
Tipos de Arquivo Upload type: upload type: upload
Lista de Imagens Enviadas type: uploaded_image_list -
Restrição de Tamanho de Arquivo type: file_size_restriction
min: ..
max: ..
-
Tipos Especiais HTML (descontinuado) type: html_deprecated -
Objetos JSON descontinuado descontinuado
Objetos - type: objects
5 curtidas