Añade contenido personalizado que solo aparezca 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.

Podrías agregar algo de HTML en la sección “Después del encabezado” de tu tema, lo cual aparecería en todas las páginas. Podrías hacer varios trucos en CSS para ocultarlo en todas partes excepto en la página de inicio… pero en su lugar, usemos un tema de Discourse para crear un componente con contenido visible solo 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, necesitará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 de Ember. Puedes encontrar más información sobre los componentes de Ember en su documentación: Ember.js Guides - Guides and Tutorials - Ember Guides.

Pero por ahora, esto será un componente simple, escrito en un solo archivo .gjs que contiene tanto la lógica como la plantilla.

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

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

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

Esto crea un getter isHomepage, que verifica el servicio del enrutador en busca del currentRouteName. Si el nombre de la ruta coincide con tu página de inicio (según lo establecido en la configuración del sitio), entonces devolverá true. La plantilla dentro de <template>...</template> verifica ese getter y solo muestra tu contenido cuando es true. Puedes agregar cualquier HTML que desees entre los bloques {{#if}}.

Ahora que hemos creado nuestro componente, necesitamos agregarlo a Discourse en algún lugar. Para este paso, debes decidir qué punto de conexión de plugin utilizar. Estos son áreas en Discourse donde hemos agregado un poco de código para que los desarrolladores puedan conectarse. Puedes buscar estos puntos en GitHub o explorar la lista en (deprecated) Plugin outlet locations theme component.

Para páginas de inicio personalizadas, above-main-container es una opción común, así que usemos esa.

Necesitamos crear nuestro archivo de conexión en el directorio correcto:

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

import CustomHomepageContent from "../../components/custom-homepage-content";

<template><CustomHomepageContent /></template>

:point_up: Y eso es todo, solo necesita una línea que llame 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