THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

J'ai un soucis avec ma redirection suite a une erreur sur le formulaire
voici mes routes

    <route id="product.registration.customer.create.view" path="/warranty-registration" methods="get">
        <!--default key="_controller">Front\Controller\CustomerController::viewRegisterAction</default-->
        <default key="_controller">ProductRegistration\Controller\newAccountProductRegistration::viewRegisterAction</default>
    </route>

    <route id="product.registration.customer.create.process" path="/warranty-registration" methods="post">
        <default key="_controller">Front\Controller\CustomerController::createAction</default>
        <default key="_view">register</default>
    </route>

    <route id="product.registration.add.view" path="/warranty-registration/add" methods="get">
        <default key="_controller">ProductRegistration\Controller\addProductRegistration::viewAddProductRegistrationAction</default>
    </route>

    <route id="product.registration.add.view.create.process" path="/warranty-registration/add" methods="post">
        <default key="_controller">ProductRegistration\Controller\addProductRegistration::createAction</default>
        <default key="_view">add-product-warranty-registration</default>
    </route>

suivant que le client est connecte ou pas je le redirige vers l'un ou l'autre formulaire
pour l'appel de la route /warranty-registration

    protected $useFallbackTemplate = true;

    /**
 * Display the add-product-warranty-registration template or register template if no customer logged
 */
    public function viewRegisterAction()
    {
        if ($this->getSecurityContext()->hasCustomerUser()) {
            // Redirect to home page
            return $this->render("add-product-warranty-registration");
        }

        return $this->render("register");
    }

pour l'appel de la route /warranty-registration/add

    protected $useFallbackTemplate = true;

    /**
     * Display the add-product-warranty-registration template or login template if no customer logged
     */
    public function viewAddProductRegistrationAction()
    {
        if ($this->getSecurityContext()->hasCustomerUser()) {
            // Redirect to home page
            return $this->render("add-product-warranty-registration");
        }

        return $this->render("login");
    }

le soucis est sur le formulaire : add-product-warranty-registration  cette page se trouve dans mon module
c'est pour cela que j'ai rajoute la ligne protected $useFallbackTemplate = true;
et field='error_url'

            {hook name="warranty-registration.top"}
            {form name="product.registration.form"}
            <form id="form-register" class="form-horizontal" action="{url path="/warranty-registration/add"}" method="post">
                {form_field form=$form field='success_url'}
                    <input type="hidden" name="{$name}" value="{url path='/account'}" /> {* the url the user is redirected to on registration success *}
                {/form_field}
                {form_field form=$form field='error_url'}
                <input type="hidden" name="{$name}" value="{url path='/warranty-registration'}" />
                {/form_field}
                {form_field form=$form field='error_message'}
                    <input type="hidden" name="{$name}" value="{intl l="missing or invalid data"}" />
                {/form_field}
                {form_hidden_fields form=$form}
                {if $form_error}<div class="alert alert-danger">{$form_error_message}</div>{/if}
                {hook name="warranty-registration.form-top"}

                {hook name="warranty-registration.form-bottom"}

                <div class="form-group group-btn">
                    <div class="control-btn">
                        <button type="submit" class="btn btn-register">{intl l="Register"}</button>
                    </div>
                </div><!--/.form-group-->
            </form>
            {/form}

j'ai une contraire sur le numero de serie
lors de mes tests avec un numero de serie existant
la contrainte est bien remonte

    public function createAction(){

        $this->checkAuth();

        $addProductCreate = $this->createForm(ProductRegistration::PRODUCT_REGISTRATION_ADD_PRODUCT);
        $message = false;
        try {
            $customer = $this->getSecurityContext()->getCustomerUser();
            $createForm = $this->validateForm($addProductCreate);
.......
            $route = '/account';
            $response = RedirectResponse::create(URL::getInstance()->absoluteUrl($route));

        } catch (FormValidationException $e) {
            $message = $this->getTranslator()->trans("Please check your input: %s", ['%s' => $e->getMessage()], ProductRegistration::DOMAIN_NAME);
        } catch (\Exception $e) {
            $message = $this->getTranslator()->trans("Sorry, an error occured: %s", ['%s' => $e->getMessage()], ProductRegistration::DOMAIN_NAME);
        }
        if (null !== $message) {
            \Thelia\Log\Tlog::getInstance()->error(sprintf("Error during add product warranty registration process : %s", $message));

            $addProductCreate->setErrorMessage($message);

            $this->getParserContext()
                ->addForm($addProductCreate)
                ->setGeneralError($message)
            ;

            // Redirect to error URL if defined
            if ($addProductCreate->hasErrorUrl()) {
                return $this->generateErrorRedirect($addProductCreate);
            }
        }

    }

mais lorsqu'il me raffiche la page
je n'ai que cela le texte sous le champ serial number n'apparait pas

x1l6.jpg

une idee ?

Offline


Bonjour,

je ne comprends pas pourquoi il ne m'affiche pas le message d'erreur de ma contrainte

    public function checkSerialNumber($value, ExecutionContextInterface $context)
    {
        $serialNumber = ProductRegistrationQuery::create()->findOneBySerialNumber($value);
        if ($serialNumber) {
            $context->addViolation(Translator::getInstance()->trans(
                "This serial number already exists.",
                array(),
                ProductRegistration::DOMAIN_NAME));
        }
    }

Last edited by zzuutt (16-11-2015 13:58:50)

Offline


Salut Zzuutt,

Ta fonction me semble bien, peut-être la déclaration de ton callback ?

Offline


Elle est standard

            ->add(
                'serial_number',
                'text',
                array(
                    'constraints' => array(
                        new Constraints\Callback(array("methods" => array(
                            array($this, "checkSerialNumber")
                        )))
                    ),
                    'label' => Translator::getInstance()->trans(
                        'Serial number',
                        array(),
                        ProductRegistration::DOMAIN_NAME
                    ),
                    'label_attr' => array(
                        'for' => 'serial_number'
                    )
                )
            )

la verification de la contrainte se fait bien
mais lors de l'affichage du form, le message d'erreur de la contrainte n'est pas affiche

ca me prend la tete, rester bloque sur ca grrr - surtout que je ne vois pas d'erreur

Last edited by zzuutt (16-11-2015 14:02:36)

Offline


je constate qu'il me remonte cette erreur
s513.jpg

ligne 82:
                throw new FormValidationException($errorMessage);

Last edited by zzuutt (16-11-2015 14:28:35)

Offline


je ne comprends pas l'erreur

si quelqu'un a une idee, je suis preneur
la je suis dans le flou total

Merci

Last edited by zzuutt (16-11-2015 17:40:44)

Offline


Ce n'est sans doute pas le champ serial_number qui provoque l'erreur. Si c'était celui-là, son label apparaîtrait dans le message d'erreur général.


OpenStudio Toulouse

Offline


Merci Roadster31

mais je ne vois pas ou
si je rentre un serial_number non utilisé
tout se deroule correctement la sauvegarde se fait

j'en conclue que cela tourne autour de la fonction

    public function checkSerialNumber($value, ExecutionContextInterface $context)
    {
        $serialNumber = ProductRegistrationQuery::create()->findOneBySerialNumber($value);
        if ($serialNumber) {
            $context->addViolation(Translator::getInstance()->trans(
                "This serial number already exists.",
                array(),
                ProductRegistration::DOMAIN_NAME));
        }
    }

Offline


Bon, hé bien il ne te reste plus qu'à tracer tout ça pas à pas au debugger.


OpenStudio Toulouse

Offline


roadster31 wrote:

Bon, hé bien il ne te reste plus qu'à tracer tout ça pas à pas au debugger.

C'est ce que je fais
l'erreur apparait lors de la recuperation de l'exception

catch (FormValidationException $e) {
            $message = $this->getTranslator()->trans("Please check your input: %s", ['%s' => $e->getMessage()], ProductRegistration::DOMAIN_NAME);
        }

e19w.jpg

dans le controler addProductRegistration.php
lien sur github

Last edited by zzuutt (17-11-2015 16:05:56)

Offline


C'est avant que ça se passe, sans doute. Trace depuis ton callback.


OpenStudio Toulouse

Offline


je constate qu'il remonte bien ma contrainte
enak.jpg

et lorsqu'il execute lignes 81 82  de TheliaFormValidator.php
                $aBaseForm->setError(true);
                throw new FormValidationException($errorMessage);

j'ai ma variable $e
FormValidationException $e

qui recupere l'erreur indique ci-dessus

je ne vois pas ou chercher...

Last edited by zzuutt (17-11-2015 17:39:28)

Offline


j'ai supprime un a un chaque champ du form
jusqu'a ne garder que le champ serial_number
l'erreur apparait chaque fois

j'ai remis tous les champs
j'ai supprime la contrainte

    public function checkSerialNumber($value, ExecutionContextInterface $context)
    {
        $serialNumber = ProductRegistrationQuery::create()->findOneBySerialNumber($value);
        //if ($serialNumber) {
            //$context->addViolation(Translator::getInstance()->trans(
               // "This serial number already exists.",
                //array(),
                //ProductRegistration::DOMAIN_NAME));
       // }
    }

il n'y a plus d'erreur
sauf au moment de faire insert (vu que dans la table serial_number est unique)  erreur normal

a part la variable $context de la contrainte,  ???

je ne vois pas ou chercher
???

ce que je ne comprends pas, ce meme formulaire je l'ajoute au form de la page register
tout est ok, la contrainte sur le serial_number remonte, est affichee
mais le form tout seul, il y a cette erreur

Last edited by zzuutt (18-11-2015 09:18:45)

Offline


as-tu essayer de commenter ta ligne

$serialNumber = ProductRegistrationQuery::create()->findOneBySerialNumber($value);

Je ne suis pas expert PROPEL, mais "findOne" ne doit-il pas obligatoirement trouver un résultat sinon PROPEL génère une erreur ?

Offline


informatiqueprog wrote:

as-tu essayer de commenter ta ligne

$serialNumber = ProductRegistrationQuery::create()->findOneBySerialNumber($value);

Je ne suis pas expert PROPEL, mais "findOne" ne doit-il pas obligatoirement trouver un résultat sinon PROPEL génère une erreur ?

Merci Informatiqueprog

findOne apparement ne me pose pas probleme
(je ne suis pas non plus un specialiste ni en PROPEL ni en SYMFONY.... en fait en rien smile - d'ou l'erreur sans doute)

si je rentre un serial_number n'existant pas tout se passe bien l'enregistrement s'effectue
le probleme apparait seulement si je rentre un serial_number existant
findOne me retourne un resultat
et je rajoute $context->addViolation
je retrouve bien l'erreur voir #12

c'est lorsqu'il execute : throw new FormValidationException($errorMessage);
que mon catch (FormValidationException $e) {
remonte dans $e l'erreur #5

Last edited by zzuutt (18-11-2015 10:06:17)

Offline


ce que je constate lorsqu'il me raffiche le formulaire
il me recupere tous les champs sauf le champ date_purchase
defini comme suite

            ->add(
                'date_purchase',
                'date',
                array(
                    "constraints" => array(
                    ),
                    'label' => Translator::getInstance()->trans(
                        'Date purchase',
                        array(),
                        ProductRegistration::DOMAIN_NAME
                    ),
                    'label_attr' => array(
                        'for' => 'date_purchase',
                        "php_datetime_format" => "Y-m-d",
                        "moment_js_date_format" => "YYYY-MM-DD",
                    ),
                    "widget" => "single_text",
                    "format" => "yyyy-MM-dd",
                )
            )

Offline


si quelqu'un a une idee de piste
car la je suis dans le brouillard roll

pourquoi lorsqu'il execute : throw new FormValidationException($errorMessage);
que mon catch (FormValidationException $e) {
remonte dans $e l'erreur #5

Offline


@Roadster31

si je trace le formulaire register avec un email existant
j'arrive sur la meme erreur
l'erreur que j'affiche en #5 en fait n'en est pas une
je me trompe ?

bon ca n'explique pas pourquoi mon message d'erreur ne vient pas se mettre sous le champ concerne avec l'indication en rouge

Offline


Pour t'aider plus avant, il faudrait que je débugge moi-même. Désolé.


OpenStudio Toulouse

Offline


roadster31 wrote:

Pour t'aider plus avant, il faudrait que je débugge moi-même. Désolé.

Pas besoin Merci
je vais faire avec, le module est spécifique à mon site non commercial rattaché aux produits présentés