Sostituto consigliato per modifyClass("model:composer") quando si sovrascrive save()

Sto migrando lontano dall’api.modifyClass("model:composer", ...) deprecata.

La mia attuale sovrascrittura di Composer#save modifica condizionalmente il comportamento del salvataggio, ma altrimenti deve chiamare super.save(opts).

Vedo le nuove API addModelMethod / addModelCallback, ma non riesco a trovare un esempio nel core che mostri l’uso di addModelMethod per sovrascrivere un metodo esistente mantenendo l’accesso all’implementazione originale.

addModelMethod è destinato a sovrascrivere metodi di modello esistenti in questo modo? In tal caso, come dovrebbe un plugin delegare all’implementazione originale di save()?

O esiste un altro punto di estensione che dovrebbe essere utilizzato per questo caso d’uso di Composer?

Immagino che dipenda da cosa intendi fare sovrascrivendo il metodo save

Se vuoi impedire il salvataggio in base a una certa condizione, potresti usare il nostro trasformatore di valori composer-service-cannot-submit-post

Se devi eseguire un’azione una volta creato il post, c’è api.onAppEvent("post:created")

Se stai aggiungendo un campo, c’è api.serializeOnCreate

Qualcuno di questi si adatta a quello che stai cercando?

Grazie! Sto già usando composer-service-cannot-submit-post — gestisce il controllo a livello di servizio. Ma il metodo save() del modello composer controlla anche cantSubmitPost, che include missingReplyCharacters > 0, quindi un corpo vuoto viene comunque bloccato lì.

onAppEvent("post:created") è troppo tardi perché il post non viene mai creato, e serializeOnCreate aggiunge solo campi alla richiesta, quindi non aiuta con la validazione della lunghezza del corpo.

Quindi il problema rimanente è aggirare missingReplyCharacters / cantSubmitPost per il primo post. Esiste un punto di estensione supportato per questo?

Ecco l’initializer attuale per riferimento:

@david, apprezzeresti qualsiasi contributo che potresti avere sul miglior approccio in questo caso.

La cosa migliore sarebbe aggiungere un nuovo hook al core di Discourse che ti permetta di ottenere ciò che ti serve in modo supportato. Che ne dici di qualcosa di simile a questo:

In questo modo il tuo plugin farebbe

api.registerValueTransformer(
  "composer-minimum-post-length",
  ({ value, context: { composer } }) => {
    if (
      composer.siteSettings.discourse_optional_topic_body_enabled &&
      composer.topicFirstPost
    ) {
      return 0;
    }

    return value; // Mantieni la logica core
  }
);

Fammi sapere se funziona per il tuo caso d’uso e rimuoverò il PR dalla bozza, così potrà essere revisionato e unito.

Grazie David! Ho testato il trasformatore composer-minimum-post-length e funziona: gli argomenti con corpi vuoti vengono creati correttamente.

Una cosa che ho notato: l’editor mostra ancora il messaggio “Post can’t be empty” perché la validation in composer-editor ha un controllo hard-coded replyLength < 1 che non utilizza minimumPostLength.

Quel controllo potrebbe anche rispettare il trasformatore, oppure essere saltato quando minimumPostLength è 0?

Suona bene — aggiunto alla PR :+1:

Ora funziona perfettamente. Grazie mille per aver aggiunto questa funzione, @david! :raising_hands: