Override de controlador en Prestashop

Tema en 'Desarrollo web en Prestashop' iniciado por osfran, 11/4/18.

  1. osfran

    osfran Aprendiz de Prestashop

    6
    0
    1
    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.
     
  2.  
    Comunidad Prestashop orgullosamente patrocinada por el hosting prestashop de FactoriaDigital.com con soporte en español.
  3. joseantgv

    joseantgv Aprendiz de Prestashop

    15
    0
    1
    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.
     
  4. joseantgv

    joseantgv Aprendiz de Prestashop

    15
    0
    1
    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
     
  5. osfran

    osfran Aprendiz de Prestashop

    6
    0
    1
    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.