Hero

Problemas con image styles después de actualizar a Drupal 7.20 o superior

Marzo 19, 2013

enzo
Drupal

Luego de actualizar Drupal a la versión 7.20 o superior es muy probable que tus módulos personalizados o contribuidos ya no presenten o generen los distintos Image Styles creados en el sitio, eso se debe a que en esa versión se introdujo el concepto de IMAGE_DERIVATIVE_TOKEN, el cual valida si una solicitud de acceso o generación de un Image Style se hace sobre una imagen que realmente exista en el sistema puede leer mas en detalle sobre este problema en las notas del release 7.20.

Para solucionar este problema tenemos dos soluciones.

  1. Solución poco elegante.

Existe una variable llamada image_allow_insecure_derivatives, si configuramos esta variable en TRUE nuestros sistema ignorara el chequeo y permitirá el uso de imágenes derivadas inseguras, esta solución no es recomendable, pero nos puede funcionar mientras lo hacemos de la forma correcta. Si contamos con drush podemos habilitar la solución poco elegante como se muestra a continuación.

drush vset image_allow_insecure_derivatives TRUE
  1. Solución elegante.

La solución elegante y definitiva seria hacer uso de las nuevas funciones que validan las imágenes y generan un token.

Imaginemos que tenemos una función de tema la cual en su preprocess crea una variable llamada $url, entonces agregaremos el token a esta URL como se puede apreciar a continuación.

if (function_exists('image_style_path_token')) {
 $token_query = array(IMAGE_DERIVATIVE_TOKEN => image_style_path_token($vars['style_name'], $vars['file']->uri));
 $vars['url'] .= (strpos($vars['url'], '?') !== FALSE ? '&' : '?') . drupal_http_build_query($token_query);
 }

Como se puede apreciar primero validamos si la función image_style_path_token esta disponible y hacemos uso de ella para agregar a nuestra URL ya sea como primer parámetro o como parámetro adicional el token que validara que la imagen original existe y cumpliendo con los nuevos criterios de seguridad en versiones superiores a Drupal 7.20.

Lo anterior crearía una URL similar a : ../assets/styles/image_184x104/public/table_with_pagination.png?itok=ClWDyG0V y si quitamos la porción de la URL ?itok=ClWDyG0V o proporcionamos un token arbitrario el sistema nos retornara un access denied a la imagen solicitada.

Espero que eso les ayude a actualizar sus módulos personalizados y/o les ayude a crear parches para módulos contribuidos.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.