しかも自分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 件のコメント:
コメントを投稿