Aggiungi contenuti personalizzati che appaiono solo sulla tua homepage

Una situazione molto comune in cui ti troverai come sviluppatore di temi è la necessità di creare contenuti che vengano visualizzati solo sulla homepage della tua community.

Potresti aggiungere dell’HTML alla sezione “After Header” del tuo tema, che apparirà quindi su ogni pagina. Potresti ricorrere ad alcuni espedienti in CSS per nascondere questo contenuto ovunque tranne che sulla homepage… ma invece usiamo un tema Discourse per creare un componente con contenuti visibili solo sulla tua homepage.

Se non hai familiarità con i temi Discourse, consulta Beginner's guide to using Discourse Themes e Structure of themes and theme components

Nel tuo tema Discourse dovrai impostare la seguente struttura di directory:

:file_folder: javascripts/discourse/components/
:file_folder: javascripts/discourse/connectors/

Da qui creeremo un componente Ember. Puoi trovare maggiori informazioni sui componenti Ember nella loro documentazione: Ember.js Guides - Guides and Tutorials - Ember Guides

Ma per ora questo sarà un componente semplice. Il componente sarà composto da due file, uno contenente la logica e l’altro il template.

:page_facing_up: javascripts/discourse/components/custom-homepage-content.js

import Component from "@glimmer/component";
import { service } from "@ember/service";
import { defaultHomepage } from "discourse/lib/utilities";

export default class CustomHomepageContent extends Component {
  @service router;

  get isHomepage() {
    const { currentRouteName } = this.router;
    return currentRouteName === `discovery.${defaultHomepage()}`;
  }
}

Questo crea un getter isHomepage, che controlla il servizio router per currentRouteName — se il nome della rotta corrisponde alla tua homepage (come dettato dalle impostazioni del sito) restituirà true

Ora abbiamo bisogno del nostro template

:page_facing_up: javascripts/discourse/components/custom-homepage-content.hbs

{{#if this.isHomepage}}
  <h1>Questo è il contenuto HTML della mia homepage</h1>
{{/if}}

Il template controlla il getter isHomepage e visualizzerà il tuo contenuto se è true. Puoi aggiungere qualsiasi HTML desideri tra i blocchi {{#if}}.

Ora che il nostro componente è stato creato, dobbiamo aggiungerlo da qualche parte in Discourse. Per questo passaggio dovrai decidere quale plugin outlet utilizzare. Queste sono aree in tutto Discourse in cui abbiamo aggiunto un piccolo codice per gli sviluppatori a cui agganciarsi. Puoi cercarli su Github, oppure sfogliarli utilizzando (deprecated) Plugin outlet locations theme component.

Per le homepage personalizzate, above-main-container è una scelta comune, quindi usiamolo.

Dobbiamo creare il nostro file di connettore nella directory corretta:

:page_facing_up: javascripts/discourse/connectors/above-main-container/custom-homepage-connector.hbs

<CustomHomepageContent />

:point_up: ed è tutto, ha solo bisogno di una singola riga che richiama il tuo componente :tada:


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

47 Mi Piace

Ciao @awesomerobot,

Grazie per la spiegazione. Ho provato i passaggi che hai suggerito ma l’ after_header che ho implementato viene ancora visualizzato nelle pagine di dettaglio dei post. Puoi consigliarmi come posso risolvere questo problema per mostrarlo solo sulla mia home page?

1 Mi Piace

Ciao @Cornelius, posso vedere il tuo codice?

2 Mi Piace

Sarebbe fantastico riscrivere questo per l’uso moderno del filesystem anziché inserire tutto nei tag di intestazione.

La maggior parte di queste vecchie guide per i temi è obsoleta rispetto a come vengono fatte le cose ora.

7 Mi Piace

Sì, questo era piuttosto obsoleto! L’ho aggiornato per riflettere la struttura dei temi remoti e i nostri moderni componenti Ember.

6 Mi Piace

Fantastico!

E quel getter è la stessa cosa di questo http://ember-cli-page-object.js.org/docs/v1.11.x/api/getter.html? So abbastanza da essere pericoloso. Se è la stessa cosa, modificherò l’OP per collegarlo.

3 Mi Piace

@awesomerobot Ciao Kris, ho installato Discourse localmente sul mio sistema. Qual è il percorso corretto per aggiungere questi file nella mia istanza locale di Discourse? Volevo aggiungere un nuovo componente tematico nella mia istanza locale di Discourse.

1 Mi Piace

Creeresti il tuo componente tema e lo installeresti tramite l’ux.

Installa un tema o un componente tema

Installa l’app console Discourse Theme CLI per aiutarti a creare temi

4 Mi Piace

Se costruisco la mia homepage sopra la vista della categoria, ottengo comunque i miei contenuti personalizzati anche se vado su /categories che non è l’URL principale. Voglio limitare questo solo all’URL principale / che credo sia ciò che faceva il codice precedente, ma mi chiedo se defaultHomepage() dovrebbe farlo.

3 Mi Piace

discovery.${defaultHomepage()} corrisponderà al percorso impostato come percorso di destinazione dall’impostazione top-menu. Corrisponderà sia all’URL principale / SIA al percorso specifico, come /categories.

Nella mia esperienza ci sono due complicazioni quando si costruisce una homepage personalizzata basata su defaultHomepage():

  • il percorso su cui si basa non è più disponibile come semplice visualizzazione elenco
  • i membri possono impostare la propria homepage predefinita nelle impostazioni della loro interfaccia. Quindi, o si disabilita quella funzionalità o si dispone di un concetto di homepage che funzioni su uno qualsiasi dei percorsi del menu principale

Per costruire una homepage personalizzata solo sull’URL principale è possibile verificare router.currentURL === '/'. Per impostazione predefinita, questo corrisponde solo all’URL principale / e non al percorso di destinazione impostato dall’impostazione del menu principale. Tuttavia, ora esiste una logica sui collegamenti della barra laterale che mira inoltre a far corrispondere un dato URL a un percorso. Quindi, per impostazione predefinita, non funzionerà sui collegamenti della barra laterale. Ho appena pubblicato un argomento su questo: Can I have sidebar links that don’t resolve an url to a route?

Per quanto ne so, attualmente non esiste un modo predefinito per costruire una homepage personalizzata sull’URL principale senza prendere di mira un percorso dal menu principale o incorrere in problemi con la barra laterale. Sarebbe fantastico avere questa opzione.

4 Mi Piace

Giusto, è una specie di “hack” di lunga data che / e il corrispondente /route possano visualizzare contenuti diversi. Abbiamo un’attività da fare:

  1. Consentire l’impostazione della home page indipendentemente dall’impostazione top_menu
  2. Aggiungere un nuovo modello di home page autonomo che possa essere personalizzato senza sovrascrivere un percorso esistente

Le home page personalizzate sono una richiesta molto comune a questo punto, quindi potremmo certamente utilizzare maggiore flessibilità qui.

6 Mi Piace