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 :

Utiliser Zend_form en Ajax [ZF 1.10]


Sujet :

Zend_Form PHP

  1. #1
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut Utiliser Zend_form en Ajax
    Bonjour,

    J'ai créé une page avec 2 onglets JQUERY. Chacun de ses onglets affiches un formulaire chargé en Ajax.
    Je souhaiterais valider mon formulaire en AJAX ou alors valider en POST classique mais afficher ensuite le bon contenu AJAX.
    Comment faire ça bien ? Je préfère demander s'il n'y a pas une bonne pratique pour faire ça avant de faire ça a ma sauce

    Pour information, voici ce que j'ai :

    • Une action indexAction() qui charge la page principale
    • Une action infosAction() qui charge en Ajax le formulaire du 1er onglet


    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
     
    // On désactive le layout
    $this->_helper->layout->disableLayout();
     
    // On récupère la page courante (pour l'action)
    $request = Zend_Controller_Front::getInstance()->getRequest();
    $currentUri = $request->getRequestUri();
     
    $form = new Zend_Form;
    $form->setAction($currentUri)->setMethod('post');
     
    $username = new Zend_Form_Element_Text('username');
    $username->setRequired(true);
    $form->addElement($username);
     
    if ($form->isValid($_POST)) {
        // succès!
        print 'OK';
    } else {
        // echec!
        print 'NOK';
    }
     
    // On passe le formulaire à la vue
    $this->view->form = $form;
    Comme vous le voyez, ça fonctionne sauf qu'au lieu d'afficher les onglets avec le formulaire, ça m'affiche directement le formulaire sans le Layout.

    Merci d'avance pour vos conseils

  2. #2
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Salut,

    Peux-tu montrer le contenu complet de ton controlleur et de ta vue?
    Les idiots sont ceux qui ne posent jamais de question!

  3. #3
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    J'ai trouvé une solution afin de vérifier les vérifications de formulaire Zend en Ajax pour afficher les erreurs.

    Mon 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
     
    public function infosAction()
        {
            // On désactive le layout
            $this->_helper->layout->disableLayout();
     
            // Récupère le chemin courant
            $currentUri = $this->getRequest()->getRequestUri();
     
            // Création du formulaire
            $formid = 'formInfos';
            $form = new Zend_Form;
            $form->setAction($currentUri)
                 ->setMethod('post')
                 ->addAttribs(array('id' => $formid));
     
            // Champs 1
            $titre = new Zend_Form_Element_Text('titre');
            $titre->addValidator(new Zend_Validate_Alnum())
                  ->addValidator('regex', false, array('/^[a-z]/'))
                  ->setRequired(true)
                  ->setLabel('Titre');
     
            // Bouton Submit Ajax
            $submit = new Zend_Form_Element_Button('Valider');
     
            $form->addElements(array($titre, $submit));
     
            // Traitement de la réponse, renvoi du JSON interprété dans la Vue
            if ($this->getRequest()->isPost()){
                if (($data = $form->processAjax($_POST))) {
                    // succès!
                    $this->_helper->json->sendJson($data);
                } else {
                    // echec!
                    $this->_helper->json->sendJson($data);
                }
            }
     
            // On passe le formulaire à la vue
            $this->view->form = $form;
            $this->view->formId = $formid;
        }
    Et pour la Vue :
    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
     
    <?php echo $this->form ?>
     
    <script type="text/javascript">
    // Applique le style et l'action au bouton submit
    $('button').button({
        icons: {
            primary: 'ui-icon-circle-check'
        }
    }).click(function() {
        $('form#<?php echo $this->formId ?>').submit();
    });
     
    // Gère le Submit en Ajax
    $('form#<?php echo $this->formId ?>').submit(function() {
     
        // Récupère les données du formulaire
        var data    = $(this).serialize();
        // Récupère l'url de l'action
        var url     = $(this).attr('action');
     
        // Supprime tous les alertes liées à une validation de formulaire
        $('.formValidation').detach();
     
        // Convertir le Submit du formulaire en Ajax
        $.ajax({
            type: 'POST',
            url: url,
            data: data,
            success: function(data) {
                var result = jQuery.parseJSON(data);
                if(result === true){
                    $('form#<?php echo $this->formId ?>').before('<div class="formValidation success">Vos modifications ont bien été prises en compte</div>');
                }else{
                    // Pour chaque champs en erreur
                    jQuery.each(result, function(champ, erreurs){
                        // Pour chacune des erreurs
                        jQuery.each(erreurs, function(type, msg){
                            $('form#<?php echo $this->formId ?> #'+champ).after('<div class="formValidation '+type+'">'+msg+'</div>');
                        });
                    });
                }
            },
            dataType: "json"
        });
     
        // Neutralise le Sumbit classique
        return false;
     
    });
     
    </script>
    Voilà, c'est un petit code perso donc si vous avez des remarques ou de meilleurs idée, n'hésitez pas.
    En tout cas, peut-être que ça en aidera certains

  4. #4
    Membre éclairé Avatar de manuscle
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2004
    Messages : 488
    Points : 663
    Points
    663
    Par défaut
    Merci

    Je ne connaissais pas la methode processAjax!

    Par contre, tu peux remplacer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                if (($data = $form->processAjax($_POST))) {
                    // succès!
                    $this->_helper->json->sendJson($data);
                } else {
                    // echec!
                    $this->_helper->json->sendJson($data);
                }
    par :
    $data = $form->processAjax($_POST);
    $this->_helper->json->sendJson($data);
    vu que ça semble effectuer la même action quelque soit le resultat
    Les idiots sont ceux qui ne posent jamais de question!

  5. #5
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    Merci du conseil Mon code ne fait rien encore mais le retour sera différent. Si l'Update en base ne fonctionne pas par exemple

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    La différence entre les 2 méthodes que tu désires utiliser est que :
    - avec Ajax, tu vas recevoir en réponse un message que tu décides d'utiliser pour construire le formulaire
    - avec Post (ou Get), tu vas recevoir en réponse ta page complète qui sera affichée par le navigateur

    Il est donc tout à fait normal que lorsque tu n'utilises pas Ajax tu "perdes" les onglets puisqu'ils font partie du Layout et qu'il est désactivé (première instruction de ton action)

    Normalement, en déplaçant cette instruction dans le test concernant Ajax cela devrai fonctionner dans les 2 cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
                if (($data = $form->processAjax($_POST))) {
                    // succès!
    
                    // On désactive le layout
                    $this->_helper->layout->disableLayout();
    
                    $this->_helper->json->sendJson($data);
                } else {
                    // echec!
                    $this->_helper->json->sendJson($data);
                }
    ...


    devYan.

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

Discussions similaires

  1. [Coincé] Utilisation de asp ajax
    Par steine dans le forum VB.NET
    Réponses: 1
    Dernier message: 02/10/2007, 14h14
  2. Chargement d'une page web utilisant de l'AJAX/HTML/PHP
    Par CrazySeb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/06/2007, 14h37
  3. DataGrid chargé en utilisant de l'Ajax
    Par byphantom dans le forum ASP.NET
    Réponses: 1
    Dernier message: 12/04/2007, 15h20
  4. [AJAX] utilisation compliqué d'ajax
    Par toddy_101 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/02/2007, 10h01

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