È possibile modificare una funzione in un helper tramite il sistema dei componenti plugin o tema?

C’è un modo per riaprire una classe e sovrascrivere una funzione?

Quella che devo sovrascrivere è function categoryStripe(color, classes) {} alla riga 15 di qui: javascripts/discourse/helpers/category-link.js.es6.

Credo di sì. Hai visto Developing Discourse Themes & Theme Components

Ci sono diversi modi per fare ciò che chiedi. Qual è il tuo obiettivo nel sovrascrivere categoryStripe?

Vorrei modificarlo da:

function categoryStripe(color, classes) {
  var style = color ? "style='background-color: #" + color + ";'" : "";
  return "<span class='" + classes + "' " + style + "></span>";
}

a:

function categoryStripe(color, classes) {
  var style = color ? "style='border: 1px solid #" + color + ";'" : "";
  return "<span class='" + "my-class" + classes + "' " + style + "></span>";
}

Quindi, cambiare il colore di sfondo in un bordo e aggiungere una classe.

Qual è il modo migliore per ottenere questo risultato, Justin?


L’ho letta, però per quanto mi ricordo copre solo la possibilità di sovrascrivere i template (e i widget), senza menzionare gli helper, credo?

Niente di tutto ciò era evidente dal tuo primo messaggio. Penso che ora otterrai una risposta utile che sono curioso di vedere!

Hai considerato di aggiungere la classe tramite JavaScript o di sovrascrivere lo stile inline utilizzando !important nel foglio di stile? Anche se puoi lavorare per sovrascrivere questo metodo, prima o poi smetterà di funzionare. Aggiungerlo al DOM tramite JavaScript è probabilmente la soluzione più stabile.

Quello che stavo cercando di capire l’altro giorno era proprio questo. Volevo aggiungere una classe personalizzata ai post in tutti i topic (ma non al post originale del topic). Avrei voluto poter attivare o disattivare questa classe personalizzata in base al gruppo di utenti e alla data di creazione del topic, ma pensavo di poter risolvere questo aspetto una volta capito come aggiungere la classe personalizzata ai post. Non ho trovato esattamente l’esempio che cercavo, ma alcune altre cose mi hanno distratto prima di trovare l’esempio giusto.

Non credo che funzionerà perché devo recuperare il colore dalle impostazioni della categoria, quindi il colore del bordo varierà per ogni categoria. (Ho aggiornato il mio post sopra per riflettere questo.)

A meno che non sia possibile recuperarlo tramite JS (/aggiungendolo al DOM)? (In tal caso, potresti fornirmi un esempio, per favore?)

Dovrei approfondire i dettagli per vedere se ciò che stai facendo è fattibile solo con la selezione JS (purtroppo non ho tempo in questo momento).

Ma puoi vedere l’aggiunta di una classe qui: discourse-knowledge-base-theme/javascripts/discourse/components/knowledge-base.js.es6 at 4694d4a8ad788f8884e3341c852d3f77b2c1d103 · discourse/discourse-knowledge-base-theme · GitHub

Puoi anche modificare gli stili inline con JS: Setting CSS Styles using JavaScript | KIRUPA

Grazie Justin, darò un’occhiata.

Oppure esiste un modo per sovrascrivere gli helper (discourse/app/assets/javascripts/discourse/helpers/category-link.js.es6 at b25d9e96c1414bf78b44221da4d385675843991e · discourse/discourse · GitHub) come facciamo con template, componenti, widget, ecc.?

Non mi dispiacerebbe tenere d’occhio quel file per eventuali modifiche future, se necessario :smiley:

Puoi provare a creare un file nel tuo tema in javascripts/discourse/helpers/category-link.js.es6 e aggiungere lì una versione modificata di quella funzione. È da un po’ che non devo scendere a quel livello, quindi non posso garantire che funzioni! :smiley:

Sì, dovrebbe funzionare.

Grazie mille!

Ultima domanda (spero!) come creo un file lì? :relaxed:

In un plugin è facile: crea la cartella e copia e incolla!

Ah!!! Grazie Robert!

Devo uscire ora, ma proverò non appena torno indietro :ok_hand:

Esempio:

Struttura della cartella del plugin:

image

Individua la modifica subdola :male_detective:

image

Grazie Robert!

Non funziona però :sob:

Ecco cosa ho fatto:

rails g plugin CategoryAlternative

Poi ho inserito questo:

In una cartella helpers che ho dovuto creare:

Poi:

rm -rf tmp
rails s

Appare nell’AdminCP, ma nessun cambiamento si riflette sulla pagina effettiva (i cambiamenti si vedono se modifico la versione non plugin del file, però, con le stesse identiche modifiche)

Ho saltato qualcosa? Devo configurare qualcos’altro?

Stai ricevendo errori nella console di JavaScript?

Hai incluso l’intero file?

NB: Non ho utilizzato il generatore di plugin, ho creato tutto manualmente.

All’epoca della mia risposta non l’avevo fatto (pensavo che Justin intendesse includere solo quella funzione), ma anche se includere l’intero file ha risolto il problema, non era la stessa cosa che quando ho modificato direttamente il file.

Ad esempio, ha funzionato sulla pagina latest, ma non nel menu a tendina tutte le categorie… che invece funzionava quando ho modificato direttamente il file!

Qu alla fine ho apportato le modifiche necessarie tramite un po’ di CSS disordinato :joy: e ho dovuto fare alcuni compromessi. È sicuramente meglio non aver potuto farlo, ma idealmente avrei preferito qualcosa di semplice come cambiare lo stile di una categoria, che fosse facile quanto modificare un template :sweat:

Vorrei fare lo stesso.
Ecco il percorso del file che provo a sovrascrivere nel mio componente del tema:
custom_loader\javascripts\discourse\helpers\loading-spinner.js
Ma il file js non viene caricato. Cosa mi sto perdendo?