Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Récupérer la valeur d'un Zend_Form element au sein d'un objet Zend_Form
    Bonjour, j'ai besoin de loader une liste de type Zenf_Form_Element_Select,
    Le souci, je dois afficher cette liste en fonction de la valeur d'un des éléments.
    Mais je ne sais pas comment récupérer la valeur de ce dernier au sein de mon Zend_Form. voici mon code (je précise que je suis en mode "édition" ce qui signifie que mon formulaire est déjà peuplé par des datas provenant de la BD, ceci depuis le controller):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    class Backend_Form_Role extends App_Form
    {
    	public function __construct($options = null)
        {
            parent::__construct($options);
     
            $this->setMethod('post')
        		 ->setAttrib('id', 'backendform1');
     
            $id_role = new Zend_Form_Element_Hidden('id_role');
     
        	$nom_role = New App_Form_Element_Text('nom_role');
    				$nom_role->setLabel('Nom du role')
    					->setAttrib('id','nom_role')
    					->setAttrib('size','150');
     
     
    		$id_parent = New Zend_Form_Element_Select('id_parent');
    				$id_parent->setLabel('Hérite de :')
    				->setAttrib('id','id_parent')
    				->setAttrib('style','width:150px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Sélectionner');
    				$roleMapper = new Backend_Model_RoleMapper();
    				$arrListeRoles = $roleMapper->fetchAllWithExclude($id_role->getValue(),true);
    				$countListeRoles = count($arrListeRoles);
    				if($countListeRoles){
    					for($i=0;$i<$countListeRoles;$i++){
    						$id_parent->addMultiOption($arrListeRoles[$i]['id_role'], $arrListeRoles[$i]['nom_role']);
    					}
    				}
     
    		$granted = New Zend_Form_Element_Select('granted');
    				$granted->setLabel('Granted')
    				->setAttrib('id','granted')
    				->setAttrib('style','width:75px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Non')
    				->addMultiOption(1, 'Oui');
     
           $submit = new App_Form_Element_Submit('Valider');
            $submit->setAttrib('id', 'send')
                    ->addDecorator('HtmlTag', array('tag' => 'p', 'id' => 'submit-wrap'));
     
     
            $element = array(
                    $id_role, 
                    $nom_role,
    				$id_parent,
            		$granted,
    				$submit    
                   );
     
            $this->addElements($element);
        }
     
    }
    mais
    $id_role->getValue()
    n'est pas remplie !

    D'avance, merci pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Bonsoir,
    Les informations ne sont pas chargées dans le constructeur, ça permet seulement de créer les éléments qui composent le formulaire.

    D'ailleurs, à l'endroit où tu édites, tu dois surement faire un populate, du coup tu as ta réponse, c'est au niveau du populate que tu dois travailler.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonsoir et merci pour ta réponse, mais malheureusement ça ne me dit pas comment faire, j'ai cherché pendant très très longtemps, aurais tu la syntaxe à me donner si je dois faire quelque chose dans le controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ....
    $resultSet = $mapper->findtoArray((int) $id);
    	if (is_array ($resultSet)){
    	$form->populate ($resultSet);
    	return;
    ....
    Que dois je rajouter pour pouvoir utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    .....
    class Backend_Form_Role extends App_Form
    .....
     $id_role = new Zend_Form_Element_Hidden('id_role');
    .....
    $id_parent = New Zend_Form_Element_Select('id_parent');
    				$id_parent->setLabel('Hérite de :')
    				->setAttrib('id','id_parent')
    				->setAttrib('style','width:150px;margin:0 0 15px 0')
    				->addMultiOption(valeur_de_id_role, 'Sélectionner');
    				$roleMapper = new Backend_Model_RoleMapper();
    				$arrListeRoles = $roleMapper->fetchAllWithExclude(0,true);
    				$countListeRoles = count($arrListeRoles);
    				if($countListeRoles){
    					for($i=0;$i<$countListeRoles;$i++){
    						$id_parent->addMultiOption($arrListeRoles[$i]['id_role'], $arrListeRoles[$i]['nom_role']);
    	}
    }
    Pour remplace "valeur_de_id_role" par la valeur de $id_role ?
    D'avance merci pour ton aide

  4. #4
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Bonsoir,
    Je t'ai dis de regardé au niveau de la méthode populate de ton formulaire plutot que dans le constructeur.

    Viens nous voir quand tu auras commencer.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour,
    Je t'ai dis de regardé au niveau de la méthode populate de ton formulaire plutot que dans le constructeur.
    D'ailleurs, à l'endroit où tu édites, tu dois surement faire un populate, du coup tu as ta réponse, c'est au niveau du populate que tu dois travailler.
    Désolé mais je ne comprends pas de quoi tu parles, qu'est ce que tu appelles le populate du formulaire : s'agit-'il de mon objet "class Backend_Form_Role" ? qu'appelles tu le constructeur ?

  6. #6
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Bonsoir,
    On va commencer par le commencement donc.
    Peux tu nous faire voir le code de l'action où tu utilises le formulaire ?

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonsoir, voici le code du Controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    public function editAction() 
    	{
    		$this->view->Success = false;
    		$this->view->traitement = '';
     
    		$this->view->arrParamsPage = $this->getRequest()->getParams();
     
    		$format = $this->getRequest()->getParam('format','html');
    		$page   = $this->getRequest()->getParam('page',1);
     
    		$id = $this->getRequest ()->getParam ('id', 0);
     
    		$this->view->Titre = ($id == null) ? $this->_introInsert : $this->_introEdit .' : ' . $id;
     
    		$form = new Backend_Form_Role();
    		$urlSohrt =  '/' . $this->_module .'/'. $this->_controller . '/edit/format/' . $format . '/page/' . $page;       
    		$url = App_Tools::getBaseUrl() . $urlSohrt;
     
        	$form->setAction($url);
     
    		$this->view->form = $form;
     
    		$mapper = new Backend_Model_RoleMapper();
     
    		try {
     
    			$resultSet = $mapper->findtoArray((int) $id);
     
    			if (is_array ($resultSet)){
     
    				$form->populate ($resultSet);
    				return;
    			} else {
     
    				if ($this->getRequest()->isPost()){
     
    					$formData = $this->getRequest()->getPost();
     
    					if ($form->isValid($formData)){
    						$model = new Backend_Model_Role($form->getValues());							
    						$retour = $mapper->save($model, $form);
    						$this->view->Success = true;
            				$this->view->formMessage = ($this->_successMessage);
            				$this->_redirect($urlSohrt . '/id/' . $retour . '?traitement=ok');
    					} else {
    					    $form->populate ($formData);
    					    $this->view->traitement = 'pasok';
    						$this->view->formMessage = ($this->_echecMessage);
    						$this->_redirect($urlSohrt . '/id/' . $retour . '?traitement=pasok');
    					}
    				}
    			}
    		} catch ( Zend_Exception $e) {
    			echo $e->getMessage();
    			return;
    		}	
    	}

  8. #8
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Donc, ça confirme bien ce que je disais.
    Dans ton action tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $form->populate ($resultSet);
    La méthode populate comme son nom l'indique permet de parser le formulaire avec les données passées en paramètre sous forme de tableau.

    Du coup, le comportement spécifique que tu cherche à faire en fonction d'une valeur passé doit être fait au niveau de cette méthode.

    Il faut donc que tu surcharges la méthode populate dans ton formulaire

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Merci beaucoup 5h4rk pour tes réponses, mais je crois qu'on ne se comprend pas, je n'ai pas dit que ce que tu disais ne tenait pas la route, j'ai bien compris qu'il faut que je surcharge le populate de mon objet Zend_Form, ma question n'est pas celle là, ma question est Comment je le surcharge, j'ai déjà cherché comment faire, mais je n'y suis pas parvenu, d'où ma question sur ce forum. Sinon je l'aurais fait depuis longtemps. J'ai tenté de le surcharger, mais à cause d'un problème de paramètres je n'arrive pas à le faire. C'est pour ça que j'ai besoin d'aide en fait. Je ne discute aucunement le fait de surcharger le populate de Zend_Form

    Donc en résumant, avec le code que je t'ai montré, pourrais-tu me montrer comment tu fais pour parvenir à ce que tu dis avec le code du populate. D'avance merci pour ton aide.

  10. #10
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Le but n'est pas de faire à ta place mais que tu comprennes.
    Je t'invite donc à regarder la méthode populate directement dans dans la librairie Zend.

    C'est trés simple a faire tu ne devrais avoir aucun problème à réaliser cette opération.
    Une fois commencer reviens vers nous.

    Je rapelle que nous ne sommes pas là pour faire les choses à vos places

    Edit : je rajoute les informations suivantes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        /**
         * Populate form
         *
         * Proxies to {@link setDefaults()}
         *
         * @param  array $values
         * @return Zend_Form
         */
        public function populate(array $values)
        {
            return $this->setDefaults($values);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        /**
         * Set default values for elements
         *
         * Sets values for all elements specified in the array of $defaults.
         *
         * @param  array $defaults
         * @return Zend_Form
         */
        public function setDefaults(array $defaults)
        {
            $eBelongTo = null;
     
            if ($this->isArray()) {
                $eBelongTo = $this->getElementsBelongTo();
                $defaults = $this->_dissolveArrayValue($defaults, $eBelongTo);
            }
            foreach ($this->getElements() as $name => $element) {
                $check = $defaults;
                if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) {
                    $check = $this->_dissolveArrayValue($defaults, $belongsTo);
                }
                if (array_key_exists($name, $check)) {
                    $this->setDefault($name, $check[$name]);
                    $defaults = $this->_dissolveArrayUnsetKey($defaults, $belongsTo, $name);
                }
            }
            foreach ($this->getSubForms() as $name => $form) {
                if (!$form->isArray() && array_key_exists($name, $defaults)) {
                    $form->setDefaults($defaults[$name]);
                } else {
                    $form->setDefaults($defaults);
                }
            }
            return $this;
        }
    Donc c'est la méthode setDefaults qu'il faut que tu surcharge ou populate.

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour et merci pour ta réponse, si je puis me permettre, c'est pas parce que je demande un exemple concret sur UNE méthode car je n'arrive pas à voir où tu veux en venir que je veux tu fasses TOUT le travail à ma place. Et désolé j'ai regardé la méthode populate, mais je n'ai toujours pas compris comment faire, cependant j'ai trouvé enfin un exemple CONCRET de ce que je veux faire, je vais analyser la façon de faire : http://jamandcheese-on-phptoast.com/...-in-zend_form/ je ferai un retour avec la correction trouvée si cela peut aider quelqu'un.

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Nouveaux éléments
    Bonsoir,
    Sur la base de l'exemple, voici où j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    class Backend_Form_Role extends App_Form
    {
    	public function __construct($options = null)
        {
            parent::__construct($options);
     
            $this->setMethod('post')
        		 ->setAttrib('id', 'backendform1');
     
            $id_role = new Zend_Form_Element_Hidden('id_role');
     
        	$nom_role = New App_Form_Element_Text('nom_role');
    				$nom_role->setLabel('Nom du role')
    					->setAttrib('id','nom_role')
    					->setAttrib('size','150');
     
     
    		$id_parent = New Zend_Form_Element_Select('id_parent');
    				$id_parent->setLabel('Hérite de :')
    				->setAttrib('id','id_parent')
    				->setAttrib('style','width:150px;margin:0 0 15px 0');
     
    		$granted = New Zend_Form_Element_Select('granted');
    				$granted->setLabel('Granted')
    				->setAttrib('id','granted')
    				->setAttrib('style','width:75px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Non')
    				->addMultiOption(1, 'Oui');
     
           $submit = new App_Form_Element_Submit('Valider');
            $submit->setAttrib('id', 'send')
                    ->addDecorator('HtmlTag', array('tag' => 'p', 'id' => 'submit-wrap'));
     
     
            $element = array(
                    $id_role, 
                    $nom_role,
    				$id_parent,
            		$granted,
    				$submit    
                   );
     
            $this->addElements($element);
        }
     
        protected function _modifyElements($values)
        {
        	$id_parent = New Zend_Form_Element_Select('id_parent');
    				$id_parent->setLabel('Hérite de :')
    				->setAttrib('id','id_parent')
    				->setAttrib('style','width:150px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Sélectionner');
    				$roleMapper = new Backend_Model_RoleMapper();
    				$arrListeRoles = $roleMapper->fetchAllWithExclude($values['id_role'],true);
    				$countListeRoles = count($arrListeRoles);
    				if($countListeRoles){
    					for($i=0;$i<$countListeRoles;$i++){
    						$id_parent->addMultiOption($arrListeRoles[$i]['id_role'], $arrListeRoles[$i]['nom_role']);
    			}
    		}
    		//$_valeurs = $id_parent->getAttribs();
    		//$valeurs = $_valeurs['options'];
    		return $id_parent;
        }
     
        public function populate(array $values)
        {
        	$values = $this->_modifyElements($values);
        	return parent::populate($values);
        }
    }
    Mais malheureusement j'ai un message d'erreur :
    Catchable fatal error: Argument 1 passed to Zend_Form::populate() must be an array, object given, called in ...\modules\backend\forms\Role.php on line 79 and defined in C:\Program Files\Zend\ZendServer\share\ZendFramework\library\Zend\Form.php on line 2039
    J'y suis presque mais je bloque à nouveau, car je n'arrive pas à passer mon objet, par contre quand je fais un Zend_Debug::dump de la value que je reçois, j'ai les bonnes valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $arrListeRoles = $roleMapper->fetchAllWithExclude($values['id_role'],true);
    Zend_Debug::dump($arrListeRoles);exit;
    Cela fonctionne, car je suis sur le rôle Rédacteur, il me l'a bien enlevé de la liste, donc mon objet SELECt est bien alimenté par les bonnes valeurs, par contre je n'arrive pas à les repasser à mon formulaire, car il attends un Array(), mais quand je renvoie qu'un Array() il me dit qu'il ne connait pas $values, donc je suis encore bloqué. Je continue différente pistes, si je ne trouve pas, et que personne n'a de d'aide à m'apporter, je vais clôturer le topic, tant pis. Mais je suis sûr que ça peut aider d'autres personnes cette discussion.

    array(3) {
    [0] => array(4) {
    ["id_role"] => string(1) "3"
    ["nom_role"] => string(9) "Stagiaire"
    ["id_parent"] => string(1) "0"
    ["granted"] => string(1) "0"
    }
    [1] => array(4) {
    ["id_role"] => string(1) "4"
    ["nom_role"] => string(7) "Invité"
    ["id_parent"] => string(1) "2"
    ["granted"] => string(1) "1"
    }
    [2] => array(4) {
    ["id_role"] => string(1) "5"
    ["nom_role"] => string(14) "Administrateur"
    ["id_parent"] => string(1) "0"
    ["granted"] => string(1) "1"
    }
    }

  13. #13
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Donne moi un exemple complet de ce que tu veux faire.

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Je travaille sur un Backend, je suis sur la partie de la gestion des rôles, et je suis en train de mettre en place la notion d'héritage des ACL.
    Quand je suis sur le formulaire de la gestion des rôles, j'ai le nom du rôle, et je veux mettre en place une liste déroulante du rôle Parent. Prenons mon cas présent, j'ai les rôle Administrateur, Rédacteur et Stagiaire. J'aimerai que pour chaque rôle, on puisse choisir, si besoin, un rôle parent MAIS en excluant le rôle sur lequel on est.
    Autrement dit, si je suis par exemple sur le rôle Rédacteur, je veux pouvoir peupler uniquement la liste déroulante des rôles parents avec "Administrateur" et "Stagiaire" donc en excluant "Rédacteur" : c'est juste ce que je veux. je précise que j'ai déjà laméthode dans mes Models qui me permettent de faire cette opération :
    $roleMapper->fetchAllWithExclude(id_role_a_exclure,true);
    Cette méthode fonctionne très bien, j'envoie l'ID du rôle à exclure, et la méthode me retourne un Array() des rôles disponibles. Le problème est que j'aimerai peupler cette liste de façon intelligente, et je n'y arrive pas. Je veux juste être capable de transmettre l'Id du rôle à supprimer à mon SELECT.

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut Solution trouvée !!!
    Finalement, j'ai fini par trouver la solution, grâce à mon petit stagiaire Pierre
    Pas besoin de surcharger quoique ce soit, il suffit d'utiliser le constructeur de Zend_Form,: "$options" qui porte bien mal son nom, il aurait dû s'appeler "$params". En effet, il suffit d'instancier son Zend_Form avec ce qu'on veut comme valeur : concrètement voici ce que j'ai fait et qui fonctionne parfaitement :
    Dans le controller, rien ne change sauf lors de l'instanciation de notre objet Zend_Form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    public function editAction() 
    	{
    		$this->view->Success = false;
    		$this->view->traitement = '';
     
    		$this->view->arrParamsPage = $this->getRequest()->getParams();
     
    		$format = $this->getRequest()->getParam('format','html');
    		$page   = $this->getRequest()->getParam('page',1);
     
    		$id = $this->getRequest ()->getParam ('id', 0);
     
    		$this->view->Titre = ($id == null) ? $this->_introInsert : $this->_introEdit .' : ' . $id;
     
    		$form = new Backend_Form_Role(array('id_role_setter' => $id)); //<---C'est ici que ça se joue dans mon cas
    		$urlSohrt =  '/' . $this->_module .'/'. $this->_controller . '/edit/format/' . $format . '/page/' . $page;       
    		$url = App_Tools::getBaseUrl() . $urlSohrt;
     
        	$form->setAction($url);
     
    		$this->view->form = $form;
     
    		$mapper = new Backend_Model_RoleMapper();
     
    		try {
     
    			$resultSet = $mapper->findtoArray((int) $id);
     
    			if (is_array ($resultSet)){
     
    				$form->populate ($resultSet);
    				return;
    			} else {
     
    				if ($this->getRequest()->isPost()){
     
    					$formData = $this->getRequest()->getPost();
     
    					if ($form->isValid($formData)){
    						$model = new Backend_Model_Role($form->getValues());							
    						$retour = $mapper->save($model, $form);
    						$this->view->Success = true;
            				$this->view->formMessage = ($this->_successMessage);
            				$this->_redirect($urlSohrt . '/id/' . $retour . '?traitement=ok');
    					} else {
    					    $form->populate ($formData);
    					    $this->view->traitement = 'pasok';
    						$this->view->formMessage = ($this->_echecMessage);
    						$this->_redirect($urlSohrt . '/id/' . $retour . '?traitement=pasok');
    					}
    				}
    			}
    		} catch ( Zend_Exception $e) {
    			echo $e->getMessage();
    			return;
    		}	
    	}
    Et dans mon objet Zend_Form, voici les changements que j'opère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    class Backend_Form_Role extends App_Form
    {
    	public function __construct($options = null)
        {
            parent::__construct($options);
     
            $id_role_setter = (isset($options['id_role_setter'])) ? (int)$options['id_role_setter']:0;
     
            $this->setMethod('post')
        		 ->setAttrib('id', 'backendform1');
     
            $id_role = new Zend_Form_Element_Hidden('id_role');
     
        	$nom_role = New App_Form_Element_Text('nom_role');
    				$nom_role->setLabel('Nom du role')
    					->setAttrib('id','nom_role')
    					->setAttrib('size','150');
     
     
            $id_parent = New Zend_Form_Element_Select('id_parent');
    				$id_parent->setLabel('Hérite de :')
    				->setAttrib('id','id_parent')
    				->setAttrib('style','width:150px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Sélectionner');
    				$roleMapper = new Backend_Model_RoleMapper();
    				$arrListeRoles = $roleMapper->fetchAllWithExclude($id_role_setter,true);
    				$countListeRoles = count($arrListeRoles);
    				if($countListeRoles){
    					for($i=0;$i<$countListeRoles;$i++){
    						$id_parent->addMultiOption($arrListeRoles[$i]['id_role'], $arrListeRoles[$i]['nom_role']);
    			        }
    				}
     
    		$granted = New Zend_Form_Element_Select('granted');
    				$granted->setLabel('Granted')
    				->setAttrib('id','granted')
    				->setAttrib('style','width:75px;margin:0 0 15px 0')
    				->addMultiOption(0, 'Non')
    				->addMultiOption(1, 'Oui');
     
           $submit = new App_Form_Element_Submit('Valider');
            $submit->setAttrib('id', 'send')
                    ->addDecorator('HtmlTag', array('tag' => 'p', 'id' => 'submit-wrap'));
     
     
            $element = array(
                    $id_role, 
                    $nom_role,
    				$id_parent,
            		$granted,
    				$submit    
                   );
     
            $this->addElements($element);
        }
     
    }
    Voilà c'est tout, dans mon cas cela fonctionne parfaitement, par contre, c'est un cas particulier, puisque mon ID est setté dans tous les cas.

    Voilà fonctionne parfaitement, et me permet d'avoir une liste déroulante des Rôles en excluant le rôle en cours dans le cas d'un Edit, et dans le cas d'une insertion, j'ai bien ma liste complète de Rôles qui s'affiche, car l'id du rôle vaut 0 et me ramène donc tous les Rôles.

    J'espère que cela pourra aider certain et encore un grand merci à 5h4rk pour son aide et sa patience.

  16. #16
    Membre expérimenté
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : février 2011
    Messages : 813
    Points : 1 373
    Points
    1 373
    Par défaut
    Je vais te decevoir mais $options porte bien son nom.
    En effet cela permet de creer un formulaire directement avec des options de formulaire par exemple la creation de chaque element.

    Mais en effet cela marche aussi et si cela te conviens laisse ainsi, sinon n'hésites pas à revenir.

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2005
    Messages : 244
    Points : 117
    Points
    117
    Par défaut
    Bonjour 5h4rk, effectivement, j'ai relu la doc cela sert bien à créer le formulaire directement via Zend_Config_Ini, mais dans mon cas cela me permet de passer facilement mes datas à mon objet : mais c'est sûr que ta méthode de la surcharge de populate est LA meilleure solution car elle fonctionnera dans tous les cas, mais je ne suis pas arrivé à la mettre en place.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer la valeur du composant "Element Text"
    Par ingelita dans le forum Forms
    Réponses: 2
    Dernier message: 24/10/2010, 00h40
  2. Réponses: 1
    Dernier message: 04/04/2008, 23h08
  3. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 17h45
  4. [Couleur] Récupérer les valeurs R,V,B et L,U,V ?
    Par M4v3rick dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/01/2004, 04h28
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo