Override de controlador en Prestashop

osfran

Aprendiz de Prestashop
Saludos comunidad, he leído que haciendo un override a un controlador no pierdo algunas personalización que he aplicado.

Ya he probado y aún no me carga el override, he borrado el "cache/class_index.php". Tengo la versión 1.6, pero me surge una duda, si por ejemplo tengo este controlador con sus múltiples funciones:

PHP:
class CartControllerCore extends FrontController
{
    public $php_self = 'cart';

    protected $id_product;
    protected $id_product_attribute;
    protected $id_address_delivery;
    protected $customization_id;
    protected $qty;
    public $ssl = true;

protected function processChangeProductAddressDelivery()
    {
        if (!Configuration::get('PS_ALLOW_MULTISHIPPING')) {
            return;
        }

        $old_id_address_delivery = (int)Tools::getValue('old_id_address_delivery');
        $new_id_address_delivery = (int)Tools::getValue('new_id_address_delivery');

        if (!count(Carrier::getAvailableCarrierList(new Product($this->id_product), null, $new_id_address_delivery))) {
            $this->ajaxDie(Tools::jsonEncode(array(
                'hasErrors' => true,
                'error' => Tools::displayError('It is not possible to deliver this product to the selected address.', false),
            )));
        }

        $this->context->cart->setProductAddressDelivery(
            $this->id_product,
            $this->id_product_attribute,
            $old_id_address_delivery,
            $new_id_address_delivery);
    }
... aquí van las otras chorreras de funciones que tiene dicho controlador..
}
Ahora si yo solo quiero editar la función del ejemplo (agregar o borrar líneas de código de una función), debo escribir algo como esto?

PHP:
class CartControllerCore extends FrontController
{
    public $php_self = 'cart';
    protected $id_product;
    protected $id_product_attribute;
    protected $id_address_delivery;
    protected $customization_id;
    protected $qty;
    public $ssl = true;

protected function processChangeProductAddressDelivery()
    {
        if (!Configuration::get('PS_ALLOW_MULTISHIPPING')) {
            return;
        }

        $old_id_address_delivery = (int)Tools::getValue('old_id_address_delivery');
        $new_id_address_delivery = (int)Tools::getValue('new_id_address_delivery');

        if (!count(Carrier::getAvailableCarrierList(new Product($this->id_product), null, $new_id_address_delivery))) {
            $this->ajaxDie(Tools::jsonEncode(array(
                'hasErrors' => true,
                'error' => Tools::displayError('It is not possible to deliver this product to the selected address.', false),
            )));
        }
      
       {{{{{{{ LINEAS AGREGADAS AQUI }}}}}

        $this->context->cart->setProductAddressDelivery(
            $this->id_product,
            $this->id_product_attribute,
            $old_id_address_delivery,
            $new_id_address_delivery);
    }
... aquí van las otras chorreras de funciones que tiene dicho controlador..
}
Osea cuales son mis dudas?
1.- En el override de mi controlador, debo colocar los atributos nuevamente?
2.- Debo colocar toda la función tal cual con la modificación (líneas agregadas o borradas)?
2.- Sólo debo colocar la función que modifiqué o también las de más funciones que quedaron sin modificaciones?

Saludos y espero puedan orientarme.
 

joseantgv

Aprendiz de Prestashop
Seria mejor así:
PHP:
class CartController extends CartControllerCore
{
    protected function processChangeProductAddressDelivery()
    {
        if (!Configuration::get('PS_ALLOW_MULTISHIPPING')) {
            return;
        }

        $old_id_address_delivery = (int)Tools::getValue('old_id_address_delivery');
        $new_id_address_delivery = (int)Tools::getValue('new_id_address_delivery');

        if (!count(Carrier::getAvailableCarrierList(new Product($this->id_product), null, $new_id_address_delivery))) {
            $this->ajaxDie(Tools::jsonEncode(array(
                'hasErrors' => true,
                'error' => Tools::displayError('It is not possible to deliver this product to the selected address.', false),
            )));
        }
      
       {{{{{{{ LINEAS AGREGADAS AQUI }}}}}

        $this->context->cart->setProductAddressDelivery(
            $this->id_product,
            $this->id_product_attribute,
            $old_id_address_delivery,
            $new_id_address_delivery);
    }
}
Y sólo tienes que copiar la función que modifiques, el resto las cogerá de la original.
 

joseantgv

Aprendiz de Prestashop
Vaya, veo que no puedo editar mi post!! Te contesto a tus preguntas, que no las había visto:

Osea cuales son mis dudas?
1.- En el override de mi controlador, debo colocar los atributos nuevamente?
No si no los modificas.

2.- Debo colocar toda la función tal cual con la modificación (líneas agregadas o borradas)?
Pues depende. Si tu modificación va al principio o al final puedes utilizar:
PHP:
parent::processChangeProductAddressDelivery()
Esto ejecutará la función del padre.

Si tu modificación va en medio, tendrás que copiar todas las líneas y añadir tu modificación.

3.- Sólo debo colocar la función que modifiqué o también las de más funciones que quedaron sin modificaciones?
Sólo las que modifiques
 

osfran

Aprendiz de Prestashop
Muchas gracias @joseantgv, muy clara tu respuesta. Ahora otra duda que me surge, esta es la declaración del contralor original

PHP:
class CartControllerCore extends FrontController{
En la declaración de mi override sería algo así?

PHP:
class NombreQueYoQuiera extends NombreClasseOriginalOverride{
No se si me explico bien...

Saludos.
 
Arriba