¿Qué tan difícil es modificar/extender Discourse para un desarrollador backend?

Hola,

Soy un MLE con algo de experiencia en backend. Mis habilidades de frontend son inexistentes/bastante débiles.

Estoy interesado en alojar un pequeño foro que requiere las siguientes características:

  • Filtrar publicaciones por varias etiquetas de manera sencilla
  • Ciertas categorías ocultas a menos que el usuario haya iniciado sesión
  • Registros que necesiten aprobación del administrador
  • Posiblemente un carrusel de fotos en la parte superior del sitio

¿Es este tipo de cosas difíciles de hacer? He estado mirando el código de algunos complementos y, si bien la implementación real es bastante corta y sencilla de leer, parece difícil de escribir.

2 Me gusta

Estoy en el mismo barco que tú. Tengo experiencia con backend en nodejs. También he hecho un poco de html/css/javascript en el frontend, pero he hecho mucho más backend. Hay mucho de lo que parece ser código especializado específico de discourse o ruby o un estilo de codificación muy particular, aunque sé javascript, la base de código de discourse me parece intimidante y compleja. Estoy pensando seriamente en intentar ejecutar mi propia IA local en la que pueda introducir toda la base de código y luego hacerle preguntas sobre lo que quiero hacer. Aparte de eso, todo lo que puedo hacer es leer el código existente, los plugins, etc. e intentar entenderlo lo mejor que pueda. Si estás interesado en compartir conocimientos o intentar aprender juntos, estoy abierto a ello :slight_smile:

1 me gusta

Sí, hay una curva de aprendizaje bastante grande. Pero todas las cosas que mencionas ya existen y no se necesitará codificación.

están en el núcleo de Discourse, y

se puede hacer con componentes de temas existentes.

5 Me gusta

Mataría por algunos cursos en video sobre el desarrollo de Discourse en Udemy. Solo dime a quién tirarle dinero. :dollar_banknote::dollar_banknote::dollar_banknote:

2 Me gusta

No es necesario modificar nada, ya está soportado por la API. ¡Y ya puedes hacerlo desde el frontend! ¡Creé un “widget” (¡Componente Glimmer!) solo para hacer eso!:

Este componente funciona en Bloques y Diseños de la Barra Lateral Derecha.

1 me gusta

¿Podría esto usarse para crear una jerarquía anidada?

El foro que estoy considerando está dirigido a personas mayores que no han visto antes discusiones como los foros.

Sería bueno para ellos poder navegar por estructuras anidadas como los foros tradicionales.

1 me gusta

Para anidar, usa Categorías.

2 Me gusta

Muchas instancias de Discourse optan por esto, mira:

2 Me gusta

Fuera de tema, pero esto fue muy útil aquí, me encanta nuestra función “explicar con IA”

un MLE en el contexto dado se refiere a un Ingeniero de Aprendizaje Automático (Machine Learning Engineer). Este es un profesional que se especializa en el uso de datos y algoritmos para construir modelos que permiten a las máquinas realizar tareas sin ser programadas explícitamente para esas tareas específicas. Generalmente tienen una sólida formación en informática, estadística y programación, y su experiencia tiende a centrarse en los aspectos de backend de la tecnología, como la creación y el despliegue de modelos predictivos y otros productos de aprendizaje automático. Cuando el autor original menciona “un MLE”, se identifica como un Ingeniero de Aprendizaje Automático que está familiarizado con el desarrollo de backend pero que carece de experiencia en desarrollo de frontend.

5 Me gusta

Algunas reflexiones sobre esto.

Desarrollo de cursos de pago sobre Discourse

La idea de cursos relacionados con el desarrollo de Discourse en una plataforma como Udemy o Coursera es interesante. Sospecho que los principales problemas son que no hay muchas personas fuera del equipo de Discourse que estén calificadas para crear un curso sobre desarrollo de Discourse y que el número potencial de estudiantes para un curso es bastante pequeño. Dicho esto, estoy seguro de que un buen curso relacionado con el desarrollo de temas o plugins de Discourse podría conseguir suficientes estudiantes con el tiempo como para que valga la pena el esfuerzo de crear un curso.
También existe la posibilidad de que cobrar por los cursos de Discourse vaya en contra del espíritu de este foro. Sin embargo, solo estoy especulando sobre eso.

Tutoriales de desarrollo de Discourse

Creo que la observación de que la implementación real de muchos plugins, temas y componentes de temas de Discourse es bastante simple es correcta. Al igual que con el desarrollo para otras plataformas, el problema es superar la barrera inicial de no entender cómo encajan las partes. El equipo de Discourse (o algunos otros desarrolladores cualificados) podría ayudar con esto escribiendo algunos tutoriales que te guíen a través de todo el proceso de creación de temas, componentes de temas y plugins funcionales. Por ejemplo, una guía paso a paso para crear algo como el componente de tema Discourse Placeholder.
Me doy cuenta de que esto requeriría una gran inversión de tiempo, por lo que necesitaría alinearse con los objetivos comerciales de Discourse.

Recursos disponibles actualmente

Con un poco de búsqueda, hay mucha buena información sobre el desarrollo de Discourse en este foro. Mirar ejemplos de código del repositorio de GitHub de Discourse también es una excelente manera de aprender.
Una herramienta reciente que no debe pasarse por alto es GitHub Copilot. Si estructuras tu entorno de desarrollo de la manera correcta, puede ser útil para tener una idea de cómo desarrollar temas y plugins de Discourse. Para desarrollar temas de Discourse, el mejor enfoque que he encontrado es desarrollar el tema (usando la CLI de temas de Discourse) en el directorio raíz de mi instalación local de Discourse. Estructurar las cosas de esta manera da a Copilot fácil acceso a la base de código de Discourse. (Tenga en cuenta que para el desarrollo de plugins, la carpeta plugins ya está en el directorio raíz /discourse.) (Tenga en cuenta también que podría estar equivocado sobre que Copilot acceda realmente a la base de código de Discourse que he cargado en mi IDE. En cualquier caso, es útil tener el código principal de Discourse disponible para mi propia referencia).
Para evitar distracciones y también para centrarme en usar Copilot como herramienta de aprendizaje, desactivo las completaciones de Copilot en mi IDE (VS Code) y solo interactúo con Copilot a través del chat. Aquí tienes un ejemplo del tipo de ayuda que puede proporcionar. (shopify.js es el archivo que creó la CLI de temas en el directorio /javascripts/discourse/api-initializers/ de mi tema).

Conversación con Copilot

_scossar: ¿Puedes explicar qué hace la exportación predeterminada en shopify.js? Es esencialmente el código de plantilla que proporciona Discourse cuando se crea un tema con la gema discourse_theme. He alterado el código de plantilla para que registre cada cambio de página. Entiendo la llamada a api.onPageChange, pero no tengo una comprensión clara de cómo se inyecta el objeto api en mi código.

GitHub Copilot: El objeto api se inyecta en tu código a través de la función withPluginApi que se llama en el método initialize del objeto devuelto por apiInitializer.

Aquí tienes una versión simplificada de lo que está sucediendo:

  1. Cuando Discourse se inicia, ejecuta todos los inicializadores.

  2. La función apiInitializer crea un inicializador que se ejecuta después del inicializador "inject-objects".

  3. Cuando se ejecuta este inicializador, llama a la función withPluginApi, pasando los parámetros version, cb y opts.

  4. La función withPluginApi comprueba si la versión actual de Discourse es compatible con la versión especificada. Si lo es, llama a la función de devolución de llamada (cb) y pasa la instancia de PluginApi como argumento. Este objeto PluginApi es el objeto api que ves en tu código.

Por lo tanto, api es una instancia de PluginApi, y la función withPluginApi te la pasa a tu código. Este objeto proporciona una serie de métodos que te permiten interactuar con Discourse, como onPageChange, que ya estás utilizando.

_scossar: Entonces, ¿la función que es el segundo argumento de la exportación predeterminada en shopify.js es la función de devolución de llamada que acepta apiInitializer?

GitHub Copilot: Sí, eso es correcto. El segundo argumento de apiInitializer es una función de devolución de llamada. Esta función se llama con la instancia de PluginApi como argumento cuando se ejecuta el inicializador (suponiendo que la versión actual de Discourse sea compatible con la versión especificada). Así es como el objeto api se pone a disposición en tu archivo shopify.js.

Una vez que resolví eso…

_scossar: …Otro pensamiento, ¿podría usarse api.decorateCooked para inyectar un iframe de calificación alojado en una aplicación externa (por ejemplo, alojado por la aplicación Shopify que estoy desarrollando)?

GitHub Copilot: Sí, puedes usar api.decorateCooked para inyectar un iframe en una publicación. Aquí tienes un ejemplo aproximado de cómo podrías hacerlo:

api.decorateCooked($elem => {
  const postId = $elem.data('post-id');
  const iframe = document.createElement('iframe');
  iframe.src = `https://your-app.com/ratings?post_id=${postId}`;
  iframe.width = '100%';
  iframe.height = '200'; // ajusta según sea necesario
  $elem.append(iframe);
}, { id: 'rating-iframe' });

En este ejemplo, api.decorateCooked se utiliza para añadir un iframe a cada publicación. La fuente del iframe se establece en una URL de tu aplicación externa, con el ID de la publicación incluido como parámetro de consulta. Deberías reemplazar 'https://your-app.com/ratings' con la URL real de tu página de calificaciones.

Ten en cuenta que este es un ejemplo simplificado. Es posible que necesites ajustarlo para que se adapte a tus necesidades, y definitivamente deberías añadir manejo de errores y otras precauciones necesarias para garantizar que funcione de manera correcta y segura.

No es razonable en este punto esperar que Copilot escriba todo tu código, pero es una gran herramienta para aprender a escribir código de Discourse.

Pensaría que tener menos categorías y menos jerarquía sería más fácil para las personas mayores.

A menos que tenga mucho tráfico que interese a muy pocas personas, probablemente no necesite muchas categorías.