IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Zend_Form PHP Discussion :

Zend_Form_Element : refresh des composants lors d'un event 'onchange'


Sujet :

Zend_Form PHP

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Zend_Form_Element : refresh des composants lors d'un event 'onchange'
    Bonjour,

    j'ai un Zend_Form dans lequel j'ai trois Zend_Form_Element_Select (SelCat,SelUS,SelStand). Dans le formulaire que je veux créer il y a des dépendances entre les trois "Element_Select".

    Dépendances:

    • Lors d'un changement de 'SelCat', je vais actualiser les composants 'SelUS' et 'SelStand'
    • Lors d'un changement de 'SelUs', je vais actualiser le composant 'SelStand'
    • Je veux faire ces changements sans avoir à valider 3 formulaires les uns à la suite des autres

    Note: dans le bout de code ci-dessous j'ai simplifié. Le contenu du champ 'multioption' sera chargé par la base de donnée.

    Cas similaire: Pour simplifier, c'est comme si j'avais un champ 'pays', 'département' et 'ville'. Si j'ai choisi le pays 'Allemagne', je ne devrais pas pouvoir choisir le département 'Aube'. Si j'ai choisi le pays 'France' et département '75', je ne pourrais pas choisir Lyon comme ville.

    Dans les forums, j'ai longuement cherché (si, si je vous assure) et je suis tombé sur deux solutions 'dojo' et 'javascript'. Je n'ai par contre pas compris comment je pourrais implémenter ces composants dans mon formulaire.

    Mes questions:

    1. Dans le code ci dessous, j'ai essayé de faire la réactualisation en configurant le champ 'attribs' => array('onchange'=>'myownfunction') et le système me renvoie que ma fonction 'myownfunction' n'existe pas. Je n'arrive pas à comprendre comment et où je dois définir cette fonction 'myownfunction' pour que ca marche.
    2. Est-ce qu'il est possible de n'utiliser que PHP pour implémenter cette fonction dans mon formulaire..
    3. Vais-je être obligé d'avoir recours à 'dojo' et/ou 'javascript' et pourquoi ?



    Si on m'explique le principe de base et où trouver la doc nécessaire, je me débrouillerais, mais en ce moment je ne sais pas par quel bout attraper mon problème.

    Voici le code de mon formulaire:
    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
    class Form_SearchQuicklinkCat extends Zend_Form
    {
        public function init()
        {
            // set the method for the display form to POST
            $this->setMethod('post');
            $this->addElement('select','selCat',array(
                'label'         => 'select category',
                'required'      =>true,
                'attribs'       =>array('onchange'=>'myownfunction'),
                'multioptions'  =>array('dt1'=>'Document Type 1',
                                        'dt2'=>'Document Type 2')));
            $this->addElement('select','selUS',array(
                'label'         => 'select unit/stage',
                'required'      =>true,
                'multioptions'  =>array('A'=>'Item A',
                                        'B'=>'Item B',
                                        'spec'=>'special Items')));
            $this->addElement('select','selStand',array(
                'label'         => 'select phase',
                'required'      =>true,
                'multioptions'  =>array('1'=>'Phase 1',
                                        '2'=>'Phase 2',
                                        'gen'=>'All phases')));
            // add the submit button
            $this->addElement('submit', 'submit', array(
                'label'    => 'Get Link',));
        }
     
        function myownfunction()
        {
            $this->selUS->setMultiOptions(array('X'=>'UnknowItems'));
            $this->selStand->setMultiOptions(array('X'=>'No Phases concerned'));
            print_r('You enter in my own function');
        }
    }

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    2. Est-ce qu'il est possible de n'utiliser que PHP pour implémenter cette fonction dans mon formulaire..
    non
    3. Vais-je être obligé d'avoir recours à 'dojo' et/ou 'javascript' et pourquoi ?
    oui

    Le PHP étant exécuté côté serveur, pour modifier la présentation d'une page dans le navigateur en exécutant un script PHP, il faut envoyer une requête au serveur.

    Pour envoyer cette requête, en HTML, il faut utiliser un lien (par exemple dans un bouton de validation de formulaire) ce qui entraîne un rechargement complet de la page.

    Si tu veux que la requête vers le serveur soit exécutée sans recharger la page, il faut utiliser du code exécuté côté client, comme le JavaScript.

    Les deux solutions que tu as trouvées (Dojo et JavaScript) sont en fait les mêmes... Dojo est en fait un framework JavaScript (comme le Zend Framework est un framework PHP). Il existe de nombreux frameworks JavaScript qui ont tous des avantages...

    L'un des intérêts de Dojo est qu'il existe des classes permettant de l'utiliser facilement avec le Zend Framework (toutes les bibliothèques JavaScript peuvent être utilisées, mais Dojo est déjà intégré). Personnellement, je ne l'ai jamais utilisé, donc je ne vais pas pouvoir beaucoup plus t'aider sans question précise. Mais tu peux commencer par regarder du côté de la doc pour voir comment l'utiliser... :
    http://framework.zend.com/manual/fr/zend.dojo.html

    Mais peut-être qu'avant de te lancer là dedans, il serait bon de faire un tour par les notions de base de JavaScript / AJAX : http://javascript.developpez.com/cours/#ajax

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci Eusebe pour tes réponses très concises,

    Ma méthodologie est un peu confuse car mes connaissances se tournent plus vers l'informatique temps réel où il n'y a pas le principe client/serveur. Je vais suivre ton conseil et apprendre les bases (HTML, XML, Javascript et Ajax) avant de continuer.

    J'ai vu sur le net beaucoup de questions concernant le fonctionnement d'Ajax et de Zend Framework. J'espère donc être de retour rapidement sur ce même forum pour apporter la réponse et pouvoir ainsi aider d'autres personnes.

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Apparemment, la tâche est plus ardue qu'elle n'y paraissait ...

    Ce que j'ai réussi à faire:
    • Intégration du toolkit dojo
    • Utilisation de Zend_Dojo_Form à la place De Zend_Form
    • Utilisation de FilteringSelect à la place de select
    • Récupération en javascript de l'élément choisi affichage avec alert()


    Sur les forums il y a certains éléments de réponse pour un problème analogue, mais je n'arrrive toujours pas à y voir très clair.

    Pour récapituler:
    1. lors un changement de FilteringSelect (client) on récupère la valeur choisie (client).
    2. Ensuite, il faut transmettre au contrôleur (serveur) qui transmet au modèle (serveur) qui va interroger la base de donnée (serveur) pour récupérer le contenu à afficher du second FIlteringSelect.
    3. Ensuite cette valeur va être récupérée (serveur) par l'intermédiaire d'un datastore (json) et seulement la partie concernée sur la page va pouvoir être réactualisée.


    D'où mes questions:
    1. Est-ce correct ?
    2. Comment informer le contrôleur (point n°2 ci-dessus) ?
    3. Faut-il définir deux actions pour contrôleur? :
      - une qui s'occupe du premier affichage et de la validation finale lors du submit (qui fait l'interface avec la vue)
      - une qui s'occupe uniquement de l'interface avec json

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    javascript CustomQueryReadStore.js
    Code javascript CustomQueryReadStore.js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    dojo.provide("custom.CustomQueryReadStore")
    dojo.require("dojox.data.QueryReadStore")
    dojo.declare(
        "custom.CustomQueryReadStore",
        dojox.data.QueryReadStore,
        {
            fetch: function(request)
            {
                request.serverQuery = {q: request.query.name};
                return this.inherited("fetch", arguments);
            }
        }
    );
    Ensuite, les questions:
    1. Réactualisation des villes:
      Le point où je bloque est l'appel de la méthode getvilleAction($pays) via javascript.
      Ca ne marche pas et je ne sais pas comment faire autrement. Lors du changement de pays, j'obtiens l'erreur suivante : "An error occurred: Error: Unable to load http://localhost/zend_paysville/publ...pays=Allemagne status:500"
    2. Utilisation de FilteringSelect:
      Je souhaiterais utiliser les FIlteringSelect à la place des combobox, mais le problème est que quand je change un élement, celui-ci est choisi, mais tout de suite après le FilteringSelect reprend la première valeur disponible dans la liste ...


    Des volontaires pour mes (petites) questions ?

    Merci d'avance

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 72
    Points : 62
    Points
    62
    Par défaut
    Salut les amis,

    Cette discussion m'intéresse beaucoup et j'y prête beaucoup d'attention car j'ai le même problème. Personne n'a une solution à proposer? Ou bien même un lien vers un sujet similaire.

    Au secourt les gars.
    @omzo
    "L'ignorant qui ignore qu'il ignore est plus ignorant que l'ignorant qui n'ignore pas qu'il ignore."
    [Proverbe arabe]

  7. #7
    Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Malheureusement, je ne suis pas arrivé au résultat attendu et j'ai laissé tomber à force... peut-être que certaines personnes y sont arrivés avec jquery ... en tout cas, avec dojo ca doit pas être si simple que ca.

    Bon courage

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 72
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Merci LuMagicienDOz. En tout cas, moi je continue toujours mes recherches. Quand j'aurais trouvé quelque chose, je me mettrai afin que tout le monde puisse en bénéficier.

    Merci encore.
    @omzo
    "L'ignorant qui ignore qu'il ignore est plus ignorant que l'ignorant qui n'ignore pas qu'il ignore."
    [Proverbe arabe]

  9. #9
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Bonjour,

    je suis en train d'essayer de faire la même chose, est-ce que quelqu'un a réussi finalement ?

    Cordialement.
    Cordialement.

  10. #10
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 188
    Points : 131
    Points
    131
    Par défaut [ZF 1.9] Zend_Dojo - lier 2 filteringselect
    j'ai enfin trouvé la solution !!

    je récapitule depuis le début ce que j'ai fait, parce que j'ai trop galéré pour en arriver là et je suis sûre qu'il y en a d'autres qui sont dans le même cas !

    1 - télécharger dojo toolkit (oui je sais, c'est vraiment tout depuis le début ). Attention à bien télécharger le toolkit, pas seulement le fichier dojo.js ! (me suis fait avoir ). On décompresse et on se retrouve avec 3 répertoires "dijit", "dojo" et "dojox", on met ces 3 répertoires dans public/js.

    2 - dans le bootstrap, ajouter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $view->addHelperPath('Zend/Dojo/View/Helper/','Zend_Dojo_View_Helper');
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Zend_Dojo::enableView($view);
    au choix.
    Moi j'ai rajouté le 1er dans ma classe Bootstrap à l'intérieur de ma méthode _initView(). J'y ai également ajouté les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $view -> dojo() -> setLocalPath(BASE_URL . '/js/dojo/dojo.js')
    		      -> addStyleSheetModule('dijit.themes.tundra')
    		      -> setDjConfigOption('usePlainJson',true)
    		      -> setDjConfigOption('parseOnLoad', true)
    		      -> enable();
    avec BASE_URL qui est ma constante contenant le chemin vers '/MonApplication/public'.

    3 - Dans mon layout.phtml j'ai rajouté entre les balises head la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $this -> dojo(); ?>
    4 - Mes éléments de formulaire (lequel étend Zend_Dojo_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
     
    $agence = new Zend_Dojo_Form_Element_FilteringSelect('agence');
    $agence -> setLabel('Agence :')
                -> setDecorators($decorators_dojo)
                	-> setStoreId('agenceStore')
    		-> setStoreType('dojo.data.ItemFileReadStore')	
                	-> setAutoComplete(false)
    		-> setStoreParams(array('url' => BASE_URL . '/users/getagence'))        
    		-> setAttrib('searchAttr', 'libelle_agence')
    		-> setAttrib('onchange',"loadBoutique('". BASE_URL."')")
    		-> setValue($edit['agence']);
     
    $boutique = new Zend_Dojo_Form_Element_FilteringSelect('boutique');
    $boutique   -> setLabel('Boutique par défaut : ')
    		-> setRequired(true)
    		-> setDecorators($decorators_dojo)
                	-> setStoreId('boutiqueStore')
    		-> setStoreType('dojo.data.ItemFileReadStore')
                	-> setAutoComplete(false)	            
    		-> setAttrib('searchAttr', 'libelle_boutique')
    		-> setValue($edit['boutique']);
    5 - Dans mon contrôleur UsersController, j'ai rajouté 2 fonctions:
    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
     
    public function getagenceAction()
    {
    	$result = new Default_Model_DbTable_Refagence();
    	$dojoData = new Zend_Dojo_Data('code_agence',$result -> fetchAllGroupBy(null,'libelle_agence',null,null,'code_agence'));
    	$this -> _helper -> autoCompleteDojo($dojoData);
    }
     
    public function getboutiqueAction()
    {
    	$agence = $this->_request->getParam('agence');
    	$result = new Default_Model_DbTable_Refagence();
    	$dojoData = new Zend_Dojo_Data('cdr',$result -> fetchAllGroupBy('code_agence="' . $agence . '"','libelle_boutique',null,null,'cdr'));
    	$this -> _helper -> autoCompleteDojo($dojoData);
    }
    6 - dans un fichier fonctions.js qui se trouve dans mon répertoire js, j'ai ma fonction loadBoutique que j'appelle dans l'évènement onchange de mon 1er filteringselect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function loadBoutique(baseurl)
    {
    	var agence = dijit.byId('agence').getValue();
    	var dataStore = new dojo.data.ItemFileReadStore({url: baseurl + '/users/getboutique/agence/' + agence});
    	dijit.byId('boutique').store = dataStore;
    }
    Pour le baseurl, ça fait pas très propre mais je ne savais pas comment faire autrement que de le passer en paramètre de la fonction javascript, si quelqu'un d'autre sait comment arranger ça, je prend !

    Voilou ! Bon par contre je n'ai pas encore trouvé comment on initialise les champs, je reviens si j'ai du nouveau !

    Cordialement.
    Cordialement.

  11. #11
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Petites questions Zend
    Bonjour à tous !

    Je dev en ce moment une application basé sur le Zend framework, ninikkuet ton post m'a déjà beaucoup aidé, néanmoins j'aurai quelques questions à te poser par rapport à ta solution (il y a quelques lignes de codes asser obscure pour moi ) notamment :

    _ Dans la déclaration de tes éléments j'aurai aimé savoir à quoi correspond $edit['Boutique'] et $edit['agence'], et à quoi sert cette ligne "->setValue"

    _Se serai asser cool aussi si tu pouvais détaillé un peu plus ces 3 ligne (ou du moins quelqu'un qui les comprend) :

    Dans getAgenceAction()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dojoData = new Zend_Dojo_Data('code_agence',$result -> fetchAllGroupBy(null,'libelle_agence',null,null,'code_agence'));
    Dans getboutiqueAction()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $dojoData = new Zend_Dojo_Data('cdr',$result -> fetchAllGroupBy('code_agence="' . $agence . '"','libelle_boutique',null,null,'cdr'));
    et dans loadBoutique()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var dataStore = new dojo.data.ItemFileReadStore({url: baseurl + '/users/getboutique/agence/' + agence});
    _ Et enfin ma dernière questions : comment sont représenter tes tables en bases de données ? vu que tu n'a qu'un seul model pour les agences et les boutiques j'en conclu que c'est la table représentant la relations n-n de tes boutiques et tes agences, mais je peu me tromper (vu que logiquement pour moi une agence gère plusieurs boutiques mais une boutique ne peut être relié à plusieurs agence) donc si possible pourrais tu décrire ta ou tes tables rentrant en jeu avec leur champs.

    Voila est ce que quelqu'un peut m'expliquer toussa, je pense que sa pourrai en aidé plus d'un d'avoir ces détails, merci d'avance.

    EDIT : si on peut au moins me décrire les tables et leurs champs je pense pouvoir recoller les morceaux, mais l'explication complète m'aiderai surtout à comprendre le process pour pouvoir adapter tous sa en fonction de mes besoins.

    PS: Merci à tous les contributeurs du forum, il m'aide très souvent dans mes problèmes.

    cordialement.

  12. #12
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut solution
    Bon j'ai réussi à trouver une solution pour arriver à faire ce que je voulais.
    Elle est un peu différente de celle-ci bien que je m'en soit beaucoup inspiré mais ne comprenant pas certaine lignes j'ai ajouté un peu de traitement php

Discussions similaires

  1. erreur lors de l'installation des composants ZEOSLib
    Par aimer_Delphi dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/03/2015, 15h09
  2. Réponses: 10
    Dernier message: 01/04/2013, 10h48
  3. Mise en évidence des composants lors du déploiement
    Par tijani dans le forum Composants VCL
    Réponses: 1
    Dernier message: 18/02/2010, 15h12
  4. Probleme lors de l'installation des composants JEDI 3.36
    Par oneigloo dans le forum Composants VCL
    Réponses: 0
    Dernier message: 07/04/2009, 15h03
  5. ADO.NET INSERT DELETE UPDATE refresh des composants graphic
    Par jeriko dans le forum Accès aux données
    Réponses: 5
    Dernier message: 15/01/2007, 15h17

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