Tipo de objetos para configuração de tema

Estamos introduzindo um novo type: objects para os tipos suportados para configurações de tema que pode ser usado para substituir o tipo json_schema existente, que pretendemos descontinuar em breve.

Definindo uma configuração de tema do tipo objects

Para criar uma configuração de tema do tipo objects, primeiro defina uma chave de nível superior como qualquer configuração de tema que será usada como o nome da configuração.

links: ...

Em seguida, adicione as palavras-chave type, default e schema à configuração.

links:
  type: objects
  default: []
  schema: ...

type: objects indica que esta será uma configuração do tipo objects, enquanto a anotação default: [] define o valor padrão da configuração como um array vazio. Observe que o valor padrão também pode ser definido como um array de objetos, o que demonstraremos assim que o schema for definido.

Para definir o schema, primeiro defina o name do schema assim:

links:
  type: objects
  default: []
  schema:
    name: link

Em seguida, adicionaremos a palavra-chave properties ao schema, que nos permitirá definir e validar como cada objeto deve ser.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name: ...

No exemplo acima, estamos afirmando que o objeto link tem uma propriedade name. Para definir o tipo de dados esperado, cada propriedade precisa definir a palavra-chave type.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string

A definição de schema acima afirma que o objeto link tem uma propriedade name do tipo string, o que significa que apenas valores de string serão aceitos para a propriedade. Atualmente, os seguintes tipos são suportados:

  • string: O valor da propriedade é armazenado como uma string.
  • integer: O valor da propriedade é armazenado como um inteiro.
  • float: O valor da propriedade é armazenado como um float.
  • boolean: O valor da propriedade é true ou false.
  • enum: O valor da propriedade deve ser um dos valores definidos na palavra-chave choices.
    links:
      type: objects
      default: []
      schema:
        name: link
        properties:
          name:
            type: enum
            choices:
              - name 1
              - name 2
              - name 3
    
  • categories: O valor da propriedade é um array de IDs de categoria válidos.
  • groups: O valor da propriedade é um array de IDs de grupo válidos.
  • tags: O valor da propriedade é um array de nomes de tag válidos.

Com o schema definido, o valor padrão da configuração pode agora ser definido definindo um array em yaml assim:

links:
  type: objects
  default:
    - name: link 1
      title: link 1 title
    - name: link 2
      title: link 2 title
  schema:
    name: link
    properties:
      name:
        type: string
      title:
        type: string

Propriedades obrigatórias

Todas as propriedades definidas são opcionais por padrão. Para marcar uma propriedade como obrigatória, basta anotar a propriedade com required: true. Uma propriedade também pode ser marcada como opcional anotando a propriedade com required: false.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
      title:
        type: string
        required: false

Validações personalizadas

Para certos tipos de propriedade, há suporte integrado para validações personalizadas que podem ser declaradas anotando a propriedade com a palavra-chave validations.

links:
  type: objects
  default: []
  schema:
    name: link
    properties:
      name:
        type: string
        required: true
        validations:
          min: 1
          max: 2048
          url: true

Validações para tipos string

  • min_length: Comprimento mínimo da propriedade. O valor da palavra-chave deve ser um inteiro.
  • max_length: Comprimento máximo da propriedade. O valor da palavra-chave deve ser um inteiro.
  • url: Valida se a propriedade é uma URL válida. O valor da palavra-chave pode ser true/false.

Validações para tipos integer e float

  • min: Valor mínimo da propriedade. O valor da palavra-chave deve ser um inteiro.
  • max: Valor máximo da propriedade. O valor da palavra-chave deve ser um inteiro.

Validações para tipos tags, groups e categories

  • min: Número mínimo de registros para a propriedade. O valor da palavra-chave deve ser um inteiro.
  • max: Número máximo de registros para a propriedade. O valor da palavra-chave deve ser um inteiro.

Estrutura de objetos aninhados

Um objeto também pode ter uma propriedade que contém um array de objetos. Para criar uma estrutura de objetos aninhados, uma propriedade também pode ser anotada com type: objects e a definição de schema associada.

sections:
  type: objects
  default:
    - name: section 1
      links:
        - name: link 1
          url: /some/url
        - name: link 2
          url: /some/other/url
  schema:
    name: section
    properties:
      name:
        type: string
        required: true
      links:
        type: objects
        schema:
          name: link
          properties:
            name:
              type: string
            url:
              type: string

Descrição da configuração e localização

Para adicionar uma descrição para a configuração no locale en, crie um arquivo locales/en.yml com o seguinte formato, dada a seguinte configuração de tema do tipo objects.

sections:
  type: objects
  default:
    - name: section 1
      links:
        - name: link 1
          url: /some/url
        - name: link 2
          url: /some/other/url
  schema:
    name: section
    properties:
      name:
        type: string
        required: true
      links:
        type: objects
        schema:
          name: link
          properties:
            name:
              type: string
            url:
              type: string
en:
  theme_metadata:
    settings:
      sections:
        description: This is a description for the sections theme setting
        schema:
          properties:
            name:
              label: Name
              description: The description for the property
            links:
              name:
                label: Name
                description: The description for the property
              url:
                label: URL
                description: The description for the property

Este documento é controlado por versão - sugira alterações no github.

15 curtidas

Ainda não estou convencido de que a descontinuação do estilo de esquema JSON seja uma boa ideia.

Embora estes possam tornar-se bastante complexos e não sejam os formatos mais “amigáveis para desenvolvedores” (portanto, esta é uma ótima mudança nesse sentido), existem ferramentas online para validar esquemas JSON, que é uma maneira realmente útil de validar tanto o esquema quanto contra quaisquer dados padrão.

por exemplo https://www.jsonschemavalidator.net/

Como isso funcionará neste novo mundo?

2 curtidas

Ao carregar um tema, validaremos os dados padrão em relação ao esquema definido. Dito isso, não estamos validando que a definição do esquema seja válida agora, mas não seria difícil para nós fazê-lo. Mesmo para a configuração de esquema json no momento, acho que não estamos validando os dados padrão em relação ao esquema definido.

Nossa implementação atual das configurações de tipo de esquema json está meio quebrada de várias maneiras, sendo a mais óbvia o editor na interface de administração. Discutimos isso internamente e decidimos que é muito mais fácil para nós manter um formato de esquema limitado definido por nós, em vez de permitir todas as possibilidades que vêm com o esquema json.

2 curtidas

Alguns recursos interessantes aqui:

  • você pode se livrar do JSON.parse e acessar a configuração diretamente para obter o objeto, o que é muito bom.

  • o validador de URL!

:chefs_kiss: :chefs_kiss:

5 curtidas

Existe alguma maneira de várias linhas serem respeitadas no editor?

Este padrão funciona:

- name: markdown
  value: > 
    ## Heading
      * first bullet
      * second bullet

Mas, uma vez que você edita isso, os retornos de carro são perdidos

Além disso, seria bom ter um tipo “text” que pudesse armazenar dados de formato mais longo e, talvez, expor um editor “text-area” maior.

5 curtidas

Aqui estão alguns feedbacks:

2 curtidas

Notei isso e foi corrigido em

1 curtida

Será que poderemos reordenar itens na interface?

Por exemplo, este é o editor de configurações de objetos no componente de tema de rodapé fácil. Não consigo reorganizar nenhum item no momento:

4 curtidas

Eu também queria solicitar este recurso! :+1:


Em tempo, seria útil se a primeira postagem contivesse informações sobre a propriedade identifier.

Antes de olhar a imagem de Nolo acima, eu pensei que substituir o rótulo filho padrão por um valor de propriedade fosse impossível. Depois de olhar o código, encontrei a propriedade identifier.

4 curtidas

Reordenar é certamente algo que também foi levantado internamente. Tentarei implementar isso esta semana.

Anotado. Atualizarei a primeira postagem sobre a propriedade identifier.

4 curtidas

Sim, para substituir o sistema JSON (que em breve será obsoleto?) ele precisa corresponder ou superar a interface antiga:

incluindo a ordenação.

1 curtida

Olá, há planos para suportar outros tipos de campo em breve?

Por exemplo;

  • uma long_string com formato markdown; talvez com barra de ferramentas personalizável,
  • um campo date (com regras de validação),
  • um campo color (com regras de validação)?
1 curtida

Não há plano atual, embora eu concorde que seria útil. Eu mesmo gostaria de um campo icon.

7 curtidas

Na minha experiência, parece estar funcionando como predefinições salvas. Neste exemplo, as 2 primeiras entradas poderiam se beneficiar dessas predefinições, mas qualquer coisa depois disso, todas as novas entradas aparecerão em branco inicialmente.

Isso também significa que não podemos definir valores padrão para cada campo. Por exemplo, se eu quiser ter uma caixa de seleção para começar em um estado marcado, não posso tê-la.

links:
  type: objects
  default:
    - name: link 1
      title: link 1 title
    - name: link 2
      title: link 2 title
  schema:
    name: link
    properties:
      is_active:
        type: boolean
        default: true

default: true não funcionará lá como esperado.

Poderia haver uma maneira de definir os valores padrão por campo, para cada entrada que for criada?

Existe uma maneira de importar propriedades de objetos para variáveis no Sass?

Você sempre pode analisar a string, mas não parece uma boa ideia promover dessa forma. :sweat_smile:

1 curtida

Obrigado por compartilhar o exemplo! Embora sim… não parece tão tentador :upside_down_face:

1 curtida

Por curiosidade, sem gastar muito tempo olhando, como estamos com isso?

2 curtidas

Sim, não é muito bom, não faça isso. :smile:. Foi mais uma tentativa de ver se era possível, mas não uma abordagem razoável.
Concordo com você; seria bom ter um caminho direto! :+1:

Eu gostaria de saber também!
Além disso, se eu estiver certo, essa seria a única funcionalidade em falta em paridade com o json_schema.

2 curtidas

Eu estava procurando que o tipo de upload estivesse disponível, mas não está. Uma rápida olhada no core mostra que os tipos topic, post e upload foram implementados no lado do servidor, mas não no front-end. Existe alguma razão específica para isso? :thinking: