voila mon blem , j'ai faire un formulaire ajax en cakephp 2.3 , quand je faire le premier enregistrement c'est oki , ma reponse json est retourné , mais quand je veux faire une deuxieme , pas de reponse json , mais pluto du html comme reponse,

Mon APPCONTROLLER/
   if ($this->RequestHandler->isAjax() && $this->request->is('ajax')){
            $this->layout = FALSE;
            Configure::write('debug',0);
            if($this->request->is('ajax')){
                $this->disableCache();
            }

mon controller */

public function admin_add(){
           $errors = array();
           $errors_str = array();
           if($this->RequestHandler->isAjax() && $this->request->is('post')){
                if($this->Article->save($this->request->data)){
                   $errors'status'] = 1;
                   echo json_encode($errors);
                   $this->autoRender = false;
                   exit();
                }
                else{
                  $errors]= $this->Article->validationErrors;
                   $errors'status'] = 0;
                  foreach ($errors as $k => $v) {
                      $errors_str] = $v;
                  }
                  echo json_encode($errors_str);
                  $this->autoRender = false;
                  exit();
                }
            }
        }

ma vue */

article class="module width_full">
<header><h3>Poster un nouvel article</h3></header>
<div class="module_content">
      <h4 class="alert_success"></h4>
      <?php echo $this->Form->create('Article',array('id'=>'FormarticleAdd')); ?>
    <fieldset>
            <?php echo $this->Form->input('name',array('label'=>"titre de l'article",'id'=>'name','required'=>FALSE));?>
    </fieldset>
    <fieldset>
            <?php echo $this->Form->input('content',array('lable'=>"contenu de l'article",'rows'=>12,'id'=>'content','required'=>FALSE));?>
    </fieldset>
    <fieldset>
            <?php echo $this->Form->input('online',array('label'=>"mettre en ligne",'id'=>'online','required'=>FALSE));?>
    </fieldset>  
<div class="clear"></div> 
</div>
<footer> 
<div class="submit_link">
     <?php echo $this->Form->end(array('id'=>'alt_btn','label'=>"Ajouter")); ?>
</div>
</footer>
</article>

et mon js

var url = $("#FormarticleAdd").attr('action');
    var inputs = $('input, textarea, select').not(':input[type=button], :input[type=submit], :input[type=reset]');
    $("#FormarticleAdd").submit(function(e){
    $.ajax({
        type : "POST",
        url : url,
        data : $("#FormarticleAdd").serialize(),
        dataType : "json",
        success : function(data){
           if(data.status != 1){
               inputs.each(function(){
                 var elt = $(this);
                 var champ = elt.attr('id');
                      if(data[0][champ]){
                        $('<div class="error-message '+champ+' ">').html(data[0][champ]).appendTo(elt.closest('.input'));
                        elt.keyup(function(){
                          $(".error-message").hide();  
                        });
                      } 
                });
           }else{
             $(".alert_success").empty().text("Votre travail a été sauvegardé !").show();
             inputs.val('');
             $(".alert_success").fadeOut('slow');
           }
        }
    });
     e.preventDefault();
   });
});

Merci d'avance et je suis ouvert pour une autre methode

9 réponses


Ciloe
Réponse acceptée

Ouip j'ai compris.

En gros, lors de la deuxième il ne détecte pas l'une des conditions suivante :

if($this->RequestHandler->isAjax() && $this->request->is('post')){

(je penche sur le is post).

Du coup puisque tu as pas mis de exit à la fin de ta fonction admin_add(), il affiche la vu associé. Sauf que tu le reçois en réponse ajax (se qui est normal). Donc met un exit pour commencer à la fin de ta fonction (avec une erreur si tu veux).

Si non il doit manquer un truc dans ton js pour que l'autre comprenne que tu fait un autre post. Je vais regarder ça!

Quel est l'erreur dans ton html? De plus, je t'invite à utiliser la balise code dans tes messages pour qu'on y voit plus claire...

il n'y a pas d'erreur dans mon html , en faite j'affiche tous mon code , pour rendre l'analyse de chacun facile et trouver une reponse rapide

Quand tu dis que tu fais une première requête, la réponse est retournée puis le deuxième c'est une page html qui est retournée... C'est quoi cette page, tu peux donner le contenu?

la reponse de la premiere réquete : le code de la reponse1

{"status":1}

maintenant le code de la deuxieme requete : le code de la reponse2

<article class="module width_full">
<header><h3>Poster un nouvel article</h3></header>
<div class="module_content">
      <h4 class="alert_success"></h4>
      <form action="/admin/Articles/add" id="FormarticleAdd" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="POST"/></div> <fieldset>
            <div class="input text required"><label for="name">titre de l'article</label><input name="data[Article][name]" id="name" maxlength="255" type="text" value="contenu2"/></div> </fieldset>
    <fieldset>
            <div class="input textarea required"><label for="content">Content</label><textarea name="data[Article][content]" lable="contenu de l'article" rows="12" id="content" cols="30">contenu2</textarea></div> </fieldset>
    <fieldset>
            <div class="input number required"><label for="online">mettre en ligne</label><input name="data[Article][online]" id="online" type="number" value="1"/></div> </fieldset>  
<div class="clear"></div> 
</div>
<footer> 
<div class="submit_link">
     <div class="submit"><input id="alt_btn" type="submit" value="Ajouter"/></div></form></div>
</footer>
</article><!-- end of post new article -->

j'espere que c'est un peu claire.

l'exit() n'a aucun effet toujours la meme chose

public function admin_add(){
           $errors = array();
           $errors_str = array();
           if($this->RequestHandler->isAjax() && $this->request->is('post')){
                if($this->Article->save($this->request->data)){
                   $errors'status'] = 1;
                   echo json_encode($errors);
                   $this->autoRender = false;
                   exit();
                }
                else{
                  $errors]= $this->Article->validationErrors;
                   $errors'status'] = 0;
                        foreach ($errors as $k => $v) {
                            $errors_str] = $v;
                        }
                  echo json_encode($errors_str);
                  $this->autoRender = false;
                  exit();
                }
            exit();
            }
        }

j'ai trouvé d'ou venai le blem merci
Ciloe

voici le code : en faite j'ai mis le exit() , a la fin du et supprimé le $this->request->is('post') dans la condition:

if($this->RequestHandler->isAjax()){

  //le reste du code
 exit();
 }

le code final :

public function admin_add(){
           $errors = array();
           $errors_str = array();
           if($this->RequestHandler->isAjax()){
                  if($this->Article->save($this->request->data)){
                       $errors'status'] = 1;
                       echo json_encode($errors);
                       $this->autoRender = false;
                    }
                    else{
                      $errors]= $this->Article->validationErrors;
                       $errors'status'] = 0;
                            foreach ($errors as $k => $v) {
                                $errors_str] = $v;
                            }
                      echo json_encode($errors_str);
                      $this->autoRender = false;
                    }
              exit();
            }
        }

Pour ceux que sa pourrai aider ! grand merci a Cileo

A Ciloe. ^^

Mais de rien avec grand plaisir :)

Au passage, met quand même un exit à la fin de ta fonction. C'est pour sécuriser. Si non ça peut laisser place à une faille de sécu ^^