Este módulo no puede ser trasplantado a este hook en Prestashop (Solución)

26 abril, 2015 |

Si te gusta, compártelo ;)

Vista previa módulo no puede ser trasplantado en prestashop

Algunos módulos de Prestashop no están preparados para ser insertados en cualquier hook. Esto suponiendo que queramos insertar un módulo en un determinado hook mediante la opción "Insertar un hook".

Si intentamos trasplantar un módulo (no preparado para ello) a un determinado hook veremos esta advertencia: "Este módulo no puede ser transplantado a este hook."

Este módulo no puede ser trasplantado a este hook en Prestashop

Pues bien, veamos cómo podemos preparar un módulo para que pueda ser insertado en el hook, por ejemplo, displayLeftColumn .

Yo he utilizado para este caso el módulo blockcontactinfos, que muestra la información de la tienda. El nombre en el Back-office es "Bloque de información de contacto". Obviamente cada uno puede utilizar el que más le convenga. Así que, pongámonos a la obra y procedamos a editar el módulo blockcontactinfos.

El módulo blockcontactinfos

Vayamos a ../prestashop/modules/blockcontactinfos y abramos el archivo blockcontactinfos.php
Justo antes de la última llave de cierre debemos añadir esta función:

public function hookDisplayLeftColumn($params)
{
}

Con esto ya deberíamos poder insertar el módulo en la columna izquierda, que es la columna que vamos a elegir, aunque también podríamos insertarlo en la derecha.

Hecho esto, probemos a insertar el hook displayLeftColumn en el módulo "Bloque de información de contacto":

Añadir hook en el módulo "Bloque de información de  contacto" de Prestashop

Una vez insertado, debería aparecer un mensaje notificando que el módulo fue copiado exitosamente en el hook. Sin embargo, en nuestra tienda no veremos nada; esto es porque la función está vacía, pero, ¿cómo debemos completar la función, de donde saco el código? Muy fácil, del mismo archivo.

Solo debemos observar un poco las funciones del archivo en que nos encontramos, es decir, blockcontactinfos.php. Normalmente debe ser una función que incluya un archivo de plantilla .tpl.
Líneas como esta:

return $this->display(__FILE__, 'blockcontactinfos.tpl', $this->getCacheId());

Esta línea se encuentra en la función hookFooter, por tanto, esta función es la responsable de mostrar el contenido en nuestra tienda, así que necesitamos el contenido de esta función para incluirlo en nuestra propia función hookDisplayLeftColumn.

Seleccionemos la función hookFooter y "machaquémosla" sobre la función hookDisplayLeftColumn que habiamos creado previamente. Una vez hayamos copiado la función solo debemos cambiar el nombre a la misma, la llamaremos como antes: hookDisplayLeftColumn

De forma que quede así:

public function hookDisplayLeftColumn($params)
 {
  if (!$this->isCached('blockcontactinfos.tpl', $this->getCacheId()))
   foreach (Blockcontactinfos::$contact_fields as $field)
    $this->smarty->assign(strtolower($field), Configuration::get($field));
  return $this->display(__FILE__, 'blockcontactinfos.tpl', $this->getCacheId());
  
 }
}

Hecho esto, ya deberíamos ver el resultado en nuestra tienda. Solo deberíamos retocar un poco la columna mediante css para ajustar el ancho. Por ejemplo con un width del 100%.

Módulo no puede ser trasplantado en prestashop, resultado final
Este solo ha sido un ejemplo de cómo trasplantar un módulo a un hook "prohibido", no tiene porqué ser el del ejemplo. A veces nos puede resultar útil mover un módulo donde nos plazca, aunque el procedimiento no es siempre el mismo. Espero que el tutorial os haya servido de ayuda.

21 comentarios:

  1. Gracias por compartir tus conocimientos.

    Un saludo.

    ResponderEliminar
  2. Hola Muchas gracias, me ha sido muy útil. Pero sabes si se puede cambiar el bloque contácto, es decir donde está el formulario de contacto, cambiarlo de displayNav al Header, para que aparezca en el menú superior.
    gracias

    ResponderEliminar
    Respuestas
    1. Hola, ahora no tengo el ordenador a mano, pero no te he comprendido bien.¿Te refieres al enlace Contacto, al texto de la palabra en sí? ¿Es en la plantilla por defecto de Prestashop?

      Eliminar
    2. Hola, gracias por contestar. En realidad lo que quiero saber es, si es posible que cuando añades un nuevo enlace externo en el módulo de menú horizontal superior, funcione la propiedad css :active.

      Eliminar
    3. Hola, si es para tu página Web y (por lo que he visto), te ocurre con el enlace "contacto" puedes insertar esta regla CSS en el archivo prestashop/themes/tu-tema/css/modules/blocktopmenu/css/superfish-modified.css

      body#contact .sf-menu > li > a[title="contacto"] {color:#b8a861 !important}

      Eliminar
    4. Mil gracias... funcionaaaaaaaaaaaaaaaaaaaaaa.

      Eliminar
    5. Y la última duda, y para que funcione en blog y catálogo???

      Eliminar
  3. ya lo he arregladoooo... super contenta :) gracias

    ResponderEliminar
  4. Hola de nuevo, acabo de empezar un proyecto nuevo y es la primera vez que me pasa y no encuentro solución. Cuando intento modificar o añadir producto me sale este error:
    (500 Internal Server Error)
    Ocurrió un error en el servidor mientras se cargaban las pestañas: algunas pestañas pueden no haberse cargado.
    Por favor inténtelo de nuevo refrescando la página.
    Si sigue encontrando este problema, por favor, revise los registros (logs) de su servidor o contacte con su proveedor de hosting para asistencia.
    OK
    Trabajo en local y he vuelto a instalar el wamp y sigue saliendo... te ha pasado alguna vez.
    milgracias por tu ayuda

    ResponderEliminar
    Respuestas
    1. Hola, prueba en otra instalación de Prestashop, así descartas que sea un problema del servidor (de Wamp). Borra la caché del navegador y de la tienda, y cosas como las cookies del navegador e imágenes y datos de aplicaciones instaladas. Eso te sale en la configuración avanzada de Chrome, si lo usas. No significa que eso te vaya a funcionar, pero por si acaso.
      Lo que si tienes que descartar es que sea un problema de la tienda, por eso te digo que pruebes con otra tienda, si no la tienes instala una nueva.
      Si no te había pasado nunca es raro. Haz respaldos de la carpeta y la base de datos de vez en cuando, cuanto más a menudo mejor. Para casos como el que te ocupa ahora.

      Eliminar
    2. Hola de nuevo. Se ha solucionado lo único diferente que había hecho en esta web y en el resto no, es poner NO Comprobar automáticamente las actualizaciones de los módulos. Es lo único diferente que de normal no hacía, total que he puesto SI y ya va todo.

      Otra duda más quiero eliminar el botón del Más, pongo display:none y desaparece pero se queda un salto como si estuviera activo, u no encuentro la forma de quitar el salto. El tema es que he dejado que se vea la descripción corta dentro del producto y claro si no se desactiva del todo el botón la descripción se mueve.

      Gracias de nuevo
      https://gm1.ggpht.com/wejYsYEULPu5AKXzvm5LYWIz8ck24kCRfAERm2gYJr8ZMZfCqN_f7kE3rPQtbcY5b2GBbCHs0Xb7gY50v0q2LCq49NVKwrKJHMKIskUPQVW-6ETv_r6ZRXoTRa3RSkr1QCMjox1MA_9DQcbkrFn6Ie4qKcvhohozShPIbFqdPb0PMrK9UOy2i6EvhpJlO2KjC-jjREspOVc6IFCiQhE1Sldmc0R2dN80w7fK8ugkUjgeLEeYRS7LvGIYhJ7skM-HTuYcHSWI3JLAv7f6MN8SeSGpGZ108wPd61aPYk7ifn0HTW4-qK1bC2U-iZciAaKJet0lV6UjUYcyGj10BF7oWA5w_-Pgd9iUd7cdBKaJsKrPfmv5dvu8dPB87ty80LvRvZghvkXxqaZsn17BegSUD2t6idJ7PXdIPw2dntxXq0JDWGAxBevn1pkvbM8yJPMFZo6r7KtLMVSD77DzyvIlikRrJ1w1tujqO3uTApIl_gvEenbIZZ1o96R6Z5YWlzHMFrq6Gg5JSPTaTOQ5mutX9CO-YbVcW0Sv90qwXq7v9XkJ-5lPEabRxgdyLdRmYUATkogLhH2pz5V7e3Ahr23o3jEoKqArrEzGffgeEu5e6qzZ8PKTTyzoTq2SkZ2dq3xnWmPsLY7oKQyvCzBLbMqzgKazxUxiHzrGZcc8YF4TLuAN9e1FirjBLvp70gkqqeiXeCABvU1yxlOrpQ=w500-h448-l75-ft

      Eliminar
    3. Hola. ¿La URL que has puesto se supone que es para que vea algo? No puedo acceder, no tengo permisos.

      Eliminar
  5. Hola... si era para que vieras la foto.. pero ya veo que no va :(
    Bueno simplemente es quitar el la función js que dice más, se hacerlo con css pero como he puesto que se lea la descripción corta debajo del nombre, produce un salto como si siguiera activo pero no se ve nada.

    ResponderEliminar
    Respuestas
    1. Hola. Normalmente con la propiedad display:none desaparece x elemento y no debe permanecer activo. De todas formas busca el archivo .tpl correcto y desactiva el botón "Más" con comentarios, así: {* El contenido *}

      Seguramente debes hacerlo en el archivo product-list.tpl. O product.tpl si es la página de producto.

      Eliminar
  6. Hola pues con css se elimina el más, pero sigue saltando. Yo creo que tiene que ser más de js pero no se donde. Con tpl tampoco se va el salto. Yo creo que tiene que ser algo como en el enlace de está página. http://vblanch.com/disabling-fancybox-in-prestashop/?lang=es
    Pero lo he buscado y no se que quitar. Gracias de nuevo

    ResponderEliminar
    Respuestas
    1. Hola, si no lo veo no te puedo ayudar. Esas cosas se solucionan probando en vivo. Tú que cambio has hecho? Solo poner la descripción corta en product-list.tpl? Puedo reproducir lo que has hecho, a ver si puedo ver de qué se trata.

      Eliminar
  7. Hola, en mi caso, la forma de pago de redsys aparece en el bloque displayPaymentReturn pero no aparece en el paymentOptions, creo que es por este motivo por el que en el proceso de compra solo me aparece como opción la transferencia, (que si aparece en el hook paymentOptions). En trasladar un módulo al escoger redsys solo me da la opción de ponerlo en displayPaymentReturn y en Payment, es decir el hook que necesito ni aparece. ¿Me valdría tambien la solución que aportas? Gracias, un saludo.

    ResponderEliminar
    Respuestas
    1. Hola, prueba a ver. Si lo haces con cuidado no pierdes nada. Si es en localhost mejor.

      Eliminar