Modificadores de tema: uma breve introdução

À medida que os temas se tornam mais ambiciosos, temos procurado maneiras de permitir que eles manipulem o comportamento central do lado do servidor. Embora nunca lhes seja concedido o mesmo nível de controle que os plugins, podemos fornecer alguns hooks predefinidos para os temas manipularem.

Apresentando: modificadores de tema :partying_face:

Eles são especificados usando a chave modifiers no arquivo about.json do seu tema.

Para uma lista 100% atualizada de modificadores, consulte o esquema do banco de dados na parte inferior de theme_modifier_set.rb, mas aqui está um resumo rápido do que temos até agora:

  • serialize_topic_excerpts booleano (padrão falso) - sempre incluir excertos ao serializar listas de tópicos

  • csp_extensions array de strings - adiciona diretivas ao CSP. Funciona da mesma forma que o método antigo de configuração de tema “extend_content_security_policy”. Mas lembre-se, tags simples de \u003cscript src=\"\"\u003e são permitidas automaticamente.

  • svg_icons array de strings - uma lista de ícones que devem ser incluídos no subconjunto de ícones

  • topic thumbnails array de dimensões - solicita resoluções adicionais no conjunto de miniaturas de tópicos. Observe que elas são geradas assincronamente, portanto, você deve usar a imagem original como fallback se o tamanho solicitado não for fornecido. Mais informações disponíveis na mensagem de commit

  • serialize_post_user_badges array de strings - uma lista de nomes de badges (que correspondem a entradas na tabela de badges) para serializar junto com os dados da postagem. Quando configurado, o sistema inclui os badges de usuário especificados com cada postagem para renderização no lado do cliente.

Um tema que faz uso intenso desses novos hooks é Topic List Thumbnails - confira o código para ver como funciona.

Modificadores dependentes de configuração

Modificadores de tema também podem ser configurados para buscar seu valor a partir de uma configuração de tema, permitindo que os operadores do site substituam o comportamento do modificador sem editar o código do tema. Para fazer um modificador depender de uma configuração, use esta sintaxe em seu about.json:

{
  "modifiers": {
    "modifier_name": {
      "type": "setting",
      "value": "setting_name"
    }
  }
}

Por exemplo, se você tiver uma configuração de tema chamada show_excerpts e quiser que ela controle o modificador serialize_topic_excerpts:

Em settings.yml:

show_excerpts:
  default: false

Em about.json:

{
  "modifiers": {
    "serialize_topic_excerpts": {
      "type": "setting",
      "value": "show_excerpts"
    }
  }
}

Quando a configuração show_excerpts for alterada, o valor do modificador será atualizado automaticamente para corresponder. Isso fornece flexibilidade para que os operadores do site personalizem o comportamento do tema por meio da interface de administração.


Este documento é controlado por versão - sugira alterações no github.

35 curtidas

David, provavelmente é um pouco preguiçoso da minha parte perguntar, mas existe alguma maneira de acessar isso em um plugin:

Temas podem solicitar tamanhos adicionais de miniaturas usando um modificador em seu arquivo about.json:

Vou tentar migrar o plugin TLP para este novo esquema e seria bom ter o mesmo acesso a recursos a partir de um plugin, pelo menos por enquanto.

2 curtidas

No momento não há, mas vou verificar isso :eyes:

6 curtidas

David, qual é a abordagem correta para a recriação em BULK de miniaturas?

Acabei de tentar usar em um dos meus sites e parece que processou cerca de 10% dos Tópicos… depois desistiu (ou fez cara feia para o resto). Acredito que foi o primeiro caso porque os Tópicos para os quais as miniaturas foram geradas foram os 10% mais recentes.

Reassar posts não parece resolver. Na verdade, executei uma reassagem em massa e me pergunto se isso pode tê-lo atrapalhado…

Notei que o image_url pode ser preenchido, mas não há miniaturas.

Qualquer orientação será muito bem-vinda!

1 curtida

Essa coluna não faz nada e será removida em breve. image_upload_id é o que você precisa.

Não deve haver necessidade disso. Eu projetei intencionalmente para que as pessoas possam instalar novos temas sem precisar mexer no console. As miniaturas são geradas de forma assíncrona quando necessárias. Por exemplo:

  • você adiciona um novo tema, que solicita novas resoluções
  • um usuário solicita um tópico, e nós servimos as miniaturas que existem. Se algum tamanho não existir, agendamos um job do Sidekiq.
  • na próxima vez que alguém solicitar o tópico, as miniaturas corretas já existirão

Se o tamanho da miniatura solicitada for maior que o original, não nos preocuparemos em gerar a miniatura.

Portanto, o ponto crítico a ter em mente para que isso funcione é:

Há um exemplo dessa lógica de fallback no componente de tema de miniatura que criei — fique à vontade para pegar a lógica de lá.

5 curtidas

O fallback é serializado como thumbnailsl[0]? Sim, já estou lidando com isso. (ótima implementação, aliás, muito fácil de tratar)

É possível que algumas imagens não estejam “atendendo aos requisitos” ou não se encaixem nos critérios?

O comportamento que temos no plugin TLP captura miniaturas de one-box. Isso não está acontecendo em todos os casos aqui, acho.

Por exemplo, se você tiver tempo, dê uma olhada nestes exemplos:

Acho que essas miniaturas não passam no critério. As miniaturas estão serializadas como null

Sim, isso é intencional — recebemos várias solicitações para remover as miniaturas pequenas de onebox. Por exemplo, as pessoas acabavam tendo sua avatar do GitHub como miniatura de tópico, o que raramente é intencional.

Observe que, para oneboxes onde a imagem é o conteúdo real (como fotos do Instagram/Twitter/etc), elas serão selecionadas.

Quanto ao vídeo do YouTube, corrigi isso ontem.

5 curtidas

Ah, ótimo, obrigado pela confirmação.

Isso é estranho, a build era mais recente, mas alguns ainda parecem estar sendo ignorados.

É, isso é parcialmente o motivo pelo qual acabei implementando um seletor de miniatura para situações em que a escolha automatizada não era ideal. Ainda posso querer modificar esse comportamento, mas tentarei fazer isso no plugin.

Obrigado pelo seu tempo, David!

2 curtidas

OK, eu consegui resolver. Depois de uma sessão de depuração (byebug) um pouco infrutífera, não consegui entender por que as postagens antigas do YT não estavam recebendo miniaturas.

Então me ocorreu. É por causa disso:

Então sugiro que, na verdade, possa ser necessário reprocessar (rebake) após definir isso para um número bem maior (365?).

Acho que estou correto ao dizer que, se algo não for carregado localmente, ele não terá uma miniatura criada? …

4 curtidas

:+1: correto, isso só funciona para uploads locais… talvez precisemos repensar essa configuração de “dias máximos de antiguidade” :thinking:

8 curtidas

Tenho um plano e vou tentar implementá-lo esta semana. Uma pergunta: você precisa que os valores sejam dinâmicos?

Ou seja, as resoluções serão definidas na inicialização? Ou em tempo de execução (por exemplo, via configurações do site)?

A primeira opção é mais fácil… mas a segunda também pode ser possível :thinking:

2 curtidas

Obrigado por dar uma olhada.

Preciso apenas de uma solução fixa, exatamente como o componente de tema.

Uma configuração do site seria legal, embora.

Vou adicionar para total transparência: gostaria de migrar para fora do plugin, então paridade com a solução do componente de tema seria mais do que suficiente.

2 curtidas

@merefield aqui está:

Espero que a mensagem do commit explique como funciona, mas me avise se tiver alguma dúvida.

7 curtidas

Excelente. Acabei de adicionar ao TLP e parece que está funcionando! Obrigado pela ajuda!

4 curtidas

4 posts foram movidos para um novo tópico: Obtendo miniaturas de endpoints JSON

Podemos fazer isso funcionar também para imagens de servidores remotos? Por exemplo, imagens do Blogger, Picasa ou Amazon S3?

Como o Discourse suporta hospedagem no Amazon S3 para sites com muitas e grandes imagens, agora, se tudo precisar ser hospedado diretamente no servidor local, essa metodologia de design parece ser uma desvantagem.

Com essa atualização, não é uma correção fácil para o meu site, já que estamos usando outro servidor para hospedar as imagens. Agora é muito difícil migrar para um servidor afiliado com muitas postagens, ao mesmo tempo em que o volume é grande demais para hospedar no servidor local.

Isso foi projetado apenas para funcionar com os ‘uploads’ do Discourse. Eles podem estar no S3 ou em algum outro serviço, se você usar

Recomendamos usar a configuração do site download_remote_images para baixar automaticamente imagens que são vinculadas diretamente de outros sites.

4 curtidas

Olá, David, há algo especial que precise ser feito para garantir que os ícones Pro possam ser usados em um TC?

1 curtida

Nada especial, não. Deve funcionar da mesma forma que usar ícones Pro em outros lugares do Discourse. Acredito que você esteja usando este plugin para ativar os ícones Pro?

Se não funcionar, me avise e eu darei uma olhada :eyes:

2 curtidas

Sim, somos. Vamos tentar de novo. Obrigado pela resposta no fim da sua noite!

2 curtidas