AirVergo

Web製作にまつわる雑記帳です。たまに更新してます。

Backbone.jsのModel.save()でのサーバ側実装について

2014/5/5

最近はBackbone.jsを使って打刻アプリを作っています。

ちょっとはまったところがあったのでメモ程度に投稿します。

Backbone.jsのModelのsave()メソッドというのがあります。

Backbone.jsについては以下サイトを参照してください

http://appkitbox.com/knowledge/javascript/2013/03/15/backbone-1

で、サーバ側の実装についてなのですが、、ちょっとはまりました。

jsとサーバ側の動作の流れなのですが、

①Model.save()メソッド実行

②サーバ側にPOSTメソッドをリクエスト

③サーバ側でデータベースにINSERT、、

ここから先でjs側でデータをid付きデータに更新する流れになるのはわかっていたのですが、以下のようになるようです。

 

①Model.save()メソッド実行。

②サーバ側にPOSTメソッドをリクエスト。

③サーバ側でデータベースにINSERT。

④サーバ側からjsにINSERTしたレコードをJSON形式でレスポンス。

⑤jsでフロント側にデータを反映。

となるようです。

実装例は以下になります。(backbone.js初心者なので拙いコードですが、、)

JS側

var Timecard = Backbone.Model.extend({
urlRoot: ‘/time/rest’,
idAttribute: ‘id’
});

var inAction = function(user_id){
var timecard = new Timecard();
timecard.set({user_id: user_id});
timecard.save(null,{
success: function(model, response){
timeSet(model, ‘in_time’);
$(‘#out_time’).prop(‘disabled’, false);
timecardId = model.get(‘id’);
},
error: function(model, response){
console.log(response);
}
});
}

var timeSet = function(model, target){
var time = model.get(target).split(/[- :]/);
var in_time = new Date(time[0], time[1] – 1, time[2], time[3], time[4], time[5]);
var hour = in_time.getHours();
var minute = in_time.getMinutes();
if(minute < 10){
minute = ‘0’ + minute;
}
$(‘#’ + target).replaceWith(‘<span>’ + hour + ‘:’ + minute + ‘</span>’);
};

 

PHP側(Curryフレームワークを使っています)

 

public function restPost()
{
$requestData = json_decode(file_get_contents(‘php://input’), TRUE);
$timecard = $this->model(‘Time’);
$timecard->create($requestData[‘user_id’]);

$row = $timecard->getByUidNumber($requestData[‘user_id’]);
$this->response->json($row);
}

public function rest()
{
$id = $this->params[0];
$timecard = $this->model(‘Time’);
$row = $timecard->find($id);
$this->response->json($row);
}

public function restPut()
{
$requestData = json_decode(file_get_contents(‘php://input’), TRUE);
$timecard = $this->model(‘Time’);
$timecard->out_time($requestData[‘id’]);

$row = $timecard->getByUidNumber($requestData[‘user_id’]);
$this->response->json($row);
}

なお、PHP側でbackbone.jsのパラメータを取得する際、問題があってbackbone.jsがjson形式でパラメータを送信するので工夫が必要です。以下サイトが参考になります。

http://shusatoo.net/programming/php/backbone-model-save-postdata-read-php/

 

facebooktwittergoogle_plusredditpinterestlinkedinmail