THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 Champs formulaire

(27-08-2015 09:10:31)


Bonjour,

Ne connaissant pas Symfony, je galere un peu
je ne trouve pas de reponse a mon pb sur internet

dans mon module j'ai un formulaire qui s'affiche cote back / product
avec un champ 'select' et plusieurs boutons 'submit'

    protected function buildForm()
    {
        $this->formBuilder
            ->add('listproduct', 'choice', [
                'multiple' => true
            ])
            ->add('recommandation', 'submit')
            ;
    }

le contenu du select depend de la categorie du produit (comment l'initialiser ?)

dans le formulaire je remplie mon select comme ceci

          <select name="listproduct" multiple size=5>
          {$product_count = 0}
          {loop name="listproduct" type="product" category=$category_product_recommandation }
            {if $type_product == "transceiver"}
              {if !{antenna_has_recommandation antenna_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE} - {antenna_has_recommandation antenna_id=$ID }</option>
              {$product_count = $procuct_count + 1}
              {/if}
            {else}
              {if !{transceiver_has_recommandation transceiver_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE} - {transceiver_has_recommandation transceiver_id=$ID }</option>
              {$product_count = $procuct_count + 1}
              {/if}
            {/if}
            {if $product_count == 0}
              <option value="" disabled>{intl l="All the products are associated with a recommendation"}</option>
            {/if}
          {/loop}
          </select>

pour les boutons submit

          {loop name="recommandation-status" type="recommandationtransceiverantenna_recommandation"}
            <button type="submit" class="btn btn-primary" name="recommandation" value="{$ID}" {if $product_count == 0}disabled{/if}>{intl l="add to"} '{$TITLE}' {intl l="recommandation"}</button>
          {/loop}

le formulaire s'affiche correctement - (le buildform a mon avis n'est pas bon, je ne vois pas comment faire une declaration correcte)
et comment recuperer les valeurs retournees

Merci

Offline

Offline

#3 Re: Champs formulaire

(27-08-2015 09:40:14)


oui

mais je bloque
comment recuperer la category du produit en cours pour generer le buildform champ type choice ?

EDIT:
en relisant 100 fois, j'ai trouve l'exemple avec {custom_render_form_field

reste plus qu'a recuperer les valeurs et pour le submit je vais partir sur une autre solution

Last edited by zzuutt (27-08-2015 10:04:08)

Offline

#4 Re: Champs formulaire

(27-08-2015 10:11:00)


Pour récupérer les valeurs, regarde comment c'est fait dans le contrôleur Contact du module Front : local/modules/Front/Controller/ContactController.php


OpenStudio Toulouse

Offline

#5 Re: Champs formulaire

(27-08-2015 12:14:07)


Merci ROADSTER31

j'ai fait ceci

        $this->formBuilder
            ->add('listproduct', 'choice', [
                'multiple' => true,
                'label'       => Translator::getInstance()->trans('Select the product')
                ])
            ->add('recommandation', 'radio')
            ;
          {custom_render_form_field form=$form field="listproduct"}
          <select {form_field_attributes form=$form field='listproduct'}>
          {$product_count = 0}
          {loop name="listproduct" type="product" category=$category_product_recommandation }
            {if $type_product == "transceiver"}
              {if !{antenna_has_recommandation antenna_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE}</option>
              {$product_count = $procuct_count + 1}
              {/if}
            {else}
              {if !{transceiver_has_recommandation transceiver_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE}</option>
              {$product_count = $procuct_count + 1}
              {/if}
            {/if}
            {if $product_count == 0}
              <option value="" disabled>{intl l="All the products are associated with a recommendation"}</option>
            {/if}
          {/loop}
          </select>
          {/custom_render_form_field}

lorsque je soumais le formulaire, j'ai l'erreur suivante
Missing or invalid data: [Select the product] This value is not valid.

pourtant le post est correct

recommandationtransceiverantenna_update_product[listproduct][]=2
recommandationtransceiverantenna_update_product[recommandation]=1

Offline

#6 Re: Champs formulaire

(27-08-2015 12:41:25)


Pour "choice", tu dois donner toutes les valeurs possibles au préalable, dans buildForm(); Comme tu ne le fais pas, l'erreur "This value is not valid" est remontée. Peut-être peux-tu utiliser "integer" à la place ?

PS: tu as une erreur là : {$product_count = $procuct_count + 1}


OpenStudio Toulouse

Offline

#7 Re: Champs formulaire

(27-08-2015 12:49:01)


Merci ROADSTER31
grand merci pour l'erreur, j'ai beau me relire en ce moment je ne fais que des fautes de frappe

je vais tester avec integer

EDIT: integer ne va pas, il faut que je puisse faire une selection multiple
je dois initialiser les valeur de cette variable

si je comprends bien symfony charge le formulaire au moment ou il trouve {form name=....
il charge le buildform correspondant

peut on recuperer l'id du produit ou de la categorie + des variables dans la fonction buildform ? comment ?

Last edited by zzuutt (27-08-2015 13:01:14)

Offline

#8 Re: Champs formulaire

(27-08-2015 14:31:27)


Dans buildForm, tu peux récupérer des paramètres de la requête avec $this->getRequest()->get('...');


OpenStudio Toulouse

Offline

#9 Re: Champs formulaire

(27-08-2015 16:08:39)


Merci Roadster31
je vais essayer de me debrouiller wink

Offline

#10 Re: Champs formulaire

(28-08-2015 07:50:27)


Je ne suis pas certain d'avoir bien cerné ton problème, mais comme le dit ROADSTER31,

ROADSTER31 wrote:

Pour "choice", tu dois donner toutes les valeurs possibles au préalable, dans buildForm()

protected function buildForm()
    {
        $productList = array();

        foreach (ProductQuery::create()->filterByVirtual(1)->find() as $product) {
            $productList[$product->getId()] = $product->getId() . '::' . $product->getRef();
        }

        $Translator = Translator::getInstance();

        $this->formBuilder
            ->add('id', 'hidden', [
                'required'      => true
            ])
            ->add('product_id', 'choice', [
                'choices'       => $productList,
                'label'         => 'Produit',
                'label_attr'    => ['for' => 'prodtype_product_id'],
                'required'      => true
            ])
            ->add('code', 'choice', [
                'choices'       => Resa::getProduitCodes(),
                'label'         => 'Code',
                'label_attr'    => ['for'=>'prodtype_type'],
                'required'      => true
            ])
        ;
    }

Après il semblerai que tu souhaites limiter cette liste suivant un choix fait de ce même formulaire, dans ce cas il faut que tu rajoutes une contrainte "callback" (

->add('product_id', 'choice', [
                'choices'       => $productList,
                'constraints' => array(
                    new Constraints\Callback(array("methods" => array(array($this, "verifyThis"))))
                ),
                'label'         => 'Produit',
                'label_attr'    => ['for' => 'prodtype_product_id'],
                'required'      => true
            ])

et avec cette fonction tu vas créer, tu vas pouvoir récupérer les autres champs, faire des requêtes...

Regarde le form "CustomerCreation", il a 2 callback dont "verifyEmailField"

Offline

#11 Re: Champs formulaire

(28-08-2015 11:43:46)


Merci Informatiqueprog

mon probleme n'etait pas la verification au Callback, mais la generation de la  liste
je voulais afficher que les produits qui n'ont pas de recommandation

j'y suis arrive wink

mais je me retrouve avec ce message d'erreur a la validation du formulaire
Notice: Array to string conversion

mon champ listproduct de type choice renvoie un array ce qui est normal vu que j'autorise la selection multiple

        $this->formBuilder
            ->add('listproduct', 'choice', [
                "choices" => $choicesList,
                'multiple' => true,
                'label' => Translator::getInstance()->trans('Select the product')
                ])
            ->add('recommandation', 'radio')
            ;
       try {
            /*
             * Check if product exists
             */
            $product = ProductQuery::create()
                ->findPk($product_id);
            if ($product === null) {
                throw new \Exception("This product doesn't exist");
            }

            /*
             * Validate form
             */
            $form = new ProductModificationFormUpdate($this->getRequest());
            $vform = $this->validateForm($form);

            $listproduct = $vform->get('listproduct')->getConfig()->getOption('choices');
....
        } catch (\Exception $e) {
            $errmes = $e->getMessage();
        }

Offline

#12 Re: Champs formulaire

(28-08-2015 12:42:37)


effectivement c'est bizarre, sur quelle ligne de code as-tu ce message ?

Je n'ai pas encore eu l'occasion de manipuler un "select multi", par contre tu peux utiliser "collection" pour ton tableau de valeurs

->add('tarifs', 'collection', [
    'type'          => 'number',
    'required'      => true,
    'allow_add'     => true,
    'allow_delete'  => true,
    'options'       => [
        'constraints' => [ new NotBlank() ],
    ],
    'label'        => 'Tarifs (ht)',
    'label_attr'   => [
        'for' => 'tarif_tarifs'
   ],
])

Sinon pour récupérer les données du champ, j'aurais plutôt utilisé:

$listproduct = $vform->get('listproduct')->getData();

Last edited by informatiqueprog (28-08-2015 12:44:31)

Offline

#13 Re: Champs formulaire

(31-08-2015 07:24:40)


Merci Informatiqueprog
je vais tester avec 'collection'

informatiqueprog wrote:

effectivement c'est bizarre, sur quelle ligne de code as-tu ce message ?

Apparemment c'est a la validation du formulaire

informatiqueprog wrote:

Sinon pour récupérer les données du champ, j'aurais plutôt utilisé:

$listproduct = $vform->get('listproduct')->getData();

j'avais mis la meme chose au depart, avec l'erreur j'ai change mais vu que c'est a la validation cela... je remets getData()

Offline

#14 Re: Champs formulaire

(31-08-2015 08:57:29)


Bonjour,

je persiste avec mon champs type 'choice'
j'ai vu que le module 'Keyword' utilise ce type de champ
je m'en suis inspire
je n'ai plus de message d'erreur
mais je ne recupere aucune donnee

        $this->formBuilder
            ->add('listproduct', 'choice', [
                "choices" => $choicesList,
                'multiple' => true,
                'label' => Translator::getInstance()->trans('Select the product')
                ])

            ->add('recommandation', 'radio')
            ;
    }
          {custom_render_form_field form=$form field="listproduct"}
          {form_error form=$form field="listproduct"}
            {$message}
          {/form_error}
          <select {form_field_attributes form=$form field='listproduct'}>
          {$product_count = 0}
          {loop name="listproduct" type="product" category=$category_product_recommandation }
            {if $type_product == "transceiver"}
              {if !{antenna_has_recommandation antenna_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE}</option>
              {$product_count = $product_count + 1}
              {/if}
            {else}
              {if !{transceiver_has_recommandation transceiver_id=$ID } }
              <option value="{$ID}">{$ID} - {$TITLE}</option>
              {$product_count = $product_count + 1}
              {/if}
            {/if}
            {if $product_count == 0}
              <option value="" disabled>{intl l="All the products are associated with a recommendation"}</option>
            {/if}
          {/loop}
          </select>
          {/custom_render_form_field}
          </div>
          <div class="col-md-4">
          {form_field form=$form  field="recommandation"}
          {loop name="recommandation-status" type="recommandationtransceiverantenna_recommandation"}
            <input type="radio" name="{$name}" id="radiorecommandation{$ID}" class="btn btn-primary" value="{$ID}" {if $ID == '1'}checked = "checked"{/if} {if $product_count == 0}disabled{/if} /><label for="radiorecommandation{$ID}"> {intl l="add to"} '{$TITLE}' {intl l="recommandation"}</label> <br />
          {/loop}
          {/form_field}
        try {
            /*
             * Check if product exists
             */
            $product = ProductQuery::create()
                ->findPk($product_id);
            if ($product === null) {
                throw new \Exception("This product doesn't exist");
            }

            /*
             * Validate form
             */
            $form = new ProductModificationFormUpdate($this->getRequest());
            Tlog::getInstance()->debug("Recommandation Form Validation");
            $vform = $this->validateForm($form);

            $listproduct = $vform->get('listproduct')->getData();
            $recommandation = $vform->get('recommandation')->getData();
            Tlog::getInstance()->debug("Recommandation Form Recommandation :".$recommandation);            
            
            return $this->generateSuccessRedirect($form);

        } catch (FormValidationException $e) {
            $message = sprintf("Please check your input: %s", $e->getMessage());
        } catch (PropelException $e) {
            $message = $e->getMessage();
        } catch (\Exception $e) {
            $message = sprintf("Sorry, an error occured: %s", $e->getMessage()." ".$e->getFile());
        }

        if ($message !== false) {
            \Thelia\Log\Tlog::getInstance()->error(
                sprintf("Error during keyword category association update process : %s.", $message)
            );

            $form->setErrorMessage($message);

            $this->getParserContext()
                ->addForm($form)
                ->setGeneralError($message)
            ;
        }

        // Redirect to current folder
        return $this->generateRedirectFromRoute(
            'admin.products.update',
            array(),
            array('product_id' => $product_id, 'current_tab' => 'modules')
        );

il me retourne tous le temps :
Recommandation Form Recommandation :1
quelque soit la valeur choisi

pourtant dans le post j'ai bien

recommandationtransceiverantenna_update_product[listproduct][]=3
recommandationtransceiverantenna_update_product[recommandation]=4

Last edited by zzuutt (31-08-2015 08:59:57)

Offline

#15 Re: Champs formulaire

(31-08-2015 09:42:51)


Salut Zzuutt,

Concernant le champ "recommandation", cela me semble normal:
http://symfony.com/fr/doc/current/refer … radio.html

Crée un simple bouton radio. Il devrait toujours être utilisé pour un champ dont la valeur est booléenne. : si le bouton radio est sélectionné, le champ sera défini à true, sinon, la valeur sera définie à false

Tu devrais plutôt utiliser un type "integer" pour le "formBuiler" du champ "recommandation"

Sinon, c'est bon pour "listproduct" ?

Offline

#16 Re: Champs formulaire

(31-08-2015 10:41:20)


informatiqueprog wrote:

Concernant le champ "recommandation", cela me semble normal:
http://symfony.com/fr/doc/current/refer … radio.html

Crée un simple bouton radio. Il devrait toujours être utilisé pour un champ dont la valeur est booléenne. : si le bouton radio est sélectionné, le champ sera défini à true, sinon, la valeur sera définie à false

mais vu l'option

value
type: mixed default: 1
La valeur qui est effectivement utilisée comme valeur pour le radio bouton. Cela n'affecte pas la valeur qui est définie dans votre objet.

je pensais qu'il allait recuperer la valeur de value

informatiqueprog wrote:

Tu devrais plutôt utiliser un type "integer" pour le "formBuiler" du champ "recommandation"

avec integer ca marche

informatiqueprog wrote:

Sinon, c'est bon pour "listproduct" ?

pour le moment non cela me retourne un array (bien)
mais avec print_r , je n'ai que la valeur 1
je cherche wink

Last edited by zzuutt (31-08-2015 10:41:55)

Offline

#17 Re: Champs formulaire

(31-08-2015 12:47:50)


Bizarre...

es-tu sûr du contenu de ton "$choicesList" ?

autre piste : récupères le contenu de ton champ "listproduct" (via getRequest) avant la validation du formulaire
et compare le avec ce que tu récupères avec getData() après validation
Idem => PB avec ton POST
Différent => PB avec ton formBuilder

Offline

#18 Re: Champs formulaire

(31-08-2015 16:31:12)


informatiqueprog wrote:

es-tu sûr du contenu de ton "$choicesList" ?

Oui j'en suis sur, mais par doute j'ai ecrit en dur le array('2'=>'Antenne2','3'=>'Antenne3')

informatiqueprog wrote:

autre piste : récupères le contenu de ton champ "listproduct" (via getRequest) avant la validation du formulaire
et compare le avec ce que tu récupères avec getData() après validation
Idem => PB avec ton POST
Différent => PB avec ton formBuilder

tout est pareil
mais si je fais un foreach de $listproduct la premiere valeur = toujours 1
si j'ai selectionne que l'antenne3  ca me sort : 1,3
bizrre que le print_r m'affiche que 1

Offline

#19 Re: Champs formulaire

(31-08-2015 16:40:38)


D'autant plus que cette valeur "1", ne faisant pas partie de "$choicesList", la validation de formulaire devrait te générer une erreur...

Offline

#20 Re: Champs formulaire

(31-08-2015 17:02:55)


Vidage des caches ?


OpenStudio Toulouse

Offline

#21 Re: Champs formulaire

(01-09-2015 09:47:07)


roadster31 wrote:

Vidage des caches ?

helas non le foreach me sort 1 et la valeur selectionnee
le print_r seulement 1

j'ai du mal a comprendre
si je fais :

$vform = $this->validateForm($form);
print_r($vform->getData());

cela m'affiche 1, alors que ca devrait etre le tableau complet

Offline

#22 Re: Champs formulaire

(01-09-2015 10:06:58)


Le plus simple dans les cas "mystérieux", c'est d'utiliser un IDE qui te permet de debugger pas à pas (comme PHPStorm).

Tu analyses ainsi finement ce qu'il se passe au lieu d'avancer en aveugle ou de patouiller avec des print_r, et de perdre du temps.


OpenStudio Toulouse

Offline

#23 Re: Champs formulaire

(01-09-2015 13:05:46)


roadster31 wrote:

Le plus simple dans les cas "mystérieux", c'est d'utiliser un IDE qui te permet de debugger pas à pas (comme PHPStorm).

Tu analyses ainsi finement ce qu'il se passe au lieu d'avancer en aveugle ou de patouiller avec des print_r, et de perdre du temps.

Tu as raison !
je viens d'installer phpstorm
pour le moment je galere pour la config du debug
j'utilise wampserver

Offline

#24 Re: Champs formulaire

(01-09-2015 14:15:12)


Super ! Je te recommande la page d'aide, elle est bien faite : https://www.jetbrains.com/phpstorm/help … gging.html

Si tu utilises Firefox, il y a une petite extension magique pour basculer le mode debug : https://addons.mozilla.org/en-US/firefo … st-xdebug/

Si tu n'utilises pas Firefox, ... tant pis.


OpenStudio Toulouse

Offline

#25 Re: Champs formulaire

(01-09-2015 15:55:25)


roadster31 wrote:

Super ! Je te recommande la page d'aide, elle est bien faite : https://www.jetbrains.com/phpstorm/help … gging.html

Si tu utilises Firefox, il y a une petite extension magique pour basculer le mode debug : https://addons.mozilla.org/en-US/firefo … st-xdebug/

Si tu n'utilises pas Firefox, ... tant pis.

Merci Roadster31 
j'utilise Firefox et j'ai deja installe l'extension
je vais voir la doc pourquoi ca ne marche pas