Tipo di oggetti per l'impostazione del tema

Narratore: “Non è stata realizzata quella settimana.” :upside_down_face:

2 Mi Piace

Ci sono novità a riguardo? Ho appena riscritto un componente per qualcuno che utilizza il tipo di oggetto e non è contento di non poterlo riordinare.

4 Mi Piace

Questa cosa finirà presto nella lista di qualcuno?

Inoltre, è piuttosto terribile che si chiamino tutti “field_name-X”. Sarebbe possibile avere un nome di campo che possa essere utilizzato lì? Dover cliccare su ognuno per vedere cosa c’è è un incubo se hai più di un paio di oggetti.

Se non possiamo riordinare gli elementi e non puoi dire cosa sono senza cliccarci sopra, probabilmente dovrò tornare a usare un’unica impostazione di stringa con più valori separati da, ehm, qualche carattere per separare i diversi campi. E penso che con gli array in stile vecchio si potesse riordinare le cose, giusto? Quindi questo tipo di oggetti sembra un passo indietro per tutti tranne che per i programmatori.

2 Mi Piace

Al momento non credo ci sia nulla in fase di riordino, anche se è ancora qualcosa che vorremmo includere. La ridenominazione è già possibile con la proprietà identifier. Ad esempio, dal componente tema dei collegamenti dell’intestazione personalizzata

Il campo del nome è impostato come identificatore per ciascun collegamento, così puoi vedere di quale collegamento si tratta

2 Mi Piace

Evvai. Pensavo di essermelo perso ma non ero riuscito a trovarlo prima. Grazie!

MODIFICA: E ora ho usato la proprietà identifier e aggiunto un campo ‘order’, quindi non è poi così male. Penso ancora che sarebbe bello poter riordinare le impostazioni, ed è disponibile con gli array. . .

Grazie ancora per il tuo aiuto

1 Mi Piace

Ho creato un commit un po’ di tempo fa che aggiunge il riordino per gli oggetti. Ecco un piccolo esempio di impostazione per mostrare i pulsanti:

10 Mi Piace

Penso che valga la pena annunciare che ora abbiamo uploads come opzione di tipo di campo, e penso che sia stato menzionato da qualche parte, ma è bello menzionare di nuovo che type: objects funziona sia nelle impostazioni del tema che nelle impostazioni del sito (plugin)

10 Mi Piace

Quello corretto è upload

1 Mi Piace

Grazie! Sarà risolto in

1 Mi Piace

Il tipo objects supporta il limite max? Ho provato, ma sembra di no.

Intendi come per un campo di tipo string in un albero di oggetti?
Prova max_length

Consulta #Validazioni per tipi string su questo argomento; oppure un esempio funzionante:

Penso che si stia riferendo a:

1 Mi Piace

Sì, mi riferisco al limite massimo di oggetti nell’array.

Attualmente non è supportato ufficialmente, quindi ho esteso questa funzionalità nel mio componente tema privato personalizzato. La configurazione è la seguente (solo a titolo di riferimento)

Configurazione del limite massimo per gli array:

themes/quectel-custom-homepage/settings.yml

banner_images:
  type: objects
  default: []
  schema:
    name: "Immagine carosello"
    max: 9 // Configurazione estesa aggiunta: limita il numero massimo di elementi nell'array
    identifier: image_url
    properties:
      image_url:
        type: upload
        required: true
      link_url:
        type: string
        min: 0
        max: 1023

Codice specifico dell’estensione:

themes/quectel-custom-homepage/javascripts/discourse/api-initializers/quectel-custom-homepage.gjs

import { action } from "@ember/object";
import { apiInitializer } from "discourse/lib/api";
import classPrepend from "discourse/lib/class-prepend";
import { i18n } from "discourse-i18n";

export default apiInitializer(() => {
  // Estende il componente SchemaSettingNewEditor usando classPrepend per supportare il limite max per il tipo objects
  // Carica questo componente solo nel contesto amministratore
  let SchemaSettingNewEditor;
  try {
    SchemaSettingNewEditor =
      require("discourse/admin/components/schema-setting/editor").default;
  } catch {
    // Gli utenti non amministratori non possono caricare questo componente, salta l'estensione
    return;
  }

  classPrepend(SchemaSettingNewEditor, (Superclass) => {
    return class extends Superclass {
      @action
      addItem() {
        // Controlla se è stato raggiunto il limite max
        const maxLimit = this.args.setting.max || this.activeSchema?.max;

        if (maxLimit && this.activeData.length >= maxLimit) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: maxLimit,
            }
          );
          return;
        }

        return super.addItem(...arguments);
      }

      @action
      addChildItem(propertyName, parentNodeIndex) {
        const propertySchema = this.activeSchema.properties[propertyName];

        // Controlla se è stato raggiunto il limite max
        if (
          propertySchema?.max &&
          this.activeData[parentNodeIndex][propertyName].length >=
            propertySchema.max
        ) {
          this.validationErrorMessage = i18n(
            themePrefix("theme_settings.errors.objects_value_not_valid_max"),
            {
              count: propertySchema.max,
            }
          );
          return;
        }

        return super.addChildItem(...arguments);
      }
    };
  });
});

Configurazione delle traduzioni del tema:

themes/quectel-custom-homepage/locales/zh_CN.yml

zh_CN:
  theme_settings:
    errors:
      objects_value_not_valid_max: "Il numero non può superare %{count}"

Effetto concreto:

  1. Messaggio di errore
  2. Impossibile aggiungere altri elementi
1 Mi Piace