Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour
J'ai un problème lors de l'édition d'une ligne d'une table que l'on appellera 'codification'.
Ses enregistrements n'ont pas d'identifiants propres, mais sont identifiable grâce à un couple ('CDCOD'/'CLECOD').
J'ai une première vue qui liste toutes les codifications, exemple :
CDCOD CLECOD VALEUR
-------- --------- --------
ORG 1 foo
ORG 2 bar
ORG 3
CATAGT 1
CATAGT 2 foo2
.
.
.
Quand je clique sur l'un des LIBCOD, ça m'emmène vers une page d'edition du style appli/editcodif/ORG/1, grâce à :
[lang=php] <?php echo $this->url('liste', array('action' => 'editcodif','CDCOD' => $codif->CDCOD,'CLECOD' => $codif->CLECOD)); ?>
J'ai donc ma vue d'edition avec mon formulaire bindé qui fonctionne, pour ça j'ai modifié mes routes pour qu'elles acceptent le chemin appli/action/CDCOD/CLECOD.
Le setAttribut du formulaire dans la vue ressemble donc à ça :
[lang=php] $form->setAttribute('action', $this->url('liste', array('action' => 'editcodif','CDCOD' => $this->CDCOD,'CLECOD' => $this->CLECOD)));
Mon problème survient lors du submit, en effet quand je fais un dump de $this->CDCOD et $this->CLECOD sur ma vue, ils sont tous les deux à null, ce qui a pour effet de jeter une exception Row not found dans mon controlleur :
[lang=php] public function editcodifAction() { $request = $this->getRequest(); $sIdSource = ($request->isPost()) ? 'fromPost' : 'fromRoute'; $cle = $this->params()->$sIdSource('CLECOD', 0); $code = $this->params()->$sIdSource('CDCOD', 0); var_dump($cle);var_dump($code); //contiennent bien les valeurs des attributs de la route sur la page d'edition mais contiennet ensuite la valeur 0 après le submit. $codif = $this->getCodifTable()->getCodif($cle, $code); //ligne qui lance l'exception. $form = new editCodifForm(); $form->bind($codif); if ($request->isPost()) { $form->setInputFilter($codif->getInputFilter()); $form->setData(array('CLECOD' => $cle , 'CDCOD' => $code , 'LIBCOD' => $this->params()->fromPost('LIBCOD') , 'VALCOD1' => $this->params()->fromPost('VALCOD1') , 'VALCOD2' => $this->params()->fromPost('VALCOD2') )); if ($form->isValid()) { $this->getCodifTable()->saveEditedCodif($codif); } } else { $form->get('submit')->setAttribute('value', 'Editer'); return array('cle' => $cle , 'form' => $form); }
Ici, var_dump($cle);var_dump($code) contiennent bien les valeurs des attributs de la route sur la page d'edition mais contiennent ensuite la valeur 0 après le submit.
J'ai d'ailleurs du mal à appréhender ces lignes :
[lang=php] $sIdSource = ($request->isPost()) ? 'fromPost' : 'fromRoute'; $cle = $this->params()->$sIdSource('CLECOD', 0); $code = $this->params()->$sIdSource('CDCOD', 0);
J'ai donc deux questions :
Pourquoi les dump de $this->CDCOD et $this->CLECOD sur la vue me renvoient-ils null ? (Pour moi, le problème vient principalement de là )
A quoi sert le dernier morceau de code que j'ai linké ? Je me doute qu'il définit si la requête provient de la route ou du formulaire, mais dans quel cas met-il 0 dans $cle et $code ?
Merci de l'aide que vous pourrez m'apporter
Dernière modification par astro785 (17-04-2014 11:52:05)
Hors ligne
Salut, encore une fois ... L'action n'a rien à faire ailleurs que dans le router ..
Ensuite pour récupérer tes paramètres depuis l'url (mais qui sont spécifié dans la route) :
[lang=php] $this->params('nomduparam', 'valeurpardefaut');
Ca suffit. Regardes comment fonctionne le plugin params . Je sais pas où tu as chopé ton bout de code mais c'est pas conseillé de faire comme ça.
Tu peux utiliser :
[lang=php] $this->params('cle', 'valeurpardefaut') // pour récupérer depuis la route c'est un raccourci vers $this->params()->fromRoute('cle', 'valeurpardefaut'); $this->post(); // si ma mémoire est bonne te donne les infos du post $this->params->fromUrl('cle', 'valeurpardefaut'); // récupère les paramètres depuis l'url (après le ?toto=titi)
Ensuite dans ta vue c'est normal que ça fonctionne pas tu retournes jamais CDCOD et CLECOD à la vue donc logique que ça soit null
Hors ligne
Merci Orkin pour ces précisions
Pour l'action, de laquelle tu parles ? Parce que tous les morceaux de code que j'ai posté proviennent à 90% du quickstart officiel, que j'ai simplement réadapté à mes propres champs et attributs, même le :
[lang=php] $sIdSource = ($request->isPost()) ? 'fromPost' : 'fromRoute';
Alors si on peut même pas avoir confiance dans les trucs officiels
Je vais essayer de me débrouiller avec le pistes que tu m'as donné, je repasse si j'ai avancé ( ou non )
Hors ligne
Je parle des deux bouts de code qui font appel à l'aide de vue url : action => editcofi. Si t'aimes bien réécrire la même action partout alors que ça peut être fait qu'à un seul c'est ton choix .
Bah c'est peut être dans la doc mais dans ton cas tu sais que les paramètres viennent de la route même si t'es en post ils sont dans ton url de ton attribut action de ton formulaire donc ceci suffit :
[lang=php] $this->params('cle', 'valeurpardefaut'); // qui est un alias de $this->params()->fromRoute('cle', 'valeurpardefaut');
Hors ligne
C'est curieux...
1 topic sur 2, sur ce forum on retrouve [/:action] quelques part dans la discussion..
Pourtant sur la doc ça n'apparait qu'une seule petite fois,..
Hors ligne
En fait quand je me suis formé sur le ZF2 ça ne devait pas y être dans la doc du coup j'ai pris l'habitude de ne pas le faire et c'est mieux (de pas le faire). J'ai vu pas mal de monde préciser l'action dans l'url. Au final l'appli n'a qu'une seule route et pour maintenir c'est super galère. Imagines pour une raison X ou Y tu renommes l'action d'un contrôleur faut repasser sur TOUTE l'appli pour modifier tous les appels à cette action alors que dans le router c'est à un seul endroit
Hors ligne
Salut,
pardon, je passais simplement par la mais j'ai vue de la lumière et j'ai entendu des drôle d'histoire alors je suis rentrer ^^
pour le
$this->url('maroute', ['action=>'monaction])
Si tu ne veut pas l'utiliser dans les vue ou ailleurs, sa veut dire que dans le routeur tu défini une route par action ? (pas un peut lourd si tout les action d'un controller on leur paramètre en commun ? )
D'un autre coté pour quel raison renommé une action ? tu peut vouloir redéfinir une url, mais s'a n'oblige en rien de renommé le nom de l'action, non? Bon ok je cherche la petite bête, mais c'est pour bien comprendre ^^.
Pour moi c'est comme renommé le nom d'une méthode ou d'une fonction...bien obligé de repassé partout.
En faite
Hors ligne
We je suis d'accord.
Mais vu le nombre de fois que ça apparait sur le web... comment ils font pour tous utiliser cet action alors?
astro est pas le seul.
Ils devraient pas le changer sur la doc d'ailleurs? Ça éviterait pas mal de cas comme ça.
Hors ligne
En faite c'est surtout une question de "Sens".
quand t'a deux gosses, t’essaie de les personnaliser un peu chacun non?
Ou tu préfère qu'ils soient strictement pareil et vérifier à chaque fois qui est qui?
Bah la c'est pareil ^^
Tu pourrais effectivement mettre tout ton site dans la même route et à chaque fois vérifier quelle url tu a appelé.
Mais bon.. c'est chiant quoi...
Hors ligne
roft, c'est ma manie de trop vouloir factorisé ^^
Je considère que dans un même controller, tout le monde a besoin des même paramètre, sinon y'a des jaloux, sa se dispute, et je me sent obligé de distribuer des baffs pour leur apprendre a partager ^^
si mes action son mes gosses, c'est pas parce que je leur donne la même chose a mangé que je ne les personnalisé pas, il ne font pas du tout la même chose :p
Je ne trouve pas utile d'appeler un parametre identifiant "nomRené" pour une action et un autre identifiant "nomFrancis" pour une autre, je l'appelle "nom" et j'optidrai respectivement les valeur "René" et "Francis" (bon ok pas parlant mais c'est pour rester dans le thème ^^).
Et si je veut des parametre qui leur sont propre -> child_routes!
Dans mon controller je peut ainsi faire des methode getNom(), getId(), getMetpasTesCoudeSurLaTableNomMaisHo(). Je trouvai sa censé jusqu'ici
Hors ligne
En fait quand tu renommes une fonction l'IDE est capable de retrouver les appels à cette fonction et les modifier partout. Pour les actions c'est un peu différent parce que tu mélanges des chaines de caractères dans des tableaux via de la conf et des noms de fonction.
Après tu fais comme tu veux si tu préfères faire comme ça tu peux mais c'est moins pratique. C'est plus performant de faire plein de route qu'une seule grosse . Surtout si tu utilises les priorités et tout. Mais oui tu vas te retrouver avec plein de routes comme ceci :
/user (route mère)
/user/consult/:id
/user/edit/:id
/user/add
/profil
/profil/consult/:id
/profil/edit/:id
/profil/add
Hors ligne
Je peux pas trop rebondir sur le débat vu que je suis encore un peu dans les choux, ça n'est que mon premier projet avec Zend, et malgrès tout je commence à entrevoir les différentes possibilités, le gain de temps en dev et en maintenance qu'il pourrait m'apporter, donc les erreurs que je fais maintenant je ne les referai pas dans un prochain projet
Ca sort complétement du sujet ( quoi que ), mais pour l'ajout d'une codification dont le CDCOD existe déjà, je dois calculer le MAX de mon champs CLECOD pour pouvoir l'insérer correctement (ben oui), est ce que quelqu'un qui utilise ou a utilisé Zend/Db peut me dire comment je peux faire ça ?
Ca fait des heures que j'essaye, et je n'arrive pas à trouver
Pour le moment j'ai ça :
[lang=php] public function getMax($code) { $sql = new Sql($this->adapter); $select = $sql->select(); $select->columns(array(new Expression('max(CLECOD) as CLECOD')))->where->equalTo('codif.CDCOD', $code); $rowset = $this->selectWith($select); if (!$row = $rowset->current()) { throw new \Exception('Row not found'); } return $row; }
C'est là que je regrette de pas avoir intégré Doctrine dès le départ
Dernière modification par astro785 (17-04-2014 17:38:01)
Hors ligne
C'est là que je regrette de pas avoir intégré Doctrine dès le départ big_smile
Tu la dit bouffie, Doctrine ma mis une semaine la tête dans le chou mais depuis je regrette vraiment, mais alors vraiment pas! Alors que je ne le maîtrise encore pas complètement et loin de la ^^
Si tu a du temps pour te formé comme ce fu mon cas (j'insite car c'est consomateur de temps quand même) , je te conseille de te penché dessus, mais attention tu va nagé dans le paté quelque heure au début! après, sa devient l'imbide comme de l'eau de roche.
Dernière modification par Splyf (18-04-2014 09:49:45)
Hors ligne
Perso j'ai commencé Zend avec doctrine direct (pas eu le choix arrivé en stage paf.. xD)
Je saurais même pas faire sans enfait.. xD
alors t'a pas besoin de equalto:
[lang=php] ->where(array('codif.CDCOD'=> $code))
après je suis pas sur, mais j'ai pas l'impression que tu lui ai dit dans quelle table chercher ton max(****), j'utilise pas le sql adapter, mais tu doit avoir quelque chose comme : $sql->from('ma_table')
Pour revenir vite fait sur le débat (inutile mais bon.. =d)
donner la même route à deux "gosses" c'est pas juste les faire manger les mêmes choses. c'est aussi les habits, la coiffure, le sac à dos et tout...
Alors toi ça te dérangera p'tet pas (si si c'est possible)
Mais bon.. pense à eux... Ils seront plus heureux si tu leurs offre un jouet chacun
Hors ligne
+1 pour le eQualTo et le from('matable'), mais concrètement quel est le problème? quel sont les messages d'erreur? le résultat afficher? sa pourrai aidé
Pour le débat, je ne remettait pas en question pour faire le malin, mais pour bien comprendre, on est plus efficace ainsi que quand on applique bêtement ^^
Allez op, je pense qu'il faut que je mette en application pour voir l'avantage, la pratique vos parfois mieux qu'un master universitaire ^^
Hors ligne
Orkin a écrit:
En fait quand je me suis formé sur le ZF2 ça ne devait pas y être dans la doc du coup j'ai pris l'habitude de ne pas le faire et c'est mieux (de pas le faire). J'ai vu pas mal de monde préciser l'action dans l'url. Au final l'appli n'a qu'une seule route et pour maintenir c'est super galère. Imagines pour une raison X ou Y tu renommes l'action d'un contrôleur faut repasser sur TOUTE l'appli pour modifier tous les appels à cette action alors que dans le router c'est à un seul endroit
Dans netbeans :
Edit -> replace in projects
$this->url('toto', ['action' => 'actionX']);
par
$this->url('toto', ['action' => 'actionY']);
Vive l'informatique.
Hors ligne
Nan mais bouks, on à jamais dit que c'était pas possible, chacun fait comme il veut, mais sémantiquement parlant...
Il y a plus de sens à ne pas mettre la paramètre action dans ta route plutot que dans ton controleur enchainner les if pour savoir quoi afficher, ou quelle action faire.
Hors ligne
flobrflo a écrit:
... dans ton controleur enchainner les if pour savoir quoi afficher, ou quelle action faire.
Mais de quoi parles-tu ?
Je n'ai jamais eu besoin d’enchaîner des if ?
Tu as un exemple parce que ta réponse me surprends énormément ?
Effectivement chacun fait comme il veut. Moi je préfère développer que pisser de la conf au kilomètre.
Dernière modification par Bouks (18-04-2014 16:11:36)
Hors ligne
bah chais pas un truc tout con:
sur une route de type:
mondomaine.com/produit[/:action]/id
tu va avoir dans ton controlleur:
[lang=php] interagirProduitaction(){ $action = ... if($action = add){ addproduct; afficher success/afficher fail } else if ($action = edit){ editProduct afficher fail/ afficher success } else if($action == delete){ deleteProduct afficher fail/ afficher success } else if ($action = moove){ ... ...
à lire c'est chiant, à écrire t'imagine pas.. xD
Fin bon tu vois l'idée.
EDIT : marrant delete s'affiche d'une autre couleur =o
Dernière modification par flobrflo (18-04-2014 16:18:27)
Hors ligne
Non je ne vois pas du tout l'idée.
Pourquoi tu n'utilises tout simplement pas des fonctions 'addAction', 'editAction", etc. ????
Hors ligne
[lang=php] interagirProduitaction(){ $action = ... if($action = add){ addAction(); } else if ($action = edit){ editAction(); } else if($action == delete){ deleteAction(); } else if ($action = moove){ ... ...
genre ça?
Hors ligne
Non genre :
[lang=php] public function addAction(){ // ajouter un produit } public function editAction(){ // éditer un produit } // etc.
Tout simplement.
Je ne vois pas à quoi sert ta fonction interagir...
Dernière modification par Bouks (18-04-2014 16:30:29)
Hors ligne
Eu non je pense que t'es dans les choix là :p.
L'action dans le paramètre url sert justement à indiquer quel action tu vas appeler dans ton contrôleur. Donc pas d'étape if/else. C'est juste que c'est chiant à refactorer mais toujours possible effectivement en analysant le projet. Là le problème c'est surtout que les routes sont pas découpées et que tu perds du temps à réécrire la même action partout.
Hors ligne
Orkin a écrit:
tu perds du temps à réécrire la même action partout.
C'est à dire ?
Hors ligne
AH mais we chui trop con lol.
fin de journée dur dur.. xD
Hors ligne