THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,
je suis actuellement en train de développer un module sur-mesure pour un site ecommerce et j'aimerais faire une redirection sur la route 'customer.home' lors de l'evenement TheliaEvents::ORDER_UPDATE_STATUS

voici le code de mes fichiers :

config.xml

<services>
        <service id="mymodule.payment.listener" class="MyModule\EventListener\PaymentListener">
            <tag name="kernel.event_subscriber"/>
        </service>
</services>

PaymentListener.php

class PaymentListener extends BaseFrontController implements EventSubscriberInterface
{

    protected $currentRouter = "router.front";

    public function updateStatus(OrderEvent $event)
    {
        $order = $event->getOrder();
        if ($order->isPaid()){
            return $this->generateRedirectFromRoute('customer.home');
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::ORDER_UPDATE_STATUS => array("updateStatus", 128),
        );
    }
}

Je me prend un erreur (qui semble logique) mais je ne sais pas comment la résoudre :

Fatal error: Uncaught Error: Call to a member function get() on null in C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php:504 Stack trace: #0 C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php(489): Thelia\Controller\BaseController->getRouter('router.front') #1 C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php(463): Thelia\Controller\BaseController->getRouteFromRouter('router.front', 'customer.home', Array, 1) #2 C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php(371): Thelia\Controller\BaseController->getRoute('customer.home', Array, 1) #3 C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php(437): Thelia\Controller\BaseController->retrieveUrlFromRouteId('customer.home', Array, Array, 1) #4 C:\wamp64\www\tda-thelia24\local\modules\MyModule\EventListener\PaymentListener.php(24): Thelia\Controller\BaseController->generateRedirectFromRoute('customer in C:\wamp64\www\tda-thelia24\vendor\thelia\core\lib\Thelia\Controller\BaseController.php on line 504

dans le fichier BaseController.php la variable $container est null donc le routing ne peut pas fonctionner

Merci par avance.

Cordialement

Offline


Un listener n'est pas un contrôleur, mais un service Symfony. Ça n'a pas vraiment se sens pour un Listener d'hériter de BaseFrontController.

Par contre, depuis un listener (ou n'importe ou) tu peux provoquer une redirection vers une URL en levant une Thelia\Core\HttpKernel\Exception\RedirectException. Exemple :

    public function updateStatus(OrderEvent $event)
    {
        $order = $event->getOrder();
        if ($order->isPaid()){
            throw new RedirectException(URL::getInstance()->absoluteUrl('/account'))
        }
    }

OpenStudio Toulouse

Offline


Merci ROADSTER31 ça fonctionne à merveille !


Cordialement.

Offline


Hello !

Chez moi j'obtiens ça :

Type error: Argument 1 passed to Thelia\Action\RedirectException::__construct() must be an instance of Thelia\Tools\URL, string given

avec ça :

throw new RedirectException(URL::getInstance()->absoluteUrl('/login'));

mais du coup j'ai mis

throw new AuthenticationException();

qui ne résout pas le problème rencontré mais le contourne et est plus logique.

mais je fais comment pour rediriger vers la page de connexion pour ensuite revenir sur la page d'origine quand je me suis connecté ?

Last edited by Elyos (30-06-2021 11:50:46)


Aide les autres, ils t'aideront en retour.

Offline


Elyos wrote:

Chez moi j'obtiens ça :

Type error: Argument 1 passed to Thelia\Action\RedirectException::__construct() must be an instance of Thelia\Tools\URL, string given

avec ça :

throw new RedirectException(URL::getInstance()->absoluteUrl('/login'));

C'est parce que tu veux veux utiliser la classe action au lieu de la classe exception !

Remplace le "use Thelia\Action\RedirectException;" par "use Thelia\Core\HttpKernel\Exception\RedirectException;"


OpenStudio Toulouse

Offline


Bon bah j'ai fait ce que tu m'as dit mais ça me redirige vers la page encore avant.

Exemple :
Je vais sur rubrique1.html puis sur rubrique-restreinte.html ça me redirige vers login et une fois que je me loggue je reviens vers rubrique1.html au lieu de rubrique-restreinte.html

Je pense que mon code s'exécute avant d'enregistrer l'url.

public static function getSubscribedEvents()
    {
        return [
            KernelEvents::CONTROLLER => ["checkRestricted", 128]
        ];
    }

Je devrais plutôt mettre quel event ?


Aide les autres, ils t'aideront en retour.

Offline


Tu peux essayer de changer la priorité d'exécution de ton code en modifiant le paramètre $priority comme indiqué en bas de cette page.

Offline


J'ai finalement changé l'event par

TheliaEvents::VIEW_CHECK => ["checkRestricted", 128],

mais pas mieux... même en changeant la priorité...


Aide les autres, ils t'aideront en retour.

Offline


Suite à l'installation du module View, j'ai dû repasser à l'ancien event :

KernelEvents::CONTROLLER => ["checkRestricted", 250],

Du coup, je cherche toujours comment rediriger vers la bonne page après le login

throw new RedirectException(URL::getInstance()->absoluteUrl('/login'));

Aide les autres, ils t'aideront en retour.

Offline


Utililise xdebug, tu verras exactement ce qui se passe dans ton code au lieu de tâtonner


OpenStudio Toulouse

Offline


roadster31 wrote:

Utililise xdebug, tu verras exactement ce qui se passe dans ton code au lieu de tâtonner

Je n'ai pas la main sur le serveur...

Comme déjà dit, je pense que l'url n'est pas enregistrée avant la redirection vers la page de login...


Aide les autres, ils t'aideront en retour.

Offline


Je ne sais pas si c'est la meilleure méthode mais du coup j'ai fait ça :

$session->setReturnToUrl($event->getRequest()->getUri());
throw new AuthenticationException();

Aide les autres, ils t'aideront en retour.

Offline


Je n'ai pas la main sur le serveur...

D'ou l'interêt de développer en local et de déployer sur le serveur, une fois que ça marche.


OpenStudio Toulouse