Tengo un componente de Glimmer. Está funcionando. Pero necesito que vaya después de la primera publicación en un tema. No hay una salida de plugin allí.
Descubrí cómo insertar algo de texto en el innerHTML de la etiqueta <article>, y eso pone ese texto donde lo quiero, pero no parece haber una forma de hacerlo con un componente.
¿Me estoy perdiendo algo?
Miré cómo el adplugin inserta anuncios entre publicaciones, pero no pude entenderlo del todo.
(hay formas heredadas de lograr lo que estás haciendo, pero se romperán cuando modernicemos la vista del tema. Si agregamos una salida de plugin, será mucho más a prueba de futuro)
La publicación se pasa como uno de los argumentos de salida, por lo que puedes verificar post.post_number == 1
Jaja! Siempre feliz de ayudar con este tipo de preguntas. Es mucho mejor para todos si podemos hacer que los temas y complementos utilicen API estándar como esta en lugar de soluciones alternativas de widgets (que serán obsoletas en un futuro no muy lejano).
Sí, eso es justo. Añadirlos dentro de los widgets es un dolor de cabeza en el lado del núcleo. Pero desde el lado del tema/complemento debería ser súper limpio
Intentaré averiguar esos fallos en las pruebas y fusionar la PR mañana. (Parece que el elemento HTML adicional está interfiriendo con algunos selectores frágiles en las pruebas qunit)
Lamento tener que admitir que quizás fui un poco optimista aquí @pfaffman, ¡lo siento! El PR que hice introduciría un nuevo envoltorio <div> entre cada publicación, incluso si la salida no se estuviera utilizando. Eso no es realmente algo que queramos hacer.
Puede haber formas de evitar el envoltorio… pero nada sencillo que podamos hacer de inmediato.
Así que creo que la mejor solución inmediata para ti será copiar la implementación de adplugin a la que hiciste referencia en el OP.
Esencialmente:
Crea un componente (Glimmer o clásico, no importa) que renderice lo que quieras.
Usa registerWidgetShim para hacer que ese componente esté disponible como un widget. El ejemplo de adplugin está creando un widget llamado “after-post-ad”, que renderiza el componente PostBottomAd. Está pasando todos los atributos del widget (@data) al argumento @model del componente.
Usa api.decorateWidget para renderizar tu nuevo widget shim en la posición post:after. En tu caso, dado que solo lo quieres en la primera publicación, podrías hacer algo como:
Cuando finalmente hagamos el “glimmer-ify” de la página del tema, deberás eliminar el widget shim/decoración y reemplazarlo con una salida de plugin. Eso debería ser bastante fácil, ya que toda tu lógica de visualización en el componente será reutilizable en la salida del plugin.
¡Cuéntanos cómo te va! Estaremos encantados de ayudarte con cualquier pregunta de seguimiento; sé que hay muchas partes móviles aquí.
En este caso, no creo que necesites importar la clase Service. Eso solo sería necesario si estuvieras creando tu propio Servicio. Solo necesitas el decorador de inyección service.
Y en la última versión de Discourse/Ember, se puede simplificar aún más para evitar la necesidad del alias ‘inject as’. Ember ahora hace que el decorador de inyección esté disponible directamente como service.
import { service } from "@ember/service";
(pero el antiguo { inject as service } todavía funciona, y no tengo conocimiento de ningún plan para deprecarlo en Ember)
EDITAR: Pero tal vez pueda usar decorateWidget en lugar de un plugin outlet. . .