Añadir contenido personalizado que solo aparece en tu página de inicio

Una situación muy común en la que te encontrarás como desarrollador de temas es la necesidad de crear contenido que solo se muestre en la página de inicio de tu comunidad.

Es posible que añadas algo de HTML a la sección “After Header” de tu tema, que luego aparecerá en todas las páginas. Puedes hacer algunos trucos en CSS para ocultar esto en cualquier lugar excepto en la página de inicio… pero en su lugar, usemos un tema de Discourse para crear un componente con contenido que solo sea visible en tu página de inicio.

Si no estás familiarizado con los temas de Discourse, consulta Beginner's guide to using Discourse Themes y Structure of themes and theme components

En tu tema de Discourse, deberás configurar la siguiente estructura de directorios:

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

A partir de aquí, vamos a crear un componente Ember. Puedes encontrar más información sobre los componentes Ember en su documentación: Ember.js Guides - Guides and Tutorials - Ember Guides

Pero por ahora, este será un componente simple. El componente constará de dos archivos, uno que contiene la lógica y otro la plantilla.

: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()}`;
  }
}

Esto crea un getter isHomepage, que comprueba el servicio del enrutador para el currentRouteName — si el nombre de la ruta coincide con tu página de inicio (según lo dictado por la configuración del sitio), devolverá true

Ahora necesitamos nuestra plantilla

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

{{#if this.isHomepage}}
  <h1>Este es el contenido HTML de mi página de inicio</h1>
{{/if}}

La plantilla comprueba el getter isHomepage y mostrará tu contenido si es true. Puedes añadir cualquier HTML que desees entre los bloques {{#if}}.

Ahora que nuestro componente está creado, necesitamos añadirlo a Discourse en algún lugar. Para este paso, deberás decidir qué plugin outlet utilizar. Estas son áreas en todo Discourse donde hemos añadido un poco de código para que los desarrolladores se conecten. Puedes buscar estos en Github, o explorarlos usando (deprecated) Plugin outlet locations theme component.

Para las páginas de inicio personalizadas, above-main-container es una opción común, así que usémosla.

Necesitamos crear nuestro archivo de conector en el directorio correcto:

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

<CustomHomepageContent />

:point_up: y eso es todo, ¡solo necesita una sola línea llamando a tu componente :tada:


Este documento está controlado por versiones: sugiere cambios en 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