Modificadores de tema: una breve introducción

A medida que los temas se vuelven más ambiciosos, hemos estado buscando formas de permitirles manipular el comportamiento central del lado del servidor. Si bien nunca tendrán el mismo nivel de control que los plugins, podemos proporcionar algunos hooks predefinidos para que los temas los manipulen.

Presentamos: modificadores de tema :partying_face:

Se especifican usando la clave modifiers en el archivo about.json de su tema.

Para obtener una lista 100% actualizada de modificadores, consulte el esquema de la base de datos al final de theme_modifier_set.rb, pero aquí hay un resumen rápido de lo que tenemos hasta ahora:

  • serialize_topic_excerpts booleano (predeterminado false) - incluir siempre extractos al serializar listas de temas

  • csp_extensions array de cadenas - agregar directivas a la CSP. Funciona igual que el antiguo método de configuración de tema “extend_content_security_policy”. Pero recuerde, las etiquetas \u003cscript src=\"\"\u003e simples se permiten automáticamente.

  • svg_icons array de cadenas - una lista de iconos que deben incluirse en el subconjunto de iconos

  • topic thumbnails array de dimensiones - solicitar resoluciones adicionales en el conjunto de miniaturas de temas. Tenga en cuenta que se generan de forma asíncrona, por lo que debe usar una alternativa a la imagen original si el tamaño solicitado no se proporciona. Más información disponible en el mensaje de confirmación

  • serialize_post_user_badges array de cadenas - una lista de nombres de insignias (que coinciden con las entradas en la tabla de insignias) para serializar junto con los datos de la publicación. Cuando se configura, el sistema incluye las insignias de usuario especificadas con cada publicación para la representación en el lado del cliente.

Un tema que hace un uso intensivo de estos nuevos hooks es Topic List Thumbnails consulte el código para ver cómo funciona.

Modificadores dependientes de la configuración

Los modificadores de tema también se pueden configurar para extraer su valor de una configuración del tema, lo que permite a los operadores del sitio anular el comportamiento del modificador sin editar el código del tema. Para hacer que un modificador dependa de una configuración, use esta sintaxis en su about.json:

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

Por ejemplo, si tiene una configuración de tema llamada show_excerpts y quiere que controle el modificador serialize_topic_excerpts:

En settings.yml:

show_excerpts:
  default: false

En about.json:

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

Cuando se cambia la configuración show_excerpts, el valor del modificador se actualizará automáticamente para que coincida. Esto proporciona flexibilidad para que los operadores del sitio personalicen el comportamiento del tema a través de la interfaz de administración.


Este documento está controlado por versiones: sugiera cambios en github.

35 Me gusta

David, probablemente sea un poco vago por mi parte preguntar, pero ¿hay alguna forma de acceder a esto desde un plugin:

Los temas pueden solicitar tamaños de miniatura adicionales usando un modificador en su archivo about.json:

Voy a intentar migrar el plugin TLP a este nuevo esquema y sería bueno tener el mismo acceso a las funciones desde un plugin, al menos por ahora.

2 Me gusta

Por el momento no, pero lo revisaré :eyes:

6 Me gusta

David, ¿cuál es el enfoque correcto para la recreación masiva de miniaturas?

Acabo de probarlo en uno de mis sitios y parece haber procesado alrededor del 10% de los temas… y luego se ha detenido (o ha rechazado el resto). Creo que fue lo primero porque los temas para los que se generaron miniaturas fueron los últimos 10%.

Rehacer los posts no parece ser suficiente. De hecho, ejecuté una reconstrucción masiva y me pregunto si eso lo afectó…

He notado que image_url puede estar poblado, pero no hay miniaturas.

¡Cualquier consejo será muy apreciado!

1 me gusta

Esa columna no hace nada y será eliminada muy pronto. image_upload_id es la que necesitas.

No debería ser necesario. Lo diseñé deliberadamente para que las personas puedan instalar nuevos temas sin tener que intervenir en la consola. Las miniaturas se generan de forma asíncrona cuando se necesitan. Por ejemplo:

  • agregas un nuevo tema que solicita nuevas resoluciones
  • un usuario solicita un tema, servimos las miniaturas que existen. Si faltan algunos tamaños, programamos un trabajo de Sidekiq.
  • la próxima vez que alguien solicite el tema, las miniaturas correctas ya existirán

Si el tamaño de miniatura solicitado es mayor que el original, no nos molestaremos en generar la miniatura.

Por lo tanto, lo crítico a tener en cuenta para que esto funcione es:

Hay un ejemplo de esta lógica de fallback en el componente de tema de miniaturas que creé; siéntete libre de tomar prestada la lógica de allí.

5 Me gusta

¿El fallback se serializa como thumbnailsl[0]? Sí, ya estoy manejando eso. (por cierto, buena implementación, muy fácil de gestionar)

¿Es posible que algunas imágenes no cumplan con los criterios o no se ajusten a ellos?

El comportamiento que tenemos en el plugin TLP recogerá miniaturas de one-box. Creo que eso no está ocurriendo en todos los casos aquí.

Por ejemplo, si tienes tiempo, echa un vistazo a estos ejemplos:

No creo que estas miniaturas cumplan con los requisitos. Las miniaturas se serializan como null

Sí, eso es intencional. Hemos recibido varias solicitudes para eliminar las miniaturas pequeñas de onebox. Por ejemplo, las personas terminaban con su avatar de GitHub como miniatura del tema, lo cual rara vez es lo pretendido.

Ten en cuenta que, para los oneboxes donde la imagen es el contenido real (como fotos de Instagram, Twitter, etc.), estas serán seleccionadas.

En cuanto al video de YouTube, lo corregí ayer.

5 Me gusta

¡Ah, genial, gracias por la confirmación!

Eso es extraño, la compilación era más reciente, pero aún parece que algunos se están pasando por alto.

Sí, eso es parcialmente por lo que terminé implementando un selector de miniaturas para las situaciones en las que la elección automatizada no era óptima. Quizás aún quiera modificar ese comportamiento, pero trataré de hacerlo en el plugin.

¡Gracias por tu tiempo, David!

2 Me gusta

OK, ya lo he resuelto. Después de una sesión de depuración con byebug bastante infructuosa, no pude entender por qué las publicaciones antiguas de YouTube no mostraban miniaturas.

Entonces me di cuenta. Es debido a esto:

Así que sugiero que, en realidad, podría ser necesario volver a generar las miniaturas después de establecer este valor en un número bastante mayor (¿365?).

Creo que tengo razón al decir que si algo no se sube localmente, no se generará una miniatura…

4 Me gusta

:+1: correcto, esto solo funciona para subidas locales… puede que necesitemos repensar esa configuración de “días máximos de antigüedad” :thinking:

8 Me gusta

Tengo un plan; intentaré implementarlo esta semana. Una pregunta: ¿necesitas que los valores sean dinámicos?

Es decir, ¿se definirán las resoluciones al arrancar? ¿O en tiempo de ejecución (por ejemplo, mediante la configuración del sitio)?

Lo primero es más sencillo… pero lo segundo también podría ser posible :thinking:

2 Me gusta

Gracias por echar un vistazo.

Solo necesito una solución fija, exactamente como el componente de tema.

Aunque un ajuste del sitio sería agradable.

Aclararé por transparencia: me gustaría migrar lejos del plugin, por lo que la paridad con la solución del componente de tema sería más que suficiente.

2 Me gusta

@merefield aquí tienes:

Espero que el mensaje del commit explique cómo funciona, pero avísame si tienes alguna pregunta.

7 Me gusta

Excelente. ¡Acabo de agregarlo al TLP y parece que está funcionando! ¡Gracias por tu ayuda!

4 Me gusta

4 publicaciones se dividieron en un nuevo tema: Obtener miniaturas de endpoints JSON

¿Podemos hacerlo funcionar también para imágenes de servidores remotos? Por ejemplo, imágenes de Blogger, Picasa o Amazon S3.

Dado que Discourse admite el alojamiento en Amazon S3 para sitios con imágenes grandes y de gran volumen, si ahora todo debe alojarse directamente en el servidor local, esta metodología de diseño parece ser una desventaja.

Con esta actualización, no es una solución sencilla para mi sitio, ya que estamos utilizando otro servidor para alojar las imágenes. Ahora es demasiado difícil migrar a un servidor afiliado con muchas publicaciones, y además es demasiado grande para alojarlo en el servidor local.

Esto está diseñado únicamente para funcionar con ‘uploads’ de Discourse. Estos pueden estar en S3 o en otro servicio si utilizas

Recomendamos usar la configuración del sitio download_remote_images para descargar automáticamente las imágenes que están enlazadas directamente desde otros sitios.

4 Me gusta

Hola David, ¿hay algo especial que se deba hacer para asegurar que los iconos Pro puedan usarse en un TC?

1 me gusta

Nada especial, no. Debería funcionar exactamente igual que usar iconos pro en otras partes de Discourse. Supongo que estás usando este plugin para habilitar los iconos pro, ¿verdad?

Si no funciona, házmelo saber y lo revisaré :eyes:

2 Me gusta

Sí, lo somos. Tendremos otra oportunidad. ¡Gracias por responder tan tarde en tu noche!

2 Me gusta