Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-10-2011 07:20:04

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

[Résolu] Problème de réponse JSON "text/html"

Je veux faire la validation de mon form en ajax mais le proleme c'est que je reçois une réponse "text/html" pourtant je revoix une réponse "application/json".

Le code JS

Code:

$(function(){
    $('input').blur(function(){
        var elementId = $(this).attr('id');
        doValidation(elementId);
    });
});

function doValidation(id){
    
    var data = {};
    var url = '/backend/index/validateform';

    $('input').each(function(){
        data[$(this).attr('name')] = $(this).val();
    });

    $.post(url,data,function(resp){
        $('#'+id).parent().append(getErrorHtml(resp[id],id));
    },'json');
}

function getErrorHtml(formErrors, id){
    var o = '<ul id="errors-'+ id + '" class="errors">';
    for(errorKey in formErrors){
        o += '<li>' + formErrors[errorKey] + '</li>';
    }
    o += '</ul>';
    return o;
}

Le code de l'action

Code:

    public function validateformAction(){
        
        $this->_helper->viewRenderer->setNoRender();
        
        $f = new Backend_Form_Index();
        $f->isValid($this->_getAllParams());
        $messages= $f->getMessages();

        header('Content-type: application/json');
        echo Zend_Json::encode($messages);
    }

La reponse

Code:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html>
<head>.....................etc

+ que j'ai remarqué quand je fait commentaire aux instructions de l'action validateform je reçois la même réponse.

J'ai besoin de vos aides svp.Merci

Dernière modification par zizou86 (25-10-2011 22:19:33)

Hors ligne

 

#2 25-10-2011 09:20:59

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [Résolu] Problème de réponse JSON "text/html"

Hello,

Tu dois aussi désactiver le layout.

Code:

[lang=php]
public function validateformAction()
{        
    $this->_helper->layout()->disableLayout();
    $this->_helper->viewRenderer->setNeverRender(true);
        
    $f = new Backend_Form_Index();
    $f->isValid($this->_getAllParams());
    $messages= $f->getMessages();

    header('Content-type: application/json');
    echo Zend_Json::encode($messages);
}

Cependant, il y a une meilleur pratique que ça, c'est d'utiliser le helper ContextSwitch qui permet de gérer plusieurs formats de sorties sans changer le code d'une action.

Que ça soit du HTML, du XML ou du JSON, afficher des données reste le rôle de la vue, je conseille donc plutôt d'utiliser cette méthode :

Code:

[lang=php]
class MyController extends Zend_Controller_Action
{
    public $contexts = array(
        'validateform' => array('json'),
    }

    public function init()
    {
        parent::init();
        
        // Pour éviter ZF de polluer le rendu JSON avec des infos inutiles
        $contextSwitch = $this->_helper->getHelper('ContextSwitch');
        $contextSwitch
            ->setAutoJsonSerialization(false)
            ->initContext();
    }
    
    public function validateformAction()
    {        
        $f = new Backend_Form_Index();
        $f->isValid($this->_getAllParams());
        $messages= $f->getMessages();

        $this->view->messages = $messages;
    }
}

Vue validateform.json.phtml

Code:

[lang=phtml]
<?php
echo $this->json($this->messages);

Le ContextSwitch se chargera lui même de désactiver le layout et de rendre la vue dans le bon format. De cette manière l'action du contrôleur reste compatible avec tous les formats.

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#3 25-10-2011 13:57:31

Polzie
Membre
Date d'inscription: 12-03-2010
Messages: 20

Re: [Résolu] Problème de réponse JSON "text/html"

Dans la méthode init() de ton controller, ajoute :

Code:

[lang=php]public function init()
{
        $this->_helper->ajaxContext->addActionContext('validateform', 'json')
                                    ->initContext();
}

Ceci désactivera, pour l'action validateform, le layout, et te passera automatiquement le "$this->view->messages = $messages;" en json.

Dernière modification par Polzie (25-10-2011 13:58:27)

Hors ligne

 

#4 25-10-2011 21:16:13

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

Re: [Résolu] Problème de réponse JSON "text/html"

Merci tous les deux delprog et polzie pour vos réponses mais je reçois la même réponse.

Pour la première solution de delprog et la solution de reçois la même solution même lorsque je laisse l'action validateform vide je reçois la même et voilà le code que je reçois et vous devez remarqué que les messages sont affichés :

Code:

 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html>
<head>
    <title>لوحة التحكم</title>    <link href="/css/default.css" media="screen" rel="stylesheet" type="text/css" >
<link href="/css/milk.css" media="screen" rel="stylesheet" type="text/css" >
<link href="/css/menu.css" media="screen" rel="stylesheet" type="text/css" >
<link href="/includes/JQuery/themes/redmond/jquery.ui.all.css" media="screen" rel="stylesheet" type="text/css" >    
        <script type="text/javascript" src="/includes/JQuery/jquery-1.6.2.js"></script>    <meta http-equiv="Content-type" content="text/html;charset=utf-8" ></head>
<body>
    <form id="login" enctype="application/x-www-form-urlencoded" class="formular" autocomplete="off" action="" method="post"><dl class="zend_form">
<dt id="username-label"><label for="username" class="required">اسم الدخول</label></dt>
<dd id="username-element">
<input type="text" name="username" id="username" value="">
<ul class="errors"><li>Value is required and can't be empty</li></ul></dd>
<dt id="password-label"><label for="password" class="required">كلمة السر</label></dt>
<dd id="password-element">
<input type="password" name="password" id="password" value="">
<ul class="errors"><li>Value is required and can't be empty</li></ul></dd>
<dt id="submit-label"> </dt><dd id="submit-element">
<input type="submit" name="submit" id="submit" value="تسجيل الدخول"></dd>
<dt id="csrf-label"> </dt>
<dd id="csrf-element">
<input type="hidden" name="csrf" value="b84bbaa72ce77def9719dc5c8ea17c0f" id="csrf"></dd></dl></form><script type="text/javascript">
<!--
$(function(){
    $('input').blur(function(){
        var elementId = $(this).attr('id');
        doValidation(elementId);
    });
});

function doValidation(id){
    
    var data = {};
    var url = '/backend/index/validateform';

    $('input').each(function(){
        data[$(this).attr('name')] = $(this).val();
    });
    console.log(data);
    $.post(url,data,function(resp){
        $('#'+id+'-label').append(getErrorHtml(resp[id],id));
    },'json');
}

function getErrorHtml(formErrors, id){
    var o = '<ul id="errors-'+ id + '" class="errors">';
    for(errorKey in formErrors){
        o += '<li>' + formErrors[errorKey] + '</li>';
    }
    o += '</ul>';
    return o;
}
//-->
</script>
<br />   
</body>

</html>

et pour la deuxiéme solution de delprog
Quand j'écris dans le phtml echo $this->json($this->messages) il m'affiche la page en mode code source comme si je génére le code source de la page.

Hors ligne

 

#5 25-10-2011 22:16:35

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

Re: [Résolu] Problème de réponse JSON "text/html"

J'ai résolu le problême.
Ce que j'ai fait c'est que je pointe sur indexAction et j'envoie l'ajax vers validateAction.

Hors ligne

 

#6 15-02-2012 15:49:07

imad
Nouveau membre
Date d'inscription: 15-02-2012
Messages: 1

Re: [Résolu] Problème de réponse JSON "text/html"

Bonjour,

Je me permets de revenir sur la réponse de Delprog qui semble fort intéressante.
La vue (validateform dans ce cas) doit elle être vide? Pour que le Json dans l'autre vue validateform .json soit interprété ou non?

J'ai essayé de suivre la solution proposée mais celle ci ne semble pas fonctionner.
Seule solution et comme l'a dit notre ami, afficher notre tableau json dans une autre vue en désactiver le layout pour ensuite l'inclure dans la vue désirée. Y'a t il un autre moyen plus simple?

Hors ligne

 

#7 20-02-2012 13:05:27

Echo
Membre
Lieu: Bois Colombes
Date d'inscription: 28-03-2008
Messages: 20
Site web

Re: [Résolu] Problème de réponse JSON "text/html"

RTFM : http://framework.zend.com/manual/1.11/e … textswitch
Mais franchement mis à part dans le cadre de développement d'un webservice, c'est pas très utilisé...

Et pour renvoyer du JSON, c'est beaucoup plus simple et pratique d'utiliser le helper json qui set le content-type à application/json et désactive le layout  + rendu de vue, même pas besoin de créer un fichier de vue .phtml vide !

Code:

[lang=php]$this->_helper->json($ret, array('enableJsonExprFinder' => true));

Dernière modification par Echo (20-02-2012 13:07:13)


Marre de coder tes modèles Object-Relational Mapping? Génère-les automatiquement avec le générateur de classes ORM

Envie de sortir ? Viens sur ToutPourSortir.fr !

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