2012年6月6日水曜日

symfonyでobject配列をjavascriptに渡す

具体的にはajaxで適当な情報をオブジェクト配列で取得してきたものをjQueryを使ってギュンギュン表示したいのでjavascriptに取得してきたデータをオブジェクト配列で渡したかったのです。
しかも自分actionで処理してview(twig)を経由しないと何も組めないのでその流れを使っています。
まずjavascript側から
      $.ajax({
        url: "getlist",
        cache: false,
        type: "POST",
        data: {id: id},
        success: function(data){
          callback(data);
        },
        error: function(data){
          alert('失敗');
        },
        complete: function(){}
      });
こんな感じでurl:getlistとか適当なところにリクエストかけます。
getlistはまあ自分のactionなんですけれども
で、アクションですが

  public function executeGetlist (sfWebRequest $request)
  {
    $this->setLayout(false);
    /*なんらかのサービスにデータを問い合わせた結果が$data_listにオブジェクトの配列で   入ってると思って下さい
       $data_list = array( array('id'=>0,'text'=>'aaaaa'),array('id'=>1,'text'=>'bbbb'));
とかそんな感じ?
   */
    $this->data_list = json_encode( (array)$data_list );

  }
ってやってこいつのviewではgetlistSuccess.html(twig)
{{ data_list  }}
とだけ書いておいてですね。


     callback: function(data) {
          var self = this;
          var dataList = eval(data);
          if (dataList.length > 0) {
              var data = dataList.pop();
              alert(data.id+data.text);
          }
          setTimeout(function() {
               self.render(dataList);
          }, 2000);
      }

ってやると順次表示される感じでした。
とにかく
json_encode()してviewでそれをまんま表示してeval()で変数にすればいいようです。

その後の補足
どうもevalに関してはnew Functionを使う方法もあるみたいで

     var dataList = eval("("+data+")");
     var dataList = (new Function("return ("+data+")"))();
どっちでもいいみたい
速度とそのコードのスコープに差があるようです。
また、上では知らなかったのだがdataを文字列()でくくる必要があるみたい。


さらにviewの部分ですがviewを使わないでgetJsonで呼び出してactionでは

public function executeRefresh()
{
  $output = '{"title":"My basic letter","name":"Mr Brown"}';
  $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
 
  return sfView::HEADER_ONLY;
}

とやるのが一番良いようですがもう面倒なのでajaxでやったしまったのですが
{{ data_list  }}
とかviewでやるよりもactionで
    return $this->renderText(json_encode($result));  
とやってテンプレート使わないほうがいいみたい。



0 件のコメント:

コメントを投稿