THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 ImportT1

(27-01-2023 14:51:21)


Hello!

Bon apparemment y'a pas de modules obsolètes qui ne fonctionne plus avec la 2.5.X.

Je viens d'essayer d'installer importT1 mais dès l'installation ça plante :

Compile Error: Declaration of ImportT1\ImportT1::postActivation(?Propel\Runtime\Connection\ConnectionInterface $con = null) must be compatible with Thelia\Module\BaseModule::postActivation(?Propel\Runtime\Connection\ConnectionInterface $con = null): void

J'essaye de regarder pour corriger le souci...


Aide les autres, ils t'aideront en retour.

Offline

#2 Re: ImportT1

(27-01-2023 14:55:54)


A la ligne 34 :

public function postActivation(ConnectionInterface $con = null)

rajouter ":void"

public function postActivation(ConnectionInterface $con = null):void

Aide les autres, ils t'aideront en retour.

Offline

#3 Re: ImportT1

(27-01-2023 14:57:57)


À l'activation

Invalid database name: no configured connection named `thelia`.


Aide les autres, ils t'aideront en retour.

Offline

#4 Re: ImportT1

(27-01-2023 15:04:14)


Du coup, ça m'a tout planté... ^^'


Aide les autres, ils t'aideront en retour.

Offline

#5 Re: ImportT1

(27-01-2023 15:08:11)


J'ai donc dû supprimer le dossier et l'entrée dans la BDD...


Aide les autres, ils t'aideront en retour.

Offline

#6 Re: ImportT1

(27-01-2023 16:20:57)


La règle est simple: si sur Github il existe une branche "main", le module a été porté en 2.5, et c'est cette branche "main" qu'il faut utiliser.

S'il n'y a qu'une branche "master", alors il n'a pas été porté et 2.5, et ne fonctionnera pas sur une 2.5, c'est même pas la peine d'essayer.

Dans ton cas la branche main de ImportT1 indique que le module a été porté en 2.5. Par contre, toi tu as installé la branche master.

Avec composer pour installer la branche main, tu dois l'installer avec :

composer install thelia/import-t1-module:dev-main

En effet, le module n'a pas de release faite depuis "main".


OpenStudio Toulouse

Offline

#7 Re: ImportT1

(28-01-2023 14:42:39)


Salut Roadster,

Ah oui en effet, j'ai pas pensé à regarder à ce niveau là ^^'

Du coup ça va mieux. juste quelques bugs au niveau de ma base T1 (contenu sans dossier parent).
Par contre, ça ne reset pas les AUTO-INCREMENT. (petite évolution possible ?)

Last edited by Elyos (28-01-2023 15:30:27)


Aide les autres, ils t'aideront en retour.

Offline

#8 Re: ImportT1

(08-02-2023 17:48:31)


Hello!

Je suis en train de modifier le module pour :
- Ajouter la réinitialisation des auto increment après le deleteAll()
- Avoir le choix de ce que l'on veut importer : Clients / Commandes / Catalogue / Contenu
- Avoir ensuite le choix de sélectionner ce que l'on souhaite réellement importer sur ce que l'on a en base de données T1 (exemple : commandes après 2017, clients s'étant connecté après 2017 ou ayant déjà commandé; enfin je verrais au niveau de ces "filtres".

Mais ça commence mal... (j'arrive à contourner le souci mais je ne comprends pas pourquoi ça "bug")

A l'origine le code est :

        $dbinfo
            ->setHostname(trim($request->get('hostname')))
            ->setUsername(trim($request->get('username')))
            ->setPassword($request->get('password'))
            ->setDbname(trim($request->get('dbname')))
            ->setClientDirectory(trim($request->get('client_directory')));

Je remplace par ça :

        $dbinfo
            ->setHostname(trim($request->get('hostname')))
            ->setUsername(trim($request->get('username')))
            ->setPassword($request->get('password'))
            ->setDbname(trim($request->get('dbname')))
            ->setClientDirectory(trim($request->get('client_directory')))
            ->setImportCustomers(trim($request->get('import_customers')))
            ->setImportOrders(trim($request->get('import_orders')))
            ->setImportCatalog(trim($request->get('import_catalog')))
            ->setImportContent(trim($request->get('import_content')));

et j'ai un magnifique :

Call to a member function setImportCustomers() on null

Par contre, si je mets comme ça :

        $dbinfo
            ->setHostname(trim($request->get('hostname')))
            ->setUsername(trim($request->get('username')))
            ->setPassword($request->get('password'))
            ->setDbname(trim($request->get('dbname')))
            ->setClientDirectory(trim($request->get('client_directory')));
        $dbinfo->setImportCustomers(trim($request->get('import_customers')));
        $dbinfo->setImportOrders(trim($request->get('import_orders')));
        $dbinfo->setImportCatalog(trim($request->get('import_catalog')));
        $dbinfo->setImportContent(trim($request->get('import_content')));

Je n'ai plus l'erreur... une idée ? (NB : j'ai mis exactement les mêmes saut de ligne et espaces)


Aide les autres, ils t'aideront en retour.

Offline

#9 Re: ImportT1

(09-02-2023 09:50:09)


setClientDirectory() retourne certainement null


OpenStudio Toulouse

Offline

#10 Re: ImportT1

(10-02-2023 10:26:17)


Merci Roadster !
En effet ça ne renvoyait rien du tout donc j'ai corrigé.
À savoir :
- Dans Model\DatabaseInfo.php, Ligne 91

public function setClientDirectory($client_directory)
    {
        $this->client_directory = $client_directory;

        return $this; //Ajout
    }

J'ai vu un autre bug quand le path du dossier "client" n'est pas bon :

ImportT1\Controller\Admin\ImportT1Controller::selectDbAction(): Argument #1 ($db) must be of type ImportT1\Model\Db, string given...

Du coup dans Controller\Admin\ImportT1Controller.php, Ligne 197 (avant mes autres modifications) :
Remplacement de

return $this->selectDbAction($error_message, $db);

par

return $this->selectDbAction($db, $session, $error_message);

Aide les autres, ils t'aideront en retour.

Offline

#11 Re: ImportT1

(03-03-2023 10:35:19)


Hello!

J'avais un peu laissé en stand-by et en revenant dessus j'ai eu un petit souci à la connexion :

Too few arguments to function Thelia\Form\BaseForm::__construct(), 5 passed in .../thelia/local/modules/ImportT1/Controller/Front/CustomerController.php on line 71 and at least 6 expected

et en effet, il manque l'argument TokenStorageInterface :

$customerLoginForm = new CustomerLogin($request, $eventDispatcher, $translator, $formFactoryBuilder, $validationBuilder)

Aide les autres, ils t'aideront en retour.

Offline

#12 Re: ImportT1

(06-03-2023 09:02:12)


Il ne faut plus utiliser les constructeurs des forms, mais $this->createForm(...); Si tu peux faire une petite PR, ce serait top !


OpenStudio Toulouse

Offline

#13 Re: ImportT1

(08-03-2023 09:08:02)


Bon...

J'ai remplacé dans le controller :

$customerLoginForm = new CustomerLogin($request, $eventDispatcher, $translator, $formFactoryBuilder, $validationBuilder);

par

$customerLoginForm = $this->createForm(CustomerLogin::class);

Je n'ai plus d'erreur par contre :
1/ je me connecte avec un compte inexistant et ça me redirige vers l'accueil avec tout de même l'url .../login et sans afficher d'erreur
2/ la page mot de passe oublié (.../password) me donne une erreur :

Warning: Undefined array key "password_sent"

NB : pour l'instant je suis sur les templates de base


Aide les autres, ils t'aideront en retour.

Offline

#14 Re: ImportT1

(08-03-2023 09:16:30)


Pour le souci 2/, il suffit de remplacer dans le template password.html

{if $password_sent}

par

{if isset($password_sent)}

Aide les autres, ils t'aideront en retour.

Offline

#15 Re: ImportT1

(08-03-2023 11:17:45)


Ou encore

{if $password_sent|default:false}

OpenStudio Toulouse

Offline

#16 Re: ImportT1

(08-03-2023 16:22:07)


ERRATUM

Elyos wrote:

1/ je me connecte avec un compte inexistant et ça me redirige vers l'accueil avec tout de même l'url .../login et sans afficher d'erreur

En fait ça va sur la page /login mais le Route est importT1_customer_login_process qui ne renvoie rien donc le centre de ma page est vide.

Last edited by Elyos (08-03-2023 16:22:37)


Aide les autres, ils t'aideront en retour.

Offline

#17 Re: ImportT1

(08-02-2024 14:30:17)


Hello!

Désolé pour le déterrage de post mais je me suis ENFIN occupé de ça.

Voici le code pour le fichier CustomerController.php du module importT1 :

<?php

namespace ImportT1\Controller\Front;

use ImportT1\Model\CustomerTemp;
use ImportT1\Model\CustomerTempQuery;

use Front\Front;
use Thelia\Core\Event\Customer\CustomerEvent;
use Thelia\Core\Event\Customer\CustomerLoginEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Security\Authentication\CustomerUsernamePasswordFormAuthenticator;
use Thelia\Core\Security\Exception\AuthenticationException;
use Thelia\Core\Security\Exception\CustomerNotConfirmedException;
use Thelia\Core\Security\Exception\UsernameNotFoundException;
use Thelia\Core\Security\Exception\WrongPasswordException;
use Thelia\Form\CustomerLogin;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\Customer;
use Thelia\Model\CustomerQuery;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class CustomerController extends \Front\Controller\CustomerController
{
    /**
     * Perform user login. On a successful login, the user is redirected to the URL
     * found in the success_url form parameter, or / if none was found.
     *
     * If login is not successfull, the same view is displayed again.
     *
     */
    public function loginAction(EventDispatcherInterface $eventDispatcher)
    {
        if (!$this->getSecurityContext()->hasCustomerUser()) {
            $request = $this->getRequest();
            $customerLoginForm = $this->createForm(CustomerLogin::class);

            try {
                $form = $this->validateForm($customerLoginForm, "post");

                // If User is a new customer
                if ($form->get('account')->getData() == 0 && $form->get("email")->getErrors()->count() == 0) {
                    return $this->generateRedirectFromRoute(
                        "customer.create.process",
                        ["email" => $form->get("email")->getData()]
                    );
                } else {
					$customerTemp = CustomerTempQuery::create()
						->where('`customer_temp`.email = ?', $form->get('email')->getData(), \PDO::PARAM_STR)
						->where('`customer_temp`.password = CONCAT(\'*\', UPPER(SHA1(UNHEX(SHA1(?)))))', $form->get('password')->getData(), \PDO::PARAM_STR)
						->where('`customer_temp`.processed = 0')
						->findOne();

					if (null !== $customerTemp) {
						$customer = CustomerQuery::create()
							->findOneByEmail($form->get('email')->getData());

						if (null !== $customer) {
							$customer->setPassword($form->get('password')->getData())
								->save();

							$customerTemp
								->setProcessed(true)
								->save();

							$this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
							
							$successUrl = $customerLoginForm->getSuccessUrl();

							return RedirectResponse::create($successUrl);
						}
					}
                    try {
                        $authenticator = new CustomerUsernamePasswordFormAuthenticator($request, $customerLoginForm);

                        /** @var Customer $customer */
                        $customer = $authenticator->getAuthentifiedUser();

                        $this->processLogin($eventDispatcher, $customer);

                        if (intval($form->get('remember_me')->getData()) > 0) {
                            // If a remember me field if present and set in the form, create
                            // the cookie thant store "remember me" information
                            $this->createRememberMeCookie(
                                $customer,
                                $this->getRememberMeCookieName(),
                                $this->getRememberMeCookieExpiration()
                            );
                        }

                        return $this->generateSuccessRedirect($customerLoginForm);

                    } catch (UsernameNotFoundException $e) {
                        $message = $this->getTranslator()->trans(
                            "Wrong email or password. Please try again",
                            [],
                            Front::MESSAGE_DOMAIN
                        );
                    } catch (WrongPasswordException $e) {
                        $message = $this->getTranslator()->trans(
                            "Wrong email or password. Please try again",
                            [],
                            Front::MESSAGE_DOMAIN
                        );
                    } catch (CustomerNotConfirmedException $e) {
                        if ($e->getUser() !== null) {
                            // Send the confirmation email again
                            $this->getDispatcher()->dispatch(
                                TheliaEvents::SEND_ACCOUNT_CONFIRMATION_EMAIL,
                                new CustomerEvent($e->getUser())
                            );
                        }
                        $message = $this->getTranslator()->trans(
                            "Your account is not yet confirmed. A confirmation email has been sent to your email address, please check your mailbox",
                            [],
                            Front::MESSAGE_DOMAIN
                        );
                    } catch (AuthenticationException $e) {
                        $message = $this->getTranslator()->trans(
                            "Wrong email or password. Please try again",
                            [],
                            Front::MESSAGE_DOMAIN
                        );
                    }

                }
            } catch (FormValidationException $e) {
                $message = $this->getTranslator()->trans(
                    "Please check your input: %s",
                    ['%s' => $e->getMessage()],
                    Front::MESSAGE_DOMAIN
                );
            } catch (\Exception $e) {
                $message = $this->getTranslator()->trans(
                    "Sorry, an error occured: %s",
                    ['%s' => $e->getMessage()],
                    Front::MESSAGE_DOMAIN
                );
            }

            Tlog::getInstance()->error(
                sprintf(
                    "Error during customer login process : %s. Exception was %s",
                    $message,
                    $e->getMessage()
                )
            );

            $customerLoginForm->setErrorMessage($message);

            $this->getParserContext()->addForm($customerLoginForm);

            if ($customerLoginForm->hasErrorUrl()) {
                return $this->generateErrorRedirect($customerLoginForm);
            }else{
				return $this->generateRedirectFromRoute("customer.login.view");
			}
        }
    }
}

Last edited by Elyos (08-02-2024 14:30:37)


Aide les autres, ils t'aideront en retour.