Añadir código en prestashop y que no se sobre-escriba al actualizar (override)

Es un caso muy típico que se nos puede dar. Es sencillo pero tiene algunas peculiaridades que se nos pueden pasar y nos volvemos locos dándole vueltas de porqué no funciona. Lo explicaré lo más sencillo posible con un ejemplo.

Resulta que quiero modifica el código del formulario de datos personales de un cliente. Por ejemplo que cuando alguien cambie su contraseña le añada a su nombre de usuario un número 2 (es una tontería pero sirve como ejemplo).

Lo típico sería ir al .tpl de este formulario y allí vemos las funciones a las que llama. Buscamos la que nos interesa. En nuestro caso la función está dentro de la carpeta clases, aunque podría andar por otro sitio por ejemplo si es un modulo de un plugin u otra cosa.

La clase en concreto se llama “Customer.php” . La descargo y dentro de la clase localizo una función que se llama “update” y que es la que está actualizando esos datos del formulario.

Vale. Ya tengo toda la info necesaria. Ahora al lío.

Creo un archivo nuevo que llamaré exactamente igual que la clase (también con mayúsculas o minúsculas igual). En este caso Customer.php y la guardo dentro de la carpeta override/classes

Que contiene este archivo ¿?

 
 
class Customer extends CustomerCore { /*aquí creo una clase que extiende de la de CustomerCore (que es la original del archivo original de customer.php, atención porque aquí el nombre es importante, si a la clase llamara customer sin la primera en mayúscula no funcionaría)*/
 
 public function update($nullValues = false) /* Y ahora el resto igual, copio la función que me interesaba y la pongo tal cual, y a partir de aquí le modifico las cosas que quiera para que difiera de la principal. En mi caso sería coger el nombre de usuario y añadirle un 2 */
    {
 
 
$this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days);
 
        if ($this->newsletter && !Validate::isDate($this->newsletter_date_add)) {
            $this->newsletter_date_add = date('Y-m-d H:i:s');
        }
        if (isset(Context::getContext()->controller) && Context::getContext()->controller->controller_type == 'admin') {
            $this->updateGroup($this->groupBox);
        }
 
        if ($this->deleted) {
            $addresses = $this->getAddresses((int)Configuration::get('PS_LANG_DEFAULT'));
            foreach ($addresses as $address) {
                $obj = new Address((int)$address['id_address']);
                $obj->delete();
            }
        }
 
        return parent::update(true);
 
 
}
}

Y ahora una última cosa. Borrar la caché. vamos a /cache y eliminamos el archivo class_index.php

Add Comment

Required fields are marked *. Your email address will not be published.