Bonjour,
Je rencontre un problème sur la validation d'un formulaire qui créer un PDF.
Avant validation et création du PDF j'ai 2,3 champs que j'aimerais vérifier :
Voici mon formulaire :

<?= $this->Form->create(NULL,['url'=>['controller'=>'estimations','action'=>'order_pdf','bon-de-commande.pdf'],'target' => '_blank']);?>

et voici mes regles de validation intégrées à mon controller :

$validator = new Validator();
                $validator
                ->requirePresence('Nom')
                ->add('Nom', 'length', [
                    'rule' => ['lengthBetween', 2, 100],
                    'message' => 'Au moins deux lettres doit être valide'
                ])
                ->requirePresence('Code_postal')
                ->add('Code_postal','length',[
                    'rule' => ['lengthBetween', 5, 5],
                    'message' => 'Code postal doit contenir 5 chiffres'
                ])
                ->add('Code_postal','numeric',[
                    'rule' => 'numeric',
                    'message' => 'Code postal = pas de lettre'
                ])
                ->requirePresence('Mail')
                ->add('Mail', 'validFormat', [
                    'rule' => 'email',
                    'message' => 'Email doit être valide'
                ]);

                $errors = $validator->errors($this->request->getData());
                if(empty($errors)){
                    var_dump('pas erreur');
                }else{
                    var_dump($errors);
                }

Lors de la validation, le PDF ce créait même si les règles de validation ne sont pas respectées. Du coup je penses que ca vient de 'URL' que j'indique dans mon CREATE. J'ai bien tenté un

$this->redirect([['controller'=>'estimations','action'=>'order_pdf','bon-de-commande.pdf'],'target' => '_blank']);

Mais cela ne fonctionne po !
Si quelqu un peut me mettre sur la voie...
Merci

33 réponses


Peut être vous manque t il des informations pour m'aider...toujours est il que je n'ai pas trouvé la voie :)

je galère tjs sur mon problème.
Lorsque la création de mon formulaire est :

<?= $this->Form->create(NULL);?>

Les validations ont bien prises en compte. Cela me parait normal.
Mais je ne vois pas comment valider mes champs du formulaire avant la création du PDF...
Merci de vos retours

Tu sembles avoir une bonne connaissance de PHP... Et tu ne sais pas utiliser un if..?? C'est quand même vachement drôle X-D
if (valide) créer pdf
else gestion des erreurs

Merci pour cette réponse.
Pour ta remarque, qui au passage est tellement vrai, j'ai appris le PHP tout seul et je pense avoir emprunté des chemins biscornus pour y arriver et il se trouve que parfois je me retrouve devant des abérations :/
Heuresement vous êtes là pour me remettre sur le droit chemin =)

Je tente la création du PDF de faire avec ce bout de code

if(empty($errors)){
                    $this->redirect([['controller'=>'estimations','action'=>'order_pdf','bon-de-commande.pdf'],'target' => '_blank']);
                    var_dump('pas erreur');
                }else{
                    var_dump($errors);
                }

Mais ca ne passe pas. Pourtant je valide bien puisque 'pas d'erreur' s'affiche mais la redirection ne se fait po !?/

Ah ok, mea culpa ;-)
Par contre... Ca n'est pas du PHP ça :-s Faudrait préciser et lister les plugins aditionnels que vous utilisez, hein... Ca sort d'où redirect?? C'est une instance de quoi $this? pourquoi utiliser des frameworks à la con qui rendent le code incompréhensible à tout ceux qui ne l'ont jamais utilisé plutôt que d'utiliser du PHP basique..?
Sais-tu ce que sont les en-têtes http? Le status http d'une requête?
Une redirection c'est juste une injection des headers "Location" et éventuellement du header "Status"...

<?php header("Location: *url*");

Et si ça n'est pas vraiment une redirection que tu souhaites faire, faudrait expliquer en détail ce que tu souhaites :-s

Pas de mea culpa qui tienne, tu as raison :)
Alors, sauf erreur on est dans le forum spécifique à Cakephp, donc j'utilise ce dernier.
Ce que je tente de faire (je la fait courte) :

<?= $this->Form->create(NULL,['url'=>['controller'=>'estimations','action'=>'order_pdf','bon-de-commande.pdf'],'target' => '_blank']);?>
<?= $this->Form->control('Mail', ['label' => ['text'=>'Mail de votre client  :'],'class'=>'form-control','type' => 'email']);?>
<?= $this->Form->button($this->Html->tag('span','',['class'=>'icon icon-printer']).'Je valide', ['type' => 'submit','class'=>'pull-right btn btn-default','escape' => false]);?>
<?= $this->Form->end(); ?>

Je veux pouvoir valider l'email avant l'envoi du formulaire vers l'action 'order_pdf' qui elle s'occupe de créer le pdf avec les informations qu'elle recoit.
Sans validation, et avec le create du formulaire tel quel, pas de soucis ca passe. Mais il faut comme tout formulaire valider les champs avant envoi.
J'ai tenté le "redirect()"(méthode qui permet de rediriger vers la page souhaitée) lors des conditions de validation, mais pas d'effet.
...

Ah oui, d'accord X-D Je peux mea culper, là, ou pas??
En fait, j'accède au forum par la page d'accueil ^^'

Je connais rien à cakePHP... Je savais même pas que ça existait X-D
Ce que je trouve génial avec tout ces frameworks c'est qu'on prétend gagner du temps tout en négligeant totalement le fait que ça pose des problématiques et des incompréhensions qui sont parfaitement inutiles et spécifiques à ces frameworks ^^'

En tout cas, ton code qui est sûrement typique de cakePHP est parfaitement incompréhensible pour moi malgré que je connaisse très bien PHP... Je peux imaginer ce que ça fait mais je ne sais pas comment c'est fait et je ne peux donc pas vraiment voir s'il manque quelque chose :-s

Ce qu'il faudrait que tu m'expliques c'est le cheminement des requêtes... Quand est-ce que quoi? Genre :

  • l'utilisateur se connecte au site
  • je renvoie un formulaire qui affiche ceci-cela et à pour but [...]
  • l'utilisateur submit en POST
  • je contrôle tel et tel champ
  • si ceci je fais ça sinon blah blah blah

Et $this c'est une instance de quoi???

Et ta version de cakePHP?

J'utilise la version 3.5
Pour $this est une instance de mon controller Estimation (mais la on en revint au premier message, je suis pas sur que les terme que j'emploie sont les bons...)

Apparemment il faut return le résultat de redirect...

Pour tester tu peux essayer :

<?php return $this->redirect("https://www.google.com");

vi...et je return bien la method redirect (j'ai zappé de le copié dans le message précédent)...

T'as regardé mon lien? T'as vu qu'ils parlent de "autoRender"? T'as essayé avec google?

Attend...j'ai un pdf qui se creait...oulalalala...Mais j'ai plus de données...
Je vais regarder du coté de l'autorender...J'ai du mal à comprendre les API, j ai pas le cerveau formaté comme vous, j'ai commencé trop tard j'pense :)
(Pour l'heure je fais un break, j vais chercher un ptit bout)

C'est jamais trop tard... Faut arrêter de croire que les jeunes apprennent nécessairement plus facilement ^^' Ce sont des conneries... Si tu es "vieux" je te conseille de rajeunir en pratiquant le jeûne, une semaine par ci, une semaine par là! Un organisme pas encore complètement vidé par une hygiène de vie délétère c'est tout ce dont disposent les jeunes, ce qui leur permet de présenter des capacités cognitives normales ;-)

La plasticité cérébrale est en oeuvre en permanence, à moins d'être complètement pollué par tous les poisons (café, clope, alcool, colère, peur, manque de sommeil...) qui foisonnent en occident..!

Les "vieux" sont surtout complètement épuisés! Y'a pas d'âge pour être vieux! Et de la même façon, tu peux disposer d'un cerveau parfaitement efficace à 80 ans si tu prends soin de ton corps..!
Pour te formater, étudis l'algorithmique : http://pise.info/algo/
Et la programmation orientée objet..!

Connais-tu bien MVC?

Tu vas chercher un p'tit bout..? Genre un enfant ou un truc qui se mange..? A moins que tu manges des enfants? :-s

un ti bébé...
Du coup en te lisant je me suis imaginé que j avais 70 piges...bon J en ai un peu plus de la moitié. Je disais vieux par rapport au métier de dev. Je trouve qu il y a un formatage du cerveau a avoir / a faire.
interessant le jeûne ! C est ce que je vais faire ce week end avec le PHP.
Merci pour les liens sur l algo.
Cakephp3 est basé sur le MVC.. donc oui je connais (+ ou -)...
il m arrive de faire des choses sans bien comprendre ce que je fais d un moi t de vue dev, mais je sais qu en faisant comme ça ça fonctionne...En fait il me manque quelques données pour prétendre dire : je maîtrise la situation....
Pour infos voici le site en question  sur lequel je bloc ( tout fais tout seul de AaZ) : le passage du recap de l estime a la créa du pdf
www.plurielcom.com
Have Fun

C'est pour ça que je te demandais si tu connaissais bien MVC ;-) C'est mieux pour utiliser un framework fondé sur ce DP!

Je parlais d'un jeûne de nourriture, hein ;-p

Ton cerveau se formate en permanence, en fonction de ce que tu entreprends et de la santé de ton corps ^^ Et ce jusqu'à ta mort!
J'ai personnellement débuté l'informatique à l'âge de 21 ans et j'en ai maintenant 30... Pour que ça rentre, que ton cerveau change de forme, il faut se plonger profondément dans le domaine souhaité ;-) Donc, si tu t'y mets franchement, si tu ne comprends pas tout pour le moment, ça viendra, fatalement...

Concernant ton problème, quand tu rencontres une de tes incompétences, il me semble bon d'en profiter pour y remédier :-D Pour ça, prends l'habitude de creuser les documentations, éventuellement lire le code source des parties du framework qui t'intéressent! Dans le cas présent, l'implémentation de la classe Controller et notamment de sa fonction request! Quand tu sais précisément comment ça fonctionne sous le capot, t'as moins de scrupules à appuyer sur le champignon ;-p Et surtout, tu évites de passer la marche arrière quand t'es lancé à plus de 100km/h..!

Concernant ton site, je pense que tu devrais mettre une hauteur fixe au module de témoignages, histoire que le footer arrête de sauter! :-p Que ta page ne change pas de format sans que l'utilisateur n'en soit responsable via une action consciente...

Bon week end, du coup :-)
A ton retour, n'hésite pas à m'expliquer en détails le synopsis du processus sur lequel tu travailles, genre comme un scénario de film, avec tous les détails et éventuellement des petits dessins ^^ Ca m'aidera à me mettre à ta place et à trouver la solution!

Re...
Echange intéressant...
Pour le scenario c'est très simple :
1 - je fais une estimation (peut importe les originaux)
2 - Je clic sur bon de commande qd j'ai le prix qui s affiche
3 - Je rempli les formulaires de récap de cmde
C'est ce dernier formulaire qui pose soucis. Lorsque l'on clic sur "Je valide", la redirection se fait directement sans prendre en compte les regles de validation...

Y'a du JS kek part? Il ressemble à quoi le code html de ton formulaire?

Tu peux poster ta classe Controller entière?

Mon controller :

public function order()
    {
        $metaTitle = "Récapitulatif commande";
        $metaDescription = null;
        $this->set(compact('metaTitle', 'metaDescription'));

        $resumeDatas = $this->request->data;
        $time = Time::now();
        $time->timezone = 'Europe/Paris';
        $timeFr = $time->i18nFormat('dd-MM-yyyy'.' à '.'HH:mm');
        $this->set('timeFr', $timeFr);

        if($this->request->is('post')){
            $data = $this->request->getData();

            if($data['particularOrpartner'] == 'particular'){
                $validator = new Validator();
                $validator
                ->requirePresence('Nom')
                ->add('Nom', 'length', [
                    'rule' => ['lengthBetween', 2, 100],
                    'message' => 'Au moins deux lettres doit être valide'
                ])
                ->requirePresence('Code_postal')
                ->add('Code_postal','length',[
                    'rule' => ['lengthBetween', 5, 5],
                    'message' => 'Code postal doit contenir 5 chiffres'
                ])
                ->add('Code_postal','numeric',[
                    'rule' => 'numeric',
                    'message' => 'Code postal = pas de lettre'
                ])
                ->requirePresence('Mail')
                ->add('Mail', 'validFormat', [
                    'rule' => 'email',
                    'message' => 'Email doit être valide'
                ]);

                $errors = $validator->errors($this->request->getData());
                if(empty($errors)){
                    var_dump('pas erreur');
                }else{
                    var_dump($errors);
                }
            }else if($data['particularOrpartner'] == 'partner'){
                $validator = new Validator();
                $validator
                ->requirePresence('Code_client')
                ->add('Code_client', 'length', [
                    'rule' => ['lengthBetween', 3, 100],
                    'message' => 'Au moins deux lettres doit être valide'
                ]);

                $errors = $validator->errors($this->request->getData());
                if(empty($errors)){
                    return $this->redirect(['controller'=>'estimations','action'=>'order_pdf','bon-de-commande.pdf']);
                    // debug($this);
                    var_dump('pas erreur');
                }else{
                    var_dump('errrr');
                    // var_dump($errors);
                }
            }   
        }

et le html du form

<form method="post" accept-charset="utf-8" action="/preprod/commande.html">
    <div style="display:none;"><input type="hidden" name="_method" value="POST"></div>      
    ... 
    <input type="hidden" name="particularOrpartner" value="partner">
    <div class="resumeForm row">
        <div class="col-md-6">
            <div class="form-group"><label for="">Votre code client ou nom de magasin : <span class="required">*</span></label>
                <input type="text" name="Code client" class="form-control" required="required" id="" value="Z999">
            </div>
        </div>              
    </div>
    <div class="resumeForm row">        
        <div class="col-md-6">
            <div class="form-group">
                <label for="">Nom de votre client :</label>
                <input type="text" name="Nom" class="form-control" id="">
            </div>
            <div class="form-group">
                <label for="">Code postal de votre client  :</label>
                <input type="text" name="Code postal" class="form-control" id="">
            </div>                          
            <button type="submit" class="pull-right btn btn-default"><span class="icon icon-printer"></span>Je valide</button>
        </div>
    </div>
</form>

La redirection te mène vers quelle url?

La redirection me renvoie l'url correspondant à la création du PDF.
Comme je bosse dessus là, je viens de voir que le html du form est celui-ci :

<form method="post" accept-charset="utf-8" target="_blank" action="/preprod/estimations/order-pdf/bon-de-commande.pdf"><div 

Du coup au Submit de ce Form, l'action "order_pdf" est appelée sans passer par les validations de mon controller ! :/

Voilà, c'est là où je pensais en arriver ^^' Faut que tu envoies ton form sur une route qui mène à son traitement ;-)

So ???
J'ai dans le controller une methode qui s occupe de la gestion du PDF... Mais je comprend pas bien là, avant d'envoyer les datas vers cette méthode il faut que je controlle les données du formulaire non ? Si oui, du coup cela ce fait bien dans la methode order (précédement jointe)

Oups j'ai parlé trop vite...Je comprend...
Donc du coup il n'y a pas moyen de shunté cette appel d'URL dans la form et de faire passer la validation avant ? Je pense en même temps que j'écris : pourquoi pas passer par un peu d'ajax (d'amsterdam)...

Le problème avec ces conneries de framework c'est que je ne peux jamais être bien sûr que j'ai en face de moi quelqu'un qui possède les bases :-s

Sais-tu que ton navigateur réagit à un submit de form en générant une requête en fonction des champs liés au form et qu'il l'envoie simplement à l'adresse précisée dans action? Donc, si à ladite adresse se trouve ta validation, c'est bon...

Es-tu conscient que php n'es aucunement présent dans le navigateur qui affiche tes pages? Le seul moyen de communiquer avec lui c'est de lui balancer des requêtes http...

Vi j'ai tilté et rectifié dans mon post avant ton dernier message...
ps..C'est bien qd même les frameworks :)

Donc, c'est réglé?

PS : mouais, berk ;-)

C'est réglé ?!? Non pas encore mais j'ai la route à prendre donc je posterai la solution (j'espère) qd j'aurai finalisé. :))
Merci en tous cas pour ces échanges psylozoffik

De rien ^^ Ca m'a permis de jeter un oeil furtif à cakePHP :-p Et si un jour j'ai des vieux supports magnétiques à numériser, hein ;-)