Olá, tenho personalizado a aparência do meu Discourse no campo customizado do tema.
Uso | script type="text/x-handlebars" data-template-name="components/categories-only" |
e similares para sobrescrever alguns modelos específicos. Existe alguma maneira de sobrescrevê-los apenas em páginas específicas, como a página inicial, e usar um código diferente na visualização de subcategorias, por exemplo? Ainda sou bastante novo no Discourse e nem mesmo tenho certeza se essa é a maneira correta de fazer isso em HTML/CSS personalizado de temas (sei que perdo essas alterações nas atualizações). Se alguém puder me ajudar, eu agradeceria muito.
Vamos esclarecer isso primeiro.
Isso não está correto. Você não perde suas alterações ao atualizar se elas forem feitas em um tema. Elas persistem. A única maneira de perder suas alterações é se você editar diretamente os arquivos no seu servidor, o que, obviamente, você não deve fazer.
Agora, há certo risco envolvido ao sobrescrever modelos, pois uma atualização no núcleo pode significar que suas alterações não sejam mais compatíveis e precisem ser atualizadas. Se você estiver confortável com esse risco, tecnicamente pode alcançar o que está pedindo aqui.
Para começar, você precisa de uma maneira de distinguir quando o usuário está na página inicial. No caso do componente apenas categorias, uma maneira é verificar o searchContext. Quando você está em uma página de subcategoria, o contexto de pesquisa é definido como “category”. Se não houver contexto de pesquisa, significa que você está na página inicial.
A maneira de passar isso para seu modelo é adicionando algo como isso:
<script type="text/discourse-plugin"
version="0.8">
const categoriesOnlyComponent = require('discourse/components/categories-only').default;
categoriesOnlyComponent.reopen({
isHomepage: function() {
return !this.parentView.searchService.contextType
}.property()
});
</script>
O que isso faz é permitir que você use isHomepage no modelo para categories-only. Ele retorna true se não houver contexto de pesquisa, o que significa que você está na página inicial. Caso contrário, retorna false.
Em seguida, você precisa copiar o modelo padrão da seguinte maneira:
<script type='text/x-handlebars'
data-template-name='components/categories-only'>
{{#if categories}}
... resto do modelo
{{/if}}
</script>
e usar isHomepage que adicionamos. Para isso, você precisa usar o auxiliar {{#if}} do Handlebars. Basicamente, o que você precisa é de algo assim:
<script type='text/x-handlebars'
data-template-name='components/categories-only'>
{{#if categories}}
{{#if isHomepage}}
... modelo apenas para a página inicial
{{else}}
... resto do modelo padrão se não estiver na página inicial
{{/if}}
</script>
Agora você pode usar o que quiser na seção isHomepage. Você pode editá-lo diretamente ali ou criar um novo modelo para essa seção, como mostrado abaixo:
<script type='text/x-handlebars'
data-template-name='components/categories-only-homepage'>
<h1>Você está na página inicial!</h1>
<p>
Use esta seção para renderizar o modelo para o componente apenas categorias se o usuário estiver na página inicial.
</p>
</script>
A última coisa que você precisa fazer é chamar esse modelo como um parcial no modelo categories-only dentro da seção isHomepage, como mostrado abaixo:
<script type='text/x-handlebars'
data-template-name='components/categories-only'>
{{#if categories}}
{{#if isHomepage}}
{{partial 'components/categories-only-homepage'}}
{{else}}
... resto do modelo padrão se não estiver na página inicial
{{/if}}
</script>
O resultado é que, quando você visitar a página inicial, verá isso:
mas o componente nas subcategorias deve permanecer inalterado.
Isso é opcional, mas você também pode se interessar em ler:
porque essa é a nova maneira recomendada de trabalhar com temas e evitar o uso de tags script.
Incrível, muito obrigado! Agora eu também meio que entendi como usar o text/discourse-plugin. Agradeço muito!
Ei, gostaria de fazer mais uma pergunta.
Poderia me dizer como posso obter o tópico mais recente em subcategorias específicas? Posso usar category.latestTopic para pegar o tópico mais recente de uma categoria, mas não consigo usá-lo para subcategorias. Existe alguma solução inteligente para isso? Gostaria de mostrar o tópico mais recente de uma subcategoria ao listar as subcategorias.


