Sovrascrivi il template solo su una pagina specifica

Per chiarire prima questo punto

Questo non è corretto: non perdi le tue modifiche quando aggiorni se sono state apportate in un tema. Rimangono salvate. L’unico modo per perderle è modificare direttamente i file sul tuo server, cosa che ovviamente non dovresti fare.

Tuttavia, c’è un certo rischio nell’override dei template, poiché un aggiornamento del core potrebbe rendere le tue modifiche incompatibili e richiedere un adeguamento. Se sei disposto a correre questo rischio, puoi tecnicamente ottenere quello che stai chiedendo qui.

Per iniziare, devi trovare un modo per distinguere quando l’utente si trova sulla homepage. Nel caso del componente “solo categorie”, un metodo è controllare il searchContext. Quando sei su una pagina di sottocategoria, il contesto di ricerca è impostato su “category”. Se non c’è alcun contesto di ricerca, significa che sei sulla homepage.

Il modo per passare questa informazione al tuo template è aggiungere qualcosa del genere:

<script type="text/discourse-plugin"
        version="0.8">
  const categoriesOnlyComponent = require('discourse/components/categories-only').default;
  categoriesOnlyComponent.reopen({
    isHomepage: function() {
      return !this.parentView.searchService.contextType
    }.property()
  });
</script>

Ciò che questo fa è permetterti di utilizzare isHomepage nel template per categories-only. Restituisce true se non c’è contesto di ricerca, il che significa che sei sulla homepage. Altrimenti, restituisce false.

Successivamente, devi copiare il template predefinito come segue:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
  ... resto del template
  {{/if}}
</script>

e utilizzare isHomepage che abbiamo aggiunto. Per farlo, devi usare l’helper {{#if}} di Handlebars. In sostanza, ti serve qualcosa del genere:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      ... template solo per la homepage
    {{else}}
    ... resto del template predefinito se non sei sulla homepage
  {{/if}}
</script>

Ora puoi usare qualsiasi cosa nella sezione isHomepage. Puoi modificarla direttamente lì oppure creare un nuovo template per quella sezione, come segue:

<script type='text/x-handlebars'
        data-template-name='components/categories-only-homepage'>
  <h1>Sei sulla homepage!</h1>
  <p>
    Usa questa sezione per renderizzare il template del componente "solo categorie" se l'utente si trova sulla homepage.
  </p>
</script>

L’ultima cosa da fare è chiamare questo template come partial nel template categories-only, all’interno della sezione isHomepage, come mostrato qui:

<script type='text/x-handlebars'
        data-template-name='components/categories-only'>
  {{#if categories}}
    {{#if isHomepage}}
      {{partial 'components/categories-only-homepage'}}
    {{else}}
    ... resto del template predefinito se non sei sulla homepage
  {{/if}}
</script>

Il risultato è che quando visiti la homepage vedrai questo:

mentre il componente nelle sottocategorie dovrebbe rimanere invariato.

Questo è opzionale, ma potresti essere interessato a dare un’occhiata a:

poiché è il nuovo metodo consigliato per lavorare sui temi ed evitare l’uso dei tag script.