Desenvolvendo Plugins Discourse - Parte 1 - Criar um plugin básico

Hmmmm. That’s a tricky one, because the symlink needed to be deleted, otherwise the Docker mount fails (as it cannot overwrite the existing file).

I had a bit of a google around for solutions, and found an interesting solution which would dereference the symlink and copy the symlink’s target into the specified directory, but couldn’t find anything that would create a Docker volume mount, thus preserving the dynamic link and bi-directional synchronisation. Happy to be steered towards a solution as this would be a neat feature to have.

Me diga como adicionar sua validação ao modelo app/models/user.rb?

1 curtida

Você pode usar código Ruby normal para fazer isso no seu plugin.rb:

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
6 curtidas

Estou apenas começando meu primeiro plugin pequeno :blush: Tenho algumas perguntas e espero que alguém possa ajudar…

Minha primeira pergunta é: importa se usamos o que está neste guia ou devemos realmente nos esforçar para usar o gerador de plugins?

Isso não foi abordado neste guia, mas como podemos tornar os dados disponíveis para nossos templates a partir do arquivo plugin.rb?

Digamos, por exemplo, que eu queira exibir uma mensagem de boas-vindas aleatória no outlet de plugin topic-above-posts sempre que alguém visitar um tópico, com a mensagem sendo selecionada aleatoriamente de um array no plugin.rb… como enviaria esses dados para o template? O qual, presumo, estaria aqui:

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs (Isso está correto?)

Qualquer dica é muito apreciada :blush:

2 curtidas

Usar o gerador de plugins é geralmente uma ótima maneira de começar e entender como um plugin deve ser estruturado. Recomendo.

Agora, sobre como colocar código Ruby no front-end: são duas aplicações diferentes. A aplicação de front-end (Ember) terá que solicitá-lo ao servidor (Rails) de alguma forma. Normalmente, fazemos isso por meio de uma chamada AJAX, mas você também poderia adicionar algo ao SiteSerializer para que seja enviado automaticamente como parte dos dados do fórum.

Caso contrário, você precisará pesquisar como adicionar uma rota/controle no Rails e enviar as mensagens como JSON.

8 curtidas

Obrigado, Robin!

Você saberia se há algum tutorial sobre isso? Ou existe um plugin simples (ou até mesmo um plugin de exemplo) que possamos analisar e que nos ajude a seguir na direção certa? (Caso não haja, você poderia rapidamente disponibilizar algo para nós em algum lugar, por favor? Acredito que isso ajudaria muita gente :blush:)

Além disso… você tem mais alguma ideia sobre escrever um livro? Posso colocá-lo em contato com alguém se tiver interesse :smiley:

1 curtida

Obrigado pelo elogio, mas estou definitivamente muito ocupado para considerar escrever um livro. Além disso, livros técnicos têm um alcance SUPER limitado. Aqueles que conheço que escreveram livros dizem que você faz isso por você mesmo, não pelo dinheiro :slight_smile:

Não consigo pensar em um plugin simples para retornar algo do lado do servidor. O discourse-tooltips adiciona uma rota e depois a usa para obter pré-visualizações de tópicos ao passar o mouse, o que pode ser útil.

8 curtidas

Em breve, começarei o desenvolvimento de plugins…

Pergunta:

Existe uma lista de hooks onde podemos realmente inserir plugins?

Por exemplo, digamos que queiramos criar um plugin para processar os dados cozinhados em uma postagem antes de serem exibidos. Esperaríamos que houvesse pelo menos um hook no início e outro no final, como (por exemplo):

  • display_post_start

  • display_post_complex

Então, nosso plugin se conectaria ao código no local do hook de nossa escolha acima.

Existe uma lista desses hooks de plugin e como eles são chamados no DiscourseWorld?

Atualização: Encontrei isso:

git grep "plugin-outlet" -- "*.hbs"

Mas não vi nenhum outlet para modificar o conteúdo cozinhado de postagens.

Existe um tutorial sobre como criar nossos próprios outlets, por exemplo, um outlet para modificar a parte cozinhada das postagens?

2 curtidas

Você está procurando este guia, seção decorateCooked():

5 curtidas

Eu uso este esqueleto para um plugin personalizado. Preciso mudar alguma coisa para a próxima transição para o Ember 5?

Suponho que não? Embora este seja apenas um linter?

1 curtida

O esqueleto é compatível com Ember 5. Mas se você adicionou algum código JavaScript ou templates HBS, precisará verificar as descontinuações, conforme descrito no anúncio.

Sim, as coisas no package.json estão relacionadas apenas à verificação de estilo, não afetam a funcionalidade ou compatibilidade de um plugin.

3 curtidas

Por favor, adicione a isto

rake plugin:create[plugin-name]

Passei muito tempo hoje tentando encontrar Automating Discourse Plugin Setup with `create-discourse-plugin` gem (não tenho certeza de como não consegui me lembrar que este era o nome da tarefa rake?! :person_shrugging: )

5 curtidas

Eu também adicionaria uma nota ao usar a configuração do Docker, pois as instruções acima falharão com um erro semelhante a

ambientimpact:~/.../Discourse/discourse$ d/rake plugin:create[neurocracy-date-rewrite]
Cloning 'https://github.com/discourse/discourse-plugin-skeleton' to '/src/plugins/neurocracy-date-rewrite'...
Initializing git repository...
Initialized empty Git repository in /src/plugins/neurocracy-date-rewrite/.git/
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <discourse@localhost>) not allowed
rake aborted!
Command failed with exit 128: git
/src/lib/tasks/plugin.rake:354:in `system'
/src/lib/tasks/plugin.rake:354:in `block (2 levels) in <main>'
/src/lib/tasks/plugin.rake:344:in `chdir'
/src/lib/tasks/plugin.rake:344:in `block in <main>'
Tasks: TOP => plugin:create
(See full trace by running task with --trace)

Você primeiro precisa configurar seu .gitconfig dentro do contêiner (altere o e-mail e o nome conforme necessário) antes de tentar criar o plug-in:

d/exec git config --global user.email "you@example.com"
d/exec git config --global user.name "Your Name"
d/rake plugin:create[plugin-name]
1 curtida