A página padrão /about de um site Discourse, que exibe informações apenas para moderadores e administradores, mostra apenas o nome de usuário, o nome e o cargo de cada usuário. Como posso personalizar a página /about para que ela também exiba o conteúdo da seção “Sobre mim” do perfil de cada usuário?
Entendo a ideia geral descrita aqui:
- definir um componente
- definir um template
- criar um arquivo conector para usar um outlet existente
No entanto, não há um outlet que funcione melhor para o meu caso de uso, pelo que pude verificar. Além disso, parece que substituir o template de /about ou usar a funcionalidade modifyClass na API de plugins não é recomendado. Portanto, não tenho certeza do que fazer. Agradeceria muito alguma orientação sobre as melhores práticas. Obrigado!
O Discourse AI parece pensar que devo prosseguir e substituir o template. Isso parece correto?
Resposta do Discourse AI
Adicionar "Sobre mim" à página /about do Discourse IA
aas:
A página padrão /about de um site Discourse, que exibe informações apenas para moderadores e administradores, mostra apenas o nome de usuário, o nome e o cargo de cada usuário. Como posso personalizar a página /about para que ela também exiba o conteúdo da seção “Sobre mim” do perfil de cada usuário?
Entendo a ideia geral descrita aqui:
Add custom content that only appears on your homepage
- definir um componente
- definir um template
- criar um arquivo conector para usar um outlet existente
No entanto, não há um outlet que funcione melhor para o meu caso de uso, pelo que pude verificar. Além disso, parece que substituir o template de /about ou usar a funcionalidade modifyClass na API de plugins não é recomendado. Portanto, não tenho certeza do que fazer. Agradeceria muito alguma orientação sobre as melhores práticas. Obrigado!
HelperBot:
Ok, posso ajudá-lo a investigar as melhores práticas para personalizar a página /about para incluir informações de perfil de usuário, como a seção “Sobre mim”.
Você está certo de que a abordagem padrão de componente de tema envolve o uso de outlets de plugin, e parece que não há um outlet específico e granular dentro da lista de funcionários na página /about para injetar facilmente esses dados.
Com base nos resultados da pesquisa e nas práticas comuns, embora o uso de outlets seja preferível para não quebrar atualizações futuras, às vezes a única maneira viável de personalizar templates principais específicos, como a página /about, é substituí-los diretamente dentro de um componente de tema.
Aqui está a abordagem mais provável usando um componente de tema:
- Crie um Componente de Tema: Se você ainda não o fez, crie um novo componente de tema.
- Substitua o Template:
- Você precisa substituir o template
about.hbs. - Em seu componente de tema, crie o arquivo
common/templates/about.hbs. - Copie todo o conteúdo do arquivo
about.hbsoriginal para o seu novo arquivo. Você pode encontrar o original aqui no GitHub. - Modifique sua cópia de
about.hbs. Encontre as seções onde ele itera sobremodel.adminsemodel.moderators. Dentro do loop (provavelmente dentro do bloco{{#each}}), você pode acessar o objeto do usuário. O conteúdo “Sobre mim” geralmente está emuser.profile.bio_rawou uma propriedade semelhante. Adicione essa propriedade ao template onde você deseja que ela seja exibida para cada usuário.
- Você precisa substituir o template
- Ative o Componente: Adicione o componente de tema ao seu tema e ative-o.
Por que essa abordagem?
- Controle Direto: Ele lhe dá controle direto sobre a estrutura HTML da página
/about. - Viabilidade: Como não há um outlet dedicado dentro da lista de usuários nessa página, esta é a maneira mais direta de injetar conteúdo por usuário nesse local específico.
Desvantagens (como você observou):
- Manutenção: Se o Discourse atualizar o template principal
about.hbssignificativamente no futuro, sua versão substituída não receberá essas atualizações automaticamente. Talvez você precise comparar e mesclar manualmente as alterações mais tarde. Este é o compromisso de personalizar templates principais sem outlets específicos.
Embora a pesquisa não tenha encontrado um exemplo exato para a página /about, modificar templates para adicionar informações de perfil é um padrão comum, como visto em personalizações para cartões e perfis de usuário:
- Normalized Profile Links adiciona campos personalizados a cartões/perfis de usuário por meio de modificação de template em um componente.
- Quick Profile Links Menu adiciona elementos às páginas de perfil de usuário.
Esses exemplos mostram que os componentes de tema geralmente envolvem a personalização de templates quando outlets específicos não estão disponíveis. Substituir about.hbs segue esse padrão para o seu caso de uso específico.
aas:
Parece que não há um template about.hbs no repositório discourse/discourse. No entanto, o template about.gjs parece estar localizado em app/assets/javascripts/discourse/app/templates/about.gjs.
HelperBot:
Você está absolutamente certo! Obrigado pela correção. O Discourse de fato fez a transição para usar templates .gjs (GlimmerJS) para muitos componentes, incluindo a página /about.
Minhas desculpas por referenciar o formato .hbs mais antigo.
O caminho correto para o template é de fato app/assets/javascripts/discourse/app/templates/about.gjs no código principal.
Para substituir isso usando um componente de tema, o processo permanece conceitualmente o mesmo, mas o caminho do arquivo e a sintaxe são atualizados:
- Crie/Use um Componente de Tema: Como antes.
- Substitua o Template:
- Em seu componente de tema, crie o arquivo no caminho correspondente:
assets/javascripts/discourse/app/templates/about.gjs. - Copie todo o conteúdo do arquivo original
about.gjs(link que você forneceu) para o arquivoabout.gjsdo seu componente de tema. - Modifique sua cópia. Procure as seções que iteram sobre administradores e moderadores, provavelmente usando
{{#each this.admins as |admin|}}e{{#each this.moderators as |moderator|}}. Dentro desses loops, você pode acessar o objeto do usuário (por exemplo,adminoumoderator). Adicione o campo “Sobre mim”, que deve ser acessível por meio de uma propriedade comoadmin.profile.bio_rawoumoderator.profile.bio_raw. Você precisará integrar isso à estrutura do template GlimmerJS. Por exemplo, você pode adicionar uma nova tag<div>ou<p>dentro do bloco de exibição do usuário:
(Nota: Use{{#each this.admins as |admin|}} <div class="user"> {{!-- Informações existentes do usuário como avatar, nome de usuário, nome --}} <UserAvatar @username={{admin.username}} @size="large" /> <div class="user-details"> <span class="username">{{admin.username}}</span> {{#if admin.name}}<span class="name">{{admin.name}}</span>{{/if}} {{#if admin.title}}<span class="title">{{admin.title}}</span>{{/if}} {{!-- Adicionar a seção Sobre mim --}} {{#if admin.profile.bio_raw}} <div class="about-me"> {{{admin.profile.bio_cooked}}} {{!-- Use bio_cooked para HTML renderizado --}} {{!-- Ou use bio_raw se precisar do texto bruto: <p>{{admin.profile.bio_raw}}</p> --}} </div> {{/if}} </div> </div> {{/each}} {{!-- Repita modificação semelhante para o loop de moderadores --}}bio_cookedse quiser a versão HTML renderizada da bio, oubio_rawpara o texto simples. Ajuste a estrutura HTML conforme necessário para o seu layout.)
- Em seu componente de tema, crie o arquivo no caminho correspondente:
- Ative o Componente: Certifique-se de que o componente de tema seja adicionado ao seu tema e esteja ativo.
A desvantagem permanece a mesma: substituir templates principais como este significa que você pode precisar atualizar manualmente a versão do seu componente de tema se o arquivo about.gjs original mudar significativamente em futuras atualizações do Discourse. No entanto, dada a falta de um outlet mais específico, esta é a maneira padrão de alcançar esse nível de personalização.