Override en Prestashop

Cuando estamos trabajando o desarrollando utilizando Prestashop en muchos casos nos vemos en la necesidad de editar alguna clase o controlador para añadir o modificar alguna funcionalidad.

Lo podríamos hacer directamente editando estos archivos que están en sus carpetas respectivas («controllers» y «classes»), pero no es nada aconsejable por el simple hecho de que si realizamos una actualización del Prestashop a una nueva versión, posiblemente se perderían estos cambios y con ello la funcionalidad.

Para poder sobreescribir estos controladores y clases Prestashop dispone de una carpeta en raiz del proyecto. Se llama «Override». Dentro de ella tendremos dos directorios («controllers» y «classes»).

Si queremos añadir alguna funcionalidad a alguna clase específica deberemos crear un nuevo archivo que lleve dentro una clase que extienda de la original.

Por ejemplo si queremos añadir una nueva función a la clase «Cart» deberemos crear un nuevo archivo «Cart.php» dentro de «override/classes» que contenga lo siguiente:

<?php
class Cart extends CartCore {
    public function getProducts($refresh = false, $id_product = false) {
        //Aquí tu código    
    }
}
?>

Creamos una clase que extiende de CartCore en la cual editamos la función que retorna los productos que hay en la cesta.

La misma idea para los controladores:

<?php
class CategoryController extends CategoryControllerCore {
    public function process() {
        parent::process();

        self::$smarty->assign('HOOK_CATEGORY', Module::hookExec('category'));
    }
}
?>

Estamos editando la función process() de la clase CategoryControllerCore.

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(9 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

17 respuestas a “Override en Prestashop”

  1. Emili Bellot Pulido dice:

    Hola gente, en mi caso lo que quiero hacer es un override para vender por metros en lugar de por unidades, y la idea es que el cliente pueda ir seleccionando la cantidad de metros que quiere con un numero decimal, por ejemplo, compra minima 0,3 metros, y a partir de alli el cliente va subiendo de 0,05 en 0,05. Logicamente para ello tendre que tocar el tipo de variable de stock y la cantidad minima de la clase producto, asi como qualquier funcion que use estas variables. ¿Voy bien encaminado? Una vez haya hecho esto, mi pregunta es, ¿Debo crear una nueva tabla para la DataBase o con el override ya se genera la base de datos tal y como yo quiero?

    Gracias de antemano.
    Emili

  2. Oncle dice:

    Hola, estoy intentando crear un override del cartcontroller.php pero no termina de funcionar. El código que pongo al principio es este, y lo que modifico está en medio del archivo original:

    class CartController extends CartControllerCore
    {
    public function getProducts($refresh = false, $id_product = false, $id_country = null)

    /** y aquí va el texto completo del archivo original (con la modificación), o solo la modificación? *//

    Gracias por sacarme de dudas.

    • Jose Aguilar dice:

      Hola,

      Para que se apliquen los cambios quizá tan solo tienes que limpiar la caché de la tienda y eliminar las carpetas:

      /var/cache/dev/
      var/cache/prod/

      Para que se regeneren considerando la sobrescritura.

      Saludos

  3. Pier dice:

    Gracias por la respuesta Aguilar.

  4. Pier dice:

    Hola Aguilar, gracias por el post me gustaria preguntarte si es necesario hacer un override en el caso que estoy modificando algo de html y moviendo de posicion algun codigo de el order-confirmatio.tpl , payment_return.tpl , ps_wirepayment_intro.tpl , payment_infos.tpl estoy agregando algo de html algo de css en algunas etiquetas , estoy haciendo todo esto para darle una mejor apariencia y mejor usabilidad de la pagina de confirmacion de pedido.Me gustaria saber si me puedes decir tu recomendacion que seria lo correcto con estas modificaciones .
    Gracias un saludo

    • Jose Aguilar dice:

      Hola,

      Para las plantillas no se requiere hacer Override como se explica en este tutorial. Para los archivos tpl lo ideal es que te los lleves a la plantilla activa y los modifiques allí (tanto los tpls de los módulos como de la plantilla en sí).

      Saludos

  5. Hola, llevo utilizando prestashop bastante tiempo y haciendo override tanto de los controladores como de los módulos sin ningún problema, sin embargo me he «topado» con un par de controladores que no hay forma de hacer una anulación y que funcione. Estos controladores son OrderController.php (en controller/front) y ModuleFrontController.php (en classes/controller/). En cualquiera de estos archivos si hago la modificación en el archivo original en su ruta original funciona perfectamente, pero si lo paso a override no funcionan, no coge los cambios. Lógicamente siempre borro el class_index.
    Agradecería cualquier ayuda para hacer estas anulaciones, si es que se pueden hacer, que yo ya lo dudo.

    • Jose Aguilar dice:

      Hola,

      Gracias por su mensaje.

      Precisamente nunca he tenido que sobrescribir los controladores que mencionas. El más parecido que me ha tocado sobrescribir ha sido el controllers/front/OrderDetailController.php y no tuve ningún problema.

      Dependiendo de la versión que estés utilizando quizá pueda haber algún tipo de problema para sobrescribir esos controladores. En PrestaShop 1.7 se han encargado de agregar más ganchos o hooks para evitar la sobrescritura que suele ser un inconveniente típico para mantener la tienda o actualizar en un futuro.

      Saludos

  6. Mariano dice:

    Hola, te hago una consulta hice un overrive de StockAvailable para editar la función getQuantityAvailableByProduct. En mi caso anulo el código que existe y me conecto a un webService externo y retorno un stock real. Esto lo he logrado sin problemas y lo veo reflejado en el producto. Lo único q una vez q realizo el cambio en FrontEnd ficha al hacer un click sobre el agregar al carro o add to cart. No se ejecuta nada. Usted me podría decir q es lo q se ejecuta al momento de hacer el click sobre ese botón como para buscar que es lo q pasa ?

    • Jose Aguilar dice:

      Hola buenos días,

      Las tablas que usa PrestaShop para guardar el stock de los productos es la ps_stock_available. Personalmente yo lo que haría es actualizar esta tabla con el stock real.

      Para actualizar la información en la tienda, deberás jugar con las funciones:

      StockAvailable::setQuantity()
      o
      StockAvailable::updateQuantity()

      Saludos

  7. […] una mejora de rendimiento en nuestros desarrollos de Prestashop, ya sea en el propio core mediante overrides , o en nuestros […]

  8. Isaac dice:

    Hola Jose,

    Estoy realizando un módulo de Prestashop y me gustaría que desde el front office de este módulo, otorgar al dependiente el poder realizar una compra en nombre de un cliente sin necesidad de acceder alf back office.

    Qué clases de las que tiene Prestashop tengo que utilizar, esto es, incluir los productos que he seleccionado y enviarlos a un script propio que los recoja, cree un carrito con esos productos, loguee al usuario y confirme la compra, pero sin transportista ni direcciones ya que sería la compra en una tienda física.

    Gracias de antemano.

  9. golfovi dice:

    Hola, muy interesante. Resulta que he hecho un módulo que añade una tabla a la base de datos y me gustaría que cuando el cliente compre algún producto, se añada a esa tabla los datos del producto y del cliente, lo hago para aprender, en realidad no tiene mucho sentido porque ya hay tablas con esos datos, pero me interesa mucho, sería eso posible hacerlo desde el módulo o habría que hacer un override? Gracias de antemano

    • Jose Aguilar dice:

      Hola buenas tardes,

      Si, tu módulo podría utilizar el hook actionValidateOrder para registar los datos que te interese sobre el pedido en tu nueva tabla.

      SAludos

  10. […] leído en http://www.jose-aguilar.com ] Tags: classes, controladores, php, prestashop Puedes seguir las respuestas a este post […]

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.

Ver más sobre