Applying a patch

Como seguramente te habrá pasado en más de una ocasión, sobre todo si instalas módulos no validados por el equipo oficial, habrás sufrido con la temida «pantalla blanca» en tu página Drupal o errores que no te echan abajo el sitio entero, pero que no te dejan hacer uso de una funcionalidad. Esto ocurre cuando tienes módulos del estilo:

Pues bien, para todo esto existe una inmensa comunidad de filántropos, friquis y excepcionales programadores que dan solución a todas estas «issues». Esta gente, antes de que se saque la actualización oficial del módulo o del propio Core, porque Drupal también peta, generan unos parches para dar una solución provisional a todos estos fallos.

Existen dos maneras de aplicarlos, y son:

  1. Automáticamente. El recomendado, pero ello requiere tener el git instalado y acceso a la línea de comandos donde se encuentre instalado el sitio web Drupal.
  2. Manualmente. El tedioso, pero el que no te deja más remedio si lo anterior no funciona o no es accesible.

Veamos cómo aplicar el parche en ambos casos.

Automáticamente

Los ficheros que contienen un parche tienen la extensión «.patch». Lo que tenemos que hacer es descargar el fichero en cuestión y, en el raíz del sitio Drupal, teclear el siguiente comando GIT.

git apply -v (patchname.patch)

Y ya está, no se necesita nada más que reconstruir el caché y voilà.

Manualmente

Cuando lo anterior no se puede, toca remangarse la camisa y hacerlo a mano. Para ello es importante entender el contenido de un parche. Voy a poner de ejemplo un simple parche para evitar suicidios colectivos.

diff --git a/elementor_drupal/do-actions-functions.php b/elementor_drupal/do-actions-functions.php
index 8c079bb..db8786f 100644
--- a/elementor_drupal/do-actions-functions.php
+++ b/elementor_drupal/do-actions-functions.php
@@ -28,7 +28,7 @@ function do_action_elementor_adapter($tag, $args = [])
         $all_args[] = func_get_arg($a);
     }
-    if ($enqueued_actions[$tag]) {
+    if (isset($enqueued_actions[$tag])) {
         foreach ($enqueued_actions[$tag] as $the_) {
             $num_args = count($all_args); 
@@ -43,8 +43,13 @@ function do_action_elementor_adapter($tag, $args = [])
             }
         }
     }
- 
-    return $value ? $value : $all_args[0];
+    if(isset($value)){
+        return $value ? $value : $all_args[0];
+    }
+    else{
+        $value = '';
+    }
 }

 function do_ajax_elementor_adapter($tag, $args = []) 

En líneas generales un parche es el resultado de aplicar un «diff» en GIT. Lo que hace esta funcionalidad es indicar qué se quita del código, marcándolo con un signo «-«; y qué se añade, marcándolo con un signo «+».

En el anterior parche que es para un error detectado en el módulo de Elementor, se indica lo siguiente:

Línea 1: Fichero, y ruta, donde se aplicarán las modificaciones (do-actions-functions.php)

Línea 5: Indica el contexto donde se encuentran los cambios a realizar. En este caso será dentro de la función do_action_elementor_adapter. Fíjate que el parche contextualiza el código previo y posterior, para que te situes y no existan mal interpretaciones.

Línea 8: Indica qué debe quitarse del código. Yo recomiendo comentar estas líneas, ya que si hay algún error la hemos liado. Otra opción es también hacer una copia de seguridad del fichero que vamos a modificar. Todo lo que sea conveniente y no nos veamos con el c… al aire jejeje

Línea 9: Indica qué codigo hay que añadir en sustitución al anterior.

Realmente, la aplicación de un parche es sencillo, en este ejemplo es fácil porque son pocos cambios y muy bien localizados. He visto parches enormes que se aplican en varios ficheros y ahí te acuerdas de varias familias, pero es lo que hay.

Yo lo que hago, si no tengo acceso a la línea de comandos en el servidor es tener una copia en local y aplicar ahí los cambios. Si y solo sí me veo en situaciones en los que los parches son infumables.

Espero que te haya servido de ayuda como lo ha sido conmigo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.