Jump to content

[Solucionado] Override ModuleFrontController no funciona


Eusebio100

Recommended Posts

Hola, estoy intentando hacer un override en override/classes/controller/ModuleFrontController.php pero no me funciona, sin embargo si realizo la misma modificación directamente en classes/controller/ModuleFrontController.php sí que funciona perfectamente. Por supuesto que siempre borro el class_index.php en todos los casos, pero en override no funciona.

El override de marras es este:

<?php
class ModuleFrontController extends ModuleFrontControllerCore
{
	public function initContent()
    {
        if (Tools::isSubmit('module') && Tools::getValue('controller') == 'payment') {
            $currency = Currency::getCurrency((int)$this->context->cart->id_currency);
            $orderTotal = $this->context->cart->getOrderTotal();
            $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency);
            if ($this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) < ($minimal_purchase - 1)) {
                Tools::redirect('index.php?controller=order&step=1');
            }
        }
        parent::initContent();
    }
}

Alguien sabría decirme por que no funciona?

Gracias de antemano.

Edited by Eusebio100 (see edit history)
Link to comment
Share on other sites

No entiendo mucho del tema, pero le he dado unas vueltas y parece que la clase modulefrontcontroller ya viene extendida desde los módulos, por lo que parece que desde los módulos no se busca el override de la mencionada clase.

Me gustaría que alguien que domine el tema me confirme si esto es así y si realmente no se puede hacer override de la clase modulefrontcontroller y que las modificaciones tengan efecto.

Link to comment
Share on other sites

hace 11 minutos, joseantgv dijo:

Has puesto una traza al principio de la función para comprobar que no entra?

A que te refieres? no entiendo bien.

Esta función afecta a algunos módulos, y lo que he comprobado es que el módulo bankwire la coge perfectamente si modifico el archivo classes/controllers/ModuleFrontController.php, pero si dejo el archivo original y meto en override/classes/controllers el archivo que he puesto en el primer post no funciona el módulo (quiero decir que no coge la modificación).

Edited by Eusebio100 (see edit history)
Link to comment
Share on other sites

22 hours ago, Eusebio100 said:

A que te refieres? no entiendo bien.

Esta función afecta a algunos módulos, y lo que he comprobado es que el módulo bankwire la coge perfectamente si modifico el archivo classes/controllers/ModuleFrontController.php, pero si dejo el archivo original y meto en override/classes/controllers el archivo que he puesto en el primer post no funciona el módulo (quiero decir que no coge la modificación).

Me refiero que pongas esto a ver si se para:

 

<?php
class ModuleFrontController extends ModuleFrontControllerCore
{
    public function initContent()
    {
        var_dump('Override');
        die();

        if (Tools::isSubmit('module') && Tools::getValue('controller') == 'payment') {
            $currency = Currency::getCurrency((int)$this->context->cart->id_currency);
            $orderTotal = $this->context->cart->getOrderTotal();
            $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency);
            if ($this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) < ($minimal_purchase - 1)) {
                Tools::redirect('index.php?controller=order&step=1');
            }
        }
        parent::initContent();
    }
}

 

  • Like 1
Link to comment
Share on other sites

hace 39 minutos, joseantgv dijo:

Me refiero que pongas esto a ver si se para:

Lo acabo de probar y sí que se para, por lo que entiendo que el override lo lee, sin embargo si quito la "traza" hace caso omiso y carga la función del archivo original en classes/controller. Parece como que lee el override pero después vuelve al archivo original y carga los valores de allí. 

Link to comment
Share on other sites

hace 1 hora, joseantgv dijo:

Me refiero que pongas esto a ver si se para:

 


<?php
class ModuleFrontController extends ModuleFrontControllerCore
{
    public function initContent()
    {
        var_dump('Override');
        die();

        if (Tools::isSubmit('module') && Tools::getValue('controller') == 'payment') {
            $currency = Currency::getCurrency((int)$this->context->cart->id_currency);
            $orderTotal = $this->context->cart->getOrderTotal();
            $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency);
            if ($this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) < ($minimal_purchase - 1)) {
                Tools::redirect('index.php?controller=order&step=1');
            }
        }
        parent::initContent();
    }
}

 

Me acabo de dar cuenta que el problema está en la línea parent::initContent(); parent hace que se ejecute el código principal, por lo que vuelve de nuevo al código padre en classes/controller.

He probado eliminando la línea parent::initContent(); y efectivamente funciona el override; ahora la duda que tengo es... ¿si en el código padre está el parent::initContent(); me puede afectar en algo el eliminarla?

Link to comment
Share on other sites

3 hours ago, Eusebio100 said:

Me acabo de dar cuenta que el problema está en la línea parent::initContent(); parent hace que se ejecute el código principal, por lo que vuelve de nuevo al código padre en classes/controller.

He probado eliminando la línea parent::initContent(); y efectivamente funciona el override; ahora la duda que tengo es... ¿si en el código padre está el parent::initContent(); me puede afectar en algo el eliminarla?

Hay que entender como funciona los overrides (herencia) para saber cuando hay que utilizar el parent.

Cuando sobreescribes una función lo que haces es que ejecute la tuya en vez de la original. Entonces depende de cada caso te interesará que se ejecute la función padre o no. En tu caso no te interesa que se ejecute la función initContent() de la clase padre ModuleFrontControllerCore, pero sí que te interesa ejecutar la función initContent() de la clase padre del padre, o sea, la clase padre de ModuleFrontControllerCore, que es FrontController, por lo que tendrías que poner:

<?php
class ModuleFrontController extends ModuleFrontControllerCore
{
    public function initContent()
    {
        if (Tools::isSubmit('module') && Tools::getValue('controller') == 'payment') {
            $currency = Currency::getCurrency((int)$this->context->cart->id_currency);
            $orderTotal = $this->context->cart->getOrderTotal();
            $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency);
            if ($this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) < ($minimal_purchase - 1)) {
                Tools::redirect('index.php?controller=order&step=1');
            }
        }
        
        FrontController::initContent();
    }
}

Es decir, la función initContent() de la clase ModuleFrontControllerCore ejecuta una líneas de código y llama a initContent() de la clase FrontController.

En tu caso la función initContent() de la clase ModuleFrontController ejecuta unas líneas de código, no necesitas ejecutar la función initContent() de la clase ModuleFrontControllerCore, y luego llamas a initContent() de la clase FrontController.

Edited by joseantgv (see edit history)
Link to comment
Share on other sites

hace 1 hora, joseantgv dijo:

Hay que entender como funciona los overrides (herencia) para saber cuando hay que utilizar el parent.

Millón de gracias por la explicación!!!

Se nota que no soy informático y llego hasta donde llego. Me acabas de solucionar un problema y creo que otros similares que tengo guardados en el cajón. Te debo una birra.

  • Like 1
Link to comment
Share on other sites

24 minutes ago, Eusebio100 said:

Millón de gracias por la explicación!!!

Se nota que no soy informático y llego hasta donde llego. Me acabas de solucionar un problema y creo que otros similares que tengo guardados en el cajón. Te debo una birra.

Por eso es importante aclarar primero si se está ejecutando la función para descartar que sea un problema con el override, y luego ver si es un problema con el código en si.

Link to comment
Share on other sites

  • 5 years later...
On 12/11/2018 at 2:12 PM, joseantgv said:

Por eso es importante aclarar primero si se está ejecutando la función para descartar que sea un problema con el override, y luego ver si es un problema con el código en si.

Y en el caso de que no lo lea? yo he probado el die() en mi función del override y no la para, puedes echarme una mano para entender porque no me lee el override? mi problema está detallado en este hilo:
https://www.prestashop.com/forums/topic/1087194-crear-variables-globales-para-las-tpl/

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...