Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 10-11-2013 09:36:57

zizou86
Membre
Date d'inscription: 22-05-2009
Messages: 48

[Résolu] Remplir un SELECT a partir de la BDD

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

 

#2 11-11-2013 00:24:19

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] Remplir un SELECT a partir de la BDD

Salut, tu peux faire ça nativement en utilisant le composant select de doctrine smile. 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

 

#3 11-11-2013 14:09:38

zizou86
Membre
Date d'inscription: 22-05-2009
Messages: 48

Re: [Résolu] Remplir un SELECT a partir de la BDD

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

 

#4 12-11-2013 01:30:55

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] Remplir un SELECT a partir de la BDD

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

 

#5 12-11-2013 17:44:26

shishi
Membre
Date d'inscription: 17-03-2013
Messages: 67

Re: [Résolu] Remplir un SELECT a partir de la BDD

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 :

Code:

<?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 :

Code:

$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

 

#6 13-11-2013 11:12:13

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] Remplir un SELECT a partir de la BDD

Salut, merci shishi pour ton retour smile.

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 :

Code:

[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

 

#7 13-11-2013 11:28:18

zizou86
Membre
Date d'inscription: 22-05-2009
Messages: 48

Re: [Résolu] Remplir un SELECT a partir de la BDD

Merci bien pour tous le monde.

Hors ligne

 

#8 30-04-2014 13:40:00

astro785
Membre
Date d'inscription: 08-04-2014
Messages: 40

Re: [Résolu] Remplir un SELECT a partir de la BDD

Je me permet de up ce sujet qui me concerne actuellement smile

( preuve que je fais des recherches sur le forum avant de poster n'importe quoi aussi tongue )

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 :

Code:

[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 :

Code:

[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 :

Code:

[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 wink

Hors ligne

 

#9 30-04-2014 13:57:29

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] Remplir un SELECT a partir de la BDD

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

 

#10 30-04-2014 14:10:37

astro785
Membre
Date d'inscription: 08-04-2014
Messages: 40

Re: [Résolu] Remplir un SELECT a partir de la BDD

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 :

Code:

[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

 

#11 30-04-2014 14:26:38

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] Remplir un SELECT a partir de la BDD

Et bien tu n'est pas obliger de tout mettre dans le construct smile

tu peu mettre une autre fonction pour rajouter des champs supplémentaire

Hors ligne

 

#12 30-04-2014 18:10:07

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu] Remplir un SELECT a partir de la BDD

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 wink. Et c'est un getter/setter.

Hors ligne

 

#13 13-11-2014 12:37:13

Is_Lo
Nouveau membre
Date d'inscription: 06-11-2014
Messages: 3

Re: [Résolu] Remplir un SELECT a partir de la BDD

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

 

#14 13-11-2014 14:11:55

flobrflo
Membre
Lieu: Marseille
Date d'inscription: 26-04-2013
Messages: 376

Re: [Résolu] Remplir un SELECT a partir de la BDD

Hello smile

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é smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages