Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai deux modules (user et city), je veux récupérer les villes dans un champ select dans le module user.
Y-a-t il un tuto qui me montre ça ?
Merci.
Dernière modification par zizou86 (13-11-2013 11:28:46)
Hors ligne
Salut, tu peux faire ça nativement en utilisant le composant select de doctrine . Sinon tu dois passer les données à ton composant select soit directement dans le formulaire soit depuis le contrôleur sous forme d'un array.
Hors ligne
Merci pour vous,
oui je veux le passer directement dans le formulaire mais je ne sais pas comment, donner moi un exemple d'une des solutions que vous m'avez proposé.
Merci.
Hors ligne
Sans utiliser doctrine je ne l'ai jamais fait donc je ne pourrais pas te dire.
Par contre tu peux avoir des pistes en implémentant l'interface ServiceLocatorAwareInterface qui te permet d'avoir accès au service locator dans ton composant formulaire. Avec ça tu dois pouvoir appeler le service qui te retourne ce dont tu as besoin.
Hors ligne
Salut,
soyez indulgent c'est la première réponse que je donne pour essayer d'aider quelqu'un....
tout d'abord il te faut un fichier php pour ton formulaire exemple :
<?php namespace Player\Form; use Zend\Form\Form; use Zend\Form\Element; class PostPlayerForm extends Form { public function prepareElements($personnes){ $form_id = new Element\Hidden('form_id'); $csrf = new Element\Csrf('form_csrf'); $csrf->setOptions(array('csrf_options' => array('timeout' => 600))); $form_name = new Element\Text('form_name'); $form_name->setLabel(Name : '); $form_name->setAttributes( array( 'id' => 'form_name', 'required' => true, 'placeholder' => 'Saisissez le nom.', ) ); $personnes_associes = new Element\Select('personnes_associes'); $personnes_associes->setLabel('Personnes Associées :'); $personnes_associes->setOptions(array( 'empty_option' => null, 'value_options' => $personnes, )); $submit = new Element\Submit('submit'); $submit->setAttributes( array( 'value' => 'Ajouter', ) ); //Ajout des éléments au formulaire $this->add($form_id) ->add($csrf) ->add($form_name) ->add($personnes_associees) ->add($submit); } } ?>
ensuite lorsque tu créer ton formulaire depuis ton controller tu fais :
$form = new PostPlayerForm(); //ici tu récupère un tableau (Clé/Valeur) qui correspond à ce que tu souhaite avoir dans ton select $personnes = $this->getServiceLocator()->get('Personnes'); $form->prepareElements($personnes);
ou alors tu peux passer par une factory qui implement la FactoryInterface et qui te permet de récupérer le serviceManager.
Voila j'espère que cela t'aidera si quelqu'un à des remarques je suis preneur car on s'améliore tout les jours.
Cordialement
Hors ligne
Salut, merci shishi pour ton retour .
Tu peux aussi utiliser une fabrique pour créer ton formulaire c'est plus propre je trouve (définition sous forme d'un array).
Pour le reste tu peux soit passer les données dans le contrôleur comme ceci :
[lang=php] $data = $this->getServiceLocator('monService')->getMyDataToArray(); $form = $this->getServiceLocator('formElementManager')->get('monFormulaire'); $form->get('monComposantSelect')->setValueOptions($data); // Je ne me souviens plus du nom exact de la méthode
Tu peux aussi directement appeler le service 'monService' dans ton formulaire si tu implémente l'interface ServiceLocatorAwareInterface et mettre le retour de getMyDataToArray() dans value_options comme l'a montré shishi plus haut.
Hors ligne
Merci bien pour tous le monde.
Hors ligne
Je me permet de up ce sujet qui me concerne actuellement
( preuve que je fais des recherches sur le forum avant de poster n'importe quoi aussi )
J'ai donc moi aussi besoin de remplir un select avec des infos qui se trouvent dans ma bdd, pour ça je pense qu'il faut obligatoirement que je le fasse dans le form, pour qu'après mon controlleur puisse bindé correctement ce champs select.
J'ai donc implémenté l'interface ServiceLocatorAwareInterface :
[lang=php] class LocalisationForm extends Form implements ServiceLocatorAwareInterface { ... }
Déjà, il me demande d'implémenter deux méthodes supplémentaires ou de rendre ma classe abstract, chose normal quand on implémente une interface.
Ces deux méthodes sont donc :
[lang=php] public function getServiceLocator() { } public function setServiceLocator(\Zend\ServiceManager\ServiceLocatorInterface $serviceLocator) { }
Sachant que pour moi, la finalité serait de faire quelque chose comme ça :
[lang=php] class LocalisationForm extends Form implements ServiceLocatorAwareInterface { public function getCodifTable() { return $this->getServiceLocator()->get('Liste\Model\CodifTable'); // Fonction me permettant de me servir des requêtes présentes dans CodifTable } $listeorgs = $this->getCodifTable()->getListeOrg(); // requête $orgArray = array(); foreach ($listeorgs as $org) { $orgArray[$org->CLECOD]=$org->LIBCOD.'-'.$org->VALCOD1.'-'.$org->VALCOD2; } $this->add(array( 'type' => 'Zend\Form\Element\Select', 'name' => 'IDORG_', 'options' => array( 'value_options' => $orgArray, // tableau contenant chacune des clefs et des valeurs que je veux attribuer aux options ) )); }
A l'heure actuelle je ne sais pas quoi mettre dans les deux fonctions à ajouter suite à l'implémentation ServiceLocatorAwareInterface, elles sont donc restée vides et quand j'essaye de charger ma vue avec mon formulaire, j'obtiens ce message d'erreur :
Call to a member function get() on a non-object in C:\wamp\www\sial\module\Liste\src\Liste\Form\LocalisationForm.php on line 10
Encore une fois merci pour la future aide apportée, j'apprécie
Hors ligne
Le message de shishi au dessus devrait correspondre à ce don tu a besoin non?
Externaliser ton servicelocator pour le laisser dans le controller et tu initialise les valeurs avec un "prepare"
Hors ligne
Oui je pense que c'est comme ça que je dois faire effectivement, mais ça ne va pas rentrer en conflit avec mon __construct ?
Mon form ressemble à ça actuellement :
[lang=php] <?php namespace Liste\Form; use Zend\Form\Form; class LocalisationForm extends Form { public function __construct($name = null) { // we want to ignore the name passed parent::__construct('liste'); $this->setAttribute('method', 'post'); $this->add(array('name' => 'IDSITE', 'attributes' => array('type' => 'hidden'))); $this->add(array('name' => 'IDLOC', 'attributes' => array('type' => 'hidden'))); $this->add(array( 'type' => 'Zend\Form\Element\Select', 'name' => 'IDTYPLOC_', 'options' => array( 'value_options' => array( '1' => 'Niveau 1', '2' => 'Niveau 2', '3' => 'Rez de Chaussée', '5' => 'Tous niveaux', '6' => 'Niveau 7', '7' => 'Niveau -2', '8' => 'Niveau -1', '9' => 'Niveau 3', '10' => 'Niveau 4', '11' => 'Rez de Chaussée et Niveau 1', '17' => 'Bureau de l\'Opposition', '18' => 'Niveau 5', '19' => 'Niveau 6', '20' => 'Mézzanine', ), ) )); $this->add(array( 'type' => 'Zend\Form\Element\Select', 'name' => 'IDORG_', 'options' => array( 'value_options' => array( '-1' => 'Type d\'ORG', // à remplacer par les resultats de la requête ), ) )); $this->add(array('name' => 'SURFTOT', 'attributes' => array('type' => 'text'), )); $this->add(array('name' => 'PLACEVL', 'attributes' => array('type' => 'text'), )); $this->add(array('name' => 'LINARCHIVES', 'attributes' => array('type' => 'text'), )); $this->add(array('name' => 'PLACEPK', 'attributes' => array('type' => 'text'), )); $this->add(array('name' => 'OBSLOC', 'attributes' => array('type' => 'textarea'), )); $this->add(array('name' => 'LIENPLAN', 'attributes' => array('type' => 'text'), )); $this->add(array( 'type' => 'Zend\Form\Element\Checkbox', 'name' => 'ACCHANDI', 'options' => array( 'use_hidden_element' => true, 'checked_value' => 'O', 'unchecked_value' => 'N' ) )); $this->add(array( 'type' => 'Zend\Form\Element\Radio', 'name' => 'TRANSFER', 'options' => array( 'value_options' => array( array('label' => 'Oui ', 'value' => 'O'), array('label' => 'Non ', 'value' => 'N'), array('label' => 'Peut-être', 'value' => 'B'), ), ), 'attributes' => array( 'value' => '1' ) )); } }
Dernière modification par astro785 (30-04-2014 14:10:58)
Hors ligne
Et bien tu n'est pas obliger de tout mettre dans le construct
tu peu mettre une autre fonction pour rajouter des champs supplémentaire
Hors ligne
astro785 a écrit:
Déjà, il me demande d'implémenter deux méthodes supplémentaires ou de rendre ma classe abstract, chose normal quand on implémente une interface.
Tu peux utiliser ServiceLocatorAwareTrait pour éviter d'avoir à les implémenter toi même . Et c'est un getter/setter.
Hors ligne
Bonjour à tous !
Voilà je sollicite vivement votre aide aujourd'hui car je rencontre un problème plutôt... Fâcheux !!!
Je suis en train de créer une application Zend 2, pour l'instant j'ai deux modules dissociés :
- role
- groupe
Je créer un formulaire qui me permet de créer un rôle hors, il me faut remplir un select avec les roles contenus dans la table rôle.
Mes questions sont donc :
- Est ce possible ?
- Dans quel fichier dois mettre le code afin de garder une architecture organisée
- Puis je le faire au moyen du tableGateway qu'implémente mon controller de groupe ?
Je suis réellement perdu et après avoir cherché et essayé diverses solutions, je tourne en rond !!!
Quelqu'un pourrait il m'aider ?
Hors ligne
Hello
Et bien effectivement c'est possible ^^
Je pense que tu devrais mettre la récupération des infos bdd dans ton formulaire ( directement à la déclaration du select, pourquoi pas ^^ )
pour bien faire je te conseil de te pencher sur les message de shishi et d'Orkin du 12-11-2013, c'est un exemple bien illustré
Hors ligne