Algumas reflexões sobre isso.
Desenvolvimento de cursos pagos de Discourse
A ideia de cursos relacionados ao desenvolvimento de Discourse em uma plataforma como Udemy ou Coursera é interessante. Suspeito que os principais problemas sejam que não há muitas pessoas fora da equipe do Discourse que seriam qualificadas para criar um curso em desenvolvimento de Discourse e que o número potencial de alunos para um curso é bastante pequeno. Dito isso, tenho certeza de que um bom curso relacionado ao desenvolvimento de temas ou plugins do Discourse poderia atrair alunos suficientes ao longo do tempo para justificar o esforço de criação de um curso.
Há também uma possível questão de que cobrar por cursos de Discourse pode ir contra o espírito deste fórum. Estou apenas especulando sobre isso, no entanto.
Tutoriais de desenvolvimento de Discourse
Acho que a observação de que a implementação real de muitos plugins, temas e componentes de tema do Discourse é bastante simples está correta. Assim como no desenvolvimento para outras plataformas, o problema é superar a barreira inicial de não entender como as partes se encaixam. A equipe do Discourse (ou outros desenvolvedores qualificados) poderia ajudar com isso escrevendo alguns tutoriais que guiam você por todo o processo de criação de temas funcionais, componentes de tema e plugins. Por exemplo, um guia passo a passo para criar algo como o componente de tema Discourse Placeholder.
Percebo que isso exigiria um grande investimento de tempo, então precisaria se alinhar com os objetivos de negócios do Discourse.
Recursos atualmente disponíveis
Com um pouco de pesquisa, há muitas informações boas sobre o desenvolvimento de Discourse neste fórum. Olhar exemplos de código do repositório GitHub do Discourse também é uma ótima maneira de aprender.
Uma ferramenta recente que não deve ser ignorada é o GitHub Copilot. Se você estruturar seu ambiente de desenvolvimento da maneira certa, ele pode ser útil para ter uma ideia de como desenvolver temas e plugins do Discourse. Para desenvolver temas do Discourse, a melhor abordagem que encontrei é desenvolver o tema (usando o Discourse Theme CLI) no diretório raiz da minha instalação local do Discourse. Estruturar as coisas dessa forma dá ao Copilot acesso fácil à base de código do Discourse. (Note que para desenvolvimento de plugins, a pasta plugins já está no diretório raiz /discourse.) (Note também que posso estar errado sobre o Copilot realmente acessar a base de código do Discourse que carreguei no meu IDE. Em qualquer caso, é útil ter o código principal do Discourse disponível para minha própria referência.)
Para evitar distrações e também para focar no uso do Copilot como uma ferramenta de aprendizado, desligo as Conclusões do Copilot no meu IDE (VS Code) e interajo com o Copilot apenas por meio de chat. Aqui está um exemplo do tipo de assistência que ele pode oferecer. (shopify.js é o arquivo criado pelo Theme CLI no diretório /javascripts/discourse/api-initializers/ do meu tema.)
Conversa com o Copilot
_scossar: Você pode explicar o que o export padrão em shopify.js está fazendo? É essencialmente o código boilerplate que é fornecido pelo Discourse quando um tema é criado com o gem discourse_theme. Eu alterei o código boilerplate para que ele registre cada mudança de página. Eu entendo a chamada para api.onPageChange, mas não tenho uma compreensão clara de como o objeto api está sendo injetado no meu código.
GitHub Copilot: O objeto api é injetado no seu código através da função withPluginApi que é chamada no método initialize do objeto retornado por apiInitializer.
Aqui está uma versão simplificada do que está acontecendo:
-
Quando o Discourse inicia, ele executa todos os inicializadores.
-
A função apiInitializer cria um inicializador que é executado após o inicializador \"inject-objects\".
-
Quando este inicializador é executado, ele chama a função withPluginApi, passando os parâmetros version, cb e opts.
-
A função withPluginApi verifica se a versão atual do Discourse é compatível com a versão especificada. Se for, ela chama a função de callback (cb) e passa a instância PluginApi como um argumento. Esta instância PluginApi é o objeto api que você vê no seu código.
Portanto, o objeto api é uma instância de PluginApi, e está sendo passado para o seu código pela função withPluginApi. Este objeto fornece vários métodos que permitem interagir com o Discourse, como onPageChange, que você já está usando.
_scossar: Então a função que é o segundo argumento para o export padrão em shopify.js é a função de callback que é aceita por apiInitializer?
GitHub Copilot: Sim, isso está correto. O segundo argumento para apiInitializer é uma função de callback. Esta função é chamada com a instância PluginApi como argumento quando o inicializador é executado (assumindo que a versão atual do Discourse seja compatível com a versão especificada). É assim que o objeto api é disponibilizado no seu arquivo shopify.js.
Depois que eu resolvi isso…
_scossar: …Outro pensamento, api.decorateCooked poderia ser usado para injetar um iframe de classificação hospedado em um aplicativo externo (por exemplo, hospedado pelo aplicativo Shopify que estou desenvolvendo)?
GitHub Copilot: Sim, você pode usar api.decorateCooked para injetar um iframe em uma postagem. Aqui está um exemplo aproximado de como você pode fazer isso:
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'; // ajuste conforme necessário
$elem.append(iframe);
}, { id: 'rating-iframe' });
Neste exemplo, api.decorateCooked é usado para anexar um iframe a cada postagem. A fonte do iframe é definida como uma URL em seu aplicativo externo, com o ID da postagem incluído como um parâmetro de consulta. Você substituiria 'https://your-app.com/ratings' pelo URL real da sua página de classificações.
Por favor, note que este é um exemplo simplificado. Pode ser necessário ajustá-lo para atender às suas necessidades, e você definitivamente deve adicionar tratamento de erros e outras precauções necessárias para garantir que ele funcione corretamente e com segurança.
Não é razoável neste ponto esperar que o Copilot escreva todo o seu código, mas é uma ótima ferramenta para aprender a escrever código do Discourse.