Modificatori di tema: una breve introduzione

Man mano che i temi diventano più ambiziosi, abbiamo cercato modi per consentire loro di manipolare il comportamento centrale lato server. Sebbene non otterranno mai lo stesso livello di controllo dei plugin, possiamo fornire alcuni ganci predefiniti per la manipolazione dei temi.

Introduzione: modificatori di tema :partying_face:

Sono specificati utilizzando la chiave modifiers nel file about.json del tema.

Per un elenco aggiornato al 100% dei modificatori, controlla lo schema del database in fondo a theme_modifier_set.rb, ma ecco un rapido riepilogo di ciò che abbiamo finora:

  • serialize_topic_excerpts booleano (predefinito falso) - includi sempre gli estratti quando serializzi gli elenchi di argomenti

  • csp_extensions array di stringhe - aggiunge direttive alla CSP. Funziona allo stesso modo del vecchio metodo di impostazione del tema “extend_content_security_policy”. Ma ricorda, i tag \u003cscript src=\"\"\u003e semplici sono consentiti automaticamente.

  • svg_icons array di stringhe - un elenco di icone che dovrebbero essere incluse nel sottoinsieme di icone

  • topic thumbnails array di dimensioni - richiedi risoluzioni aggiuntive nell’insieme di miniature degli argomenti. Nota che vengono generate in modo asincrono, quindi devi tornare all’immagine originale se la dimensione richiesta non è fornita. Maggiori informazioni disponibili nel messaggio di commit

  • serialize_post_user_badges array di stringhe - un elenco di nomi di badge (corrispondenti alle voci nella tabella dei badge) da serializzare insieme ai dati dei post. Quando configurato, il sistema include i badge utente specificati con ogni post per il rendering lato client.

Un tema che fa ampio uso di questi nuovi ganci è Topic List Thumbnails - dai un’occhiata al codice per vedere come funziona.

Modificatori dipendenti dalle impostazioni

I modificatori del tema possono anche essere configurati per ottenere il loro valore da un’impostazione del tema, consentendo agli operatori del sito di sovrascrivere il comportamento del modificatore senza modificare il codice del tema. Per rendere un modificatore dipendente da un’impostazione, usa questa sintassi nel tuo about.json:

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

Ad esempio, se hai un’impostazione del tema chiamata show_excerpts e vuoi che controlli il modificatore serialize_topic_excerpts:

In settings.yml:

show_excerpts:
  default: false

In about.json:

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

Quando l’impostazione show_excerpts viene modificata, il valore del modificatore si aggiornerà automaticamente per corrispondere. Ciò fornisce flessibilità agli operatori del sito per personalizzare il comportamento del tema tramite l’interfaccia utente di amministrazione.


Questo documento è controllato in versione - suggerisci modifiche su github.

35 Mi Piace

David, probabilmente è un po’ pigro da parte mia chiedere, ma esiste un modo per accedere a questo tramite un plugin:

I temi possono richiedere dimensioni aggiuntive per le miniature utilizzando un modificatore nel loro file about.json:

Sto cercando di migrare il plugin TLP verso questo nuovo schema e sarebbe utile avere lo stesso accesso alle funzionalità da un plugin, almeno per il momento.

2 Mi Piace

Al momento non c’è, ma ci darò un’occhiata :eyes:

6 Mi Piace

David, qual è l’approccio corretto per la ricreazione in BLOcco delle miniature?

Ho appena provato a utilizzarlo su uno dei miei siti e sembra aver elaborato circa il 10% degli Argomenti… poi ha smesso (o ha fatto il naso all’insù per il resto). Penso che sia la prima ipotesi perché gli Argomenti per cui le miniature sono state prodotte sono stati gli ultimi 10%.

Rigenerare i post non sembra essere la soluzione. In effetti, ho eseguito una rigenerazione in blocco e mi chiedo se ciò abbia creato problemi…

Ho notato che image_url può essere popolato, ma non ci sono miniature.

Qualsiasi consiglio è apprezzato!

1 Mi Piace

Quella colonna non fa nulla e verrà rimossa molto presto. image_upload_id è quella che ti serve.

Non dovrebbe esserci bisogno di questo. L’ho progettato deliberatamente in modo che le persone possano installare nuovi temi senza dover intervenire sulla console. Le miniature vengono generate in modo asincrono quando necessario. Ad esempio:

  • aggiungi un nuovo tema, che richiede nuove risoluzioni
  • un utente richiede un argomento, serviamo le miniature esistenti. Se alcune dimensioni non esistono, pianifichiamo un job Sidekiq.
  • la prossima volta che qualcuno richiede l’argomento, le miniature corrette saranno disponibili

Se la dimensione della miniatura richiesta è più grande dell’originale, non ci prendiamo la briga di generare la miniatura.

Quindi, la cosa fondamentale da tenere a mente affinché questo funzioni è:

C’è un esempio di questa logica di fallback nel componente del tema per le miniature che ho creato: sentiti libero di prendere in prestito la logica da lì.

5 Mi Piace

Il fallback viene serializzato come thumbnailsl[0]? Sì, lo sto già gestendo. (ottima implementazione, tra l’altro, molto semplice da gestire)

È possibile che alcune immagini non “rientrino nei criteri” o non soddisfino i requisiti?

Il comportamento previsto nel plugin TLP dovrebbe rilevare le miniature one-box. Ma non mi sembra che accada in tutti i casi qui credo.

Ad esempio, se hai tempo, dai un’occhiata a questi esempi:

Non credo che queste miniature soddisfino i requisiti. Le miniature vengono serializzate come null.

Sì, è intenzionale: abbiamo ricevuto diverse richieste per rimuovere le miniature piccole delle onebox. Ad esempio, le persone si trovavano con la propria avatar di GitHub come miniature del topic, il che è raramente intenzionale.

Nota che per le onebox in cui l’immagine è il contenuto effettivo (come le foto di Instagram/Twitter, ecc.), verranno selezionate.

Per quanto riguarda il video di YouTube, l’ho corretto ieri.

5 Mi Piace

Ah, ottimo, grazie per la conferma.

Strano, la build era più recente, ma sembra che alcuni vengano ancora trascurati.

Già, è anche per questo che ho finito per implementare un selettore di miniature per le situazioni in cui la scelta automatica non era ottimale. Potrei ancora voler modificare questo comportamento, ma cercherò di farlo tramite il plugin.

Grazie per il tuo tempo, David!

2 Mi Piace

OK, ce l’ho fatta. Dopo una sessione di debug piuttosto infruttuosa, non sono riuscito a capire perché i post YT più vecchi non avessero le miniature.

Poi mi è venuto in mente. È a causa di questo:

Quindi suggerisco che in realtà potrebbe essere necessario rigenerare i contenuti dopo aver impostato questo valore su un numero piuttosto più alto (365?).

Credo di aver ragione nel dire che se qualcosa non viene caricato localmente, non verrà creata una miniatura? …

4 Mi Piace

:+1: corretto, questo funziona solo per i caricamenti locali… potremmo dover ripensare a quell’impostazione “giorni di età massima” :thinking:

8 Mi Piace

Ho un piano e proverò a implementarlo questa settimana. Una domanda: hai bisogno che i valori siano dinamici?

Cioè, le risoluzioni verranno definite all’avvio o a runtime (ad esempio tramite le impostazioni del sito)?

La prima opzione è più semplice… ma anche la seconda potrebbe essere fattibile :thinking:

2 Mi Piace

Grazie per aver dato un’occhiata.

Ho solo bisogno di una soluzione fissa, esattamente come il componente del tema.

Sarebbe comunque gradita una configurazione del sito.

Per completezza di informazione: vorrei migrare lontano dal plugin, quindi una soluzione in linea con il componente del tema sarebbe più che sufficiente.

2 Mi Piace

@merefield eccolo:

Spero che il messaggio del commit spieghi come funziona, ma fammi sapere se hai domande.

7 Mi Piace

Ottimo. L’ho appena aggiunto a TLP e sembra che funzioni! Grazie per il tuo aiuto!

4 Mi Piace

4 post sono stati spostati in un nuovo argomento: Recupero delle miniature dagli endpoint JSON

Possiamo renderlo funzionante anche per le immagini da server remoti? Ad esempio, immagini da Blogger, Picasa o Amazon S3?

Poiché Discourse supporta l’hosting su Amazon S3 per siti con immagini di grandi dimensioni, ora, se tutto deve essere ospitato direttamente sul server locale, questa metodologia di progettazione sembra rappresentare uno svantaggio.

Con questo aggiornamento, non è una soluzione semplice per il mio sito, dato che stiamo utilizzando un altro server per ospitare le immagini. Ora è troppo difficile migrare a un server affiliato con molti post, mentre è troppo grande per essere ospitato sul server locale.

Questo è progettato per funzionare solo con gli ‘upload’ di Discourse. Questi possono trovarsi su S3 o su un altro servizio, se utilizzi

Consigliamo di utilizzare l’impostazione del sito download_remote_images per scaricare automaticamente le immagini hotlinkate da altri siti.

4 Mi Piace

Ciao David, c’è qualcosa di particolare da fare per assicurarsi che le icone Pro possano essere utilizzate in una TC?

1 Mi Piace

Niente di speciale, no. Dovrebbe funzionare esattamente allo stesso modo in cui si usano le icone Pro altrove in Discourse. Immagino che tu stia usando questo plugin per abilitare le icone Pro?

Se non funziona, fammelo sapere e darò un’occhiata :eyes:

2 Mi Piace

Sì, lo siamo. Faremo un’altra ricerca. Grazie per la risposta, anche se è arrivata tardi, la tua sera!

2 Mi Piace