Agrega contenido personalizado que solo aparece en tu página de inicio

A very common situation you’ll find yourself in as a theme developer is the need to create content that only shows on the homepage of your community.

You might add some HTML to the “After Header” section of your theme, which will then appear on every page. You can jump through some hoops in CSS to hide this everywhere except the homepage… but instead let’s use a Discourse theme to create a component with content that is only visible on your homepage.

If you’re unfamiliar with Discourse themes check out Beginner's guide to using Discourse Themes and Structure of themes and theme components

In your Discourse theme you’ll need to setup the following directory structure:

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

From here we’re going to create an Ember component. You can find more about Ember components from their documentation: Ember.js Guides - Guides and Tutorials - Ember Guides

But for now this will be a simple component. The component will consist of two files, one containing the logic and another the 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()}`;
  }
}

This creates a isHomepage getter, which checks the router service for the currentRouteName — if the route name matches your homepage (as dictated by site settings) then it will return true

Now we need our template

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

{{#if this.isHomepage}}
  <h1>This is my homepage HTML content</h1>
{{/if}}

The template checks the isHomepage getter, and will display your content if it’s true. You can add any HTML you want between the {{#if}} blocks.

Now that our component is created, we need to add it to Discourse somewhere. For this step you’ll need to decide which plugin outlet to utilize. These are areas throughout Discourse where we’ve added a little code for developers to hook into. You can search Discourse for these on Github, or browse for them using the (deprecated) Plugin outlet locations theme component.

For custom homepages, above-main-container is a common choice, so let’s use that.

We need to create our connector file in the correct directory:

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

<CustomHomepageContent />

:point_up: and that’s all, it just needs a single line calling for your component :tada:


This document is version controlled - suggest changes on github.

47 Me gusta

Hola @awesomerobot,

Gracias por la explicación. Intenté los pasos que sugeriste, pero el after_header que implementé todavía se muestra en las páginas de detalles de las publicaciones. ¿Puedes recomendarme cómo puedo solucionar esto para que solo se muestre en mi página de inicio?

1 me gusta

Hola @Cornelius, ¿está bien ver tu código?

2 Me gusta

Sería genial reescribir esto para el uso moderno del sistema de archivos en lugar de meter todo en las etiquetas de encabezado.

La mayoría de estas guías antiguas para temas están desactualizadas con respecto a cómo se hacen las cosas ahora.

7 Me gusta

¡Sí, esto estaba bastante desactualizado! Lo he actualizado para reflejar la estructura de los temas remotos y nuestros componentes modernos de Ember.

6 Me gusta

¡Eso es genial!

¿Y ese getter es lo mismo que esto http://ember-cli-page-object.js.org/docs/v1.11.x/api/getter.html? Sé lo suficiente como para ser peligroso. Si es lo mismo, editaré el OP para enlazarlo.

3 Me gusta

@awesomerobot Hola Kris, he instalado Discourse localmente en mi sistema. ¿Cuál es la ruta correcta para agregar estos archivos en mi instancia local de Discourse? Quería agregar un nuevo componente temático en mi instancia local de Discourse.

1 me gusta

Crearías tu componente de tema e lo instalarías a través de la experiencia de usuario (UX).

Instalar un tema o componente de tema

Instalar la aplicación de consola Discourse Theme CLI para ayudarte a crear temas

4 Me gusta

Si creo mi página de inicio sobre la vista de categoría, consecuentemente sigo obteniendo mi contenido personalizado incluso si voy a /categories, que no es la URL de inicio. Quiero limitar esto solo a la URL raíz /, que creo que es lo que hacía el código anterior, pero me pregunto si defaultHomepage() debería hacer eso.

3 Me gusta

discovery.${defaultHomepage()} coincidirá con la ruta que se establece como ruta de destino en la configuración de top-menu. Coincidirá tanto con la URL raíz / como con la ruta específica, como /categories.

Según mi experiencia, hay dos complicaciones al crear una página de inicio personalizada basada en defaultHomepage():

  • la ruta sobre la que se construye ya no está disponible como una vista de lista simple
  • los miembros pueden establecer su propia página de inicio predeterminada en la configuración de su interfaz. Por lo tanto, uno necesita deshabilitar esa función o tener un concepto de página de inicio que funcione en cualquiera de las rutas del menú superior.

Para crear una página de inicio personalizada solo en la URL raíz, se puede verificar router.currentURL === '/'. Por defecto, esto solo coincide con la URL raíz / y no con la ruta de destino establecida en la configuración del menú superior. Sin embargo, ahora hay una lógica en los enlaces de la barra lateral que también intenta hacer coincidir una URL dada con una ruta. Por lo tanto, no funcionará con los enlaces de la barra lateral por defecto. Acabo de publicar un tema sobre esto: ¿Puedo tener enlaces en la barra lateral que no resuelvan una URL a una ruta?

Según mi entendimiento, actualmente no hay una forma predeterminada de crear una página de inicio personalizada en la URL raíz sin apuntar también a una ruta del menú superior o tener problemas con la barra lateral. Sería genial tener esa opción.

4 Me gusta

Correcto, es una especie de solución provisional de larga data que / y la ruta / correspondiente puedan renderizar contenido diferente. Tenemos una tarea pendiente para:

  1. Permitir que la página de destino se establezca de forma independiente de la configuración de top_menu.
  2. Añadir una nueva plantilla de página de destino independiente que se pueda personalizar sin hacerse cargo de una ruta existente.

Las páginas de destino personalizadas son una solicitud muy común en este momento, por lo que ciertamente podríamos usar más flexibilidad aquí.

6 Me gusta