2011-09-03 21 views
7

Estoy usando mucho jQuery en un proyecto en el que estoy trabajando.Envío de respuesta de codificación en json

Tengo una función javascript que hace una solicitud AJAX a un controlador que devuelve datos en JSON.

Me gustaría mostrar un mensaje fácil de usar que informe al usuario que todavía no tiene información almacenada. Pero estoy confundido en cuanto a cómo enviar una respuesta en JSON para que mi función javascript pueda determinar si el usuario tiene información para mostrar.

Aquí es mi función javascript:

function latest_pheeds() { 
    var action = url+"pheeds/latest_pheeds"; 
    $('#pheed-stream').html('<div class="loading"></div>'); 
    $('.loading').append('<img src="'+pheed_loader_src+'" />'); 
    $.ajax({ 
     url:action, 
     type:'GET', 
     dataType:'json', 
     error: function() { 
     }, 
     success:function(data) { 
      $('.loading').fadeOut('slow'); 
      $.each(data,function(index,item) { 
      $('#pheed-stream').append 
      (
      '<div class="pheed" id="'+item.pheed_id+'">'+ 
      '<p><a class="user_trigger" href="users/info/'+item.user_id+'">' 
      +item.user_id+'</a></p>'+ 
      '<p>'+item.pheed+'</p>'+ 
      '<div class="pheed_meta">'+ 
      '<span>'+item.datetime+' Ago</span>'+ 
      '<span class="cm">'+item.comments+ 
      '<img class="comment_trigger" src="/pheedbak/assets/img/comment.png" title="Click to comment on pheed" onclick="retrieve_comments('+item.pheed_id+')">'+ 
      '</span>'+ 
      '<span>'+item.repheeds+ 
      ' Repheeds'+ 
      '<img class="repheed_trigger" src="/pheedbak/assets/img/communication.png" title="Click to repheed" onclick="repheed('+item.pheed_id+')">'+ 
      '</span>'+ 
      '<span>'+ 
      'Favourite'+ 
      '<img class="favourite_trigger" src="/pheedbak/assets/img/star.png" title="Click to make this a favourite" onclick="favourite_pheed('+item.pheed_id+')" />'+ 
      '</span>'+ 
      '</div>'+ 
      '</div>' 
      ); 
     }); 
     } 
    }); 
} 

Y aquí tiene la función de controlador de la solicitud Ajax se hace a

function latest_pheeds() { 
    //Confirm if a user is logged before allowing access 
    if($this->isLogged() == true) { 
     //load the pheed model for database interaction 
     $this->load->model('pheed_model'); 
     //load user model 
     $this->load->model('user_model'); 
     //load comment model 
     $this->load->model('comment_model'); 
     //store the pheeds to a the $data variable 
     $data = $this->pheed_model->get_latest_pheeds(); 
     //Load the date helper to calculate time difference between post time and current time 
     $this->load->helper('date'); 
     //Current time(unix timetamp) 
     $time = time(); 
     //pheeds 
     $pheeds = array(); 
     if(count($data) > 0) { 
      foreach($data as $pheed) { 
       $row['pheed_id'] = $pheed->pheed_id; 
       $row['user_id'] = $this->user_model->return_username($pheed->user_id); 
       $row['pheed'] = $pheed->pheed; 
       $row['datetime'] = timespan($pheed->datetime,$time); 
       $row['comments'] = $this->comment_model->count_comments($pheed->pheed_id); 
       $row['repheeds'] = $pheed->repheeds; 
       $pheeds[] = $row; 
      } 

      echo json_encode($pheeds); 
      $response['response'] = "Ok"; 
      $res[] = $response; 
      echo json_encode($res)."\n"; 
     } 
    } else { 

    } 

Genera la salida JSON, pero la sintaxis se ha roto así que no puedo leer con javascript, pero una vez que me deshago del siguiente código del método anterior funciona normalmente

$response['response'] = "Ok"; 
    $res[] = $response; 
    echo json_encode($res)."\n"; 
+0

puedo enviar sólo los datos JSON en la cabecera HTTP en lugar de la página web? – Rajan

Respuesta

14

DEBE utilizar solo json_encode ($ data) una vez en una respuesta, si desea generar más material, debe fusionar sus datos en una matriz y enviarlos.

EDIT: Para ser claro, de una manera que podría hacerlo es la siguiente:

echo json_encode(array('pheeds' => $pheeds, 'res' => $res)); 

Luego, en JS que se obtiene una matriz con las teclas "pheeds" y "res".

Aunque puede ser de poca importancia práctica, También recomendaría hacer esto antes de hacerse eco de la cadena codificada JSON:

header('Content-Type: application/json');