如果要开发游戏,存储玩家数据,或制作排行榜单,或调查问卷,或......比如圣叹新作:Love Me挂件只是逗逗美女,离开了数据的存储--尤其是所有挂件用户可见(非Person Appdata)就显得无能为力。Opensocial 0.7删除了用于全局存储的newUpdateInstanceAppDataRequest方法,且newFetchPersonAppDataRequest只能使用ViewerID存储,但是Myspace为开发者们提供了另一条存储路径:MyOpenSpace扩展。
在MyOpenSpace扩展中仍然使用Opensocial协议的newFetchPersonAppDataRequest / newUpdatePersonAppDataRequest方法,只是在存取是添加参数MyOpenSpace.Group.GLOBAL_APP_DATA即可实现InstanceAppData的功能,格式如下:
newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key");
newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key", "value");
比如在Love Me挂件中,每个用户独立的数据存储在全局GLOBAL_APP_DATA表中,为了区分不同用户的数据使用挂件安装者(Owner)的ID做Key,所以在获取数据之前要首先取得OwnerID:
function init()
{
$('errorBox').style.display = "none";
var os = opensocial.Container.get();
var dataReqObj = os.newDataRequest();
dataReqObj.add(os.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER));
dataReqObj.send(onGetOwner);
}
function onGetOwner(response)
{
if(response.hadError())
{
//
}
else
{
var owner = response.get(opensocial.DataRequest.PersonId.OWNER).getData();
ownername = owner.getDisplayName();
ownerid = owner.getId();
getAppData();
}
}
接下来则需要利用该ownerid获取存储的数据,由于每条数据由正文和回复组成,所以key由ownerid + 'lovemewidget' 与ownerid + 'lovememanager'组成:
function getAppData()
{
var os = opensocial.Container.get();
var dataReqObj = os.newDataRequest();
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovemewidget'), 'loveme');
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovememanager'), 'manager');
dataReqObj.send(onGetAppdata);
}
function onGetAppdata(response)
{
if(response.hadError())
{
//
}
else
{
var data = response.get('loveme').getData();
var resp = response.get('manager').getData();
var html = "";
if(data[ownerid + "lovemewidget"])
html+= data[ownerid + "lovemewidget"];
if(resp[ownerid + "lovememanager"])
html+= resp[ownerid + "lovememanager"];
$('output').innerHTML = html;
getViewerData();
}
}
注意取得Appdata的方式与普通newFetchPersonAppDataRequest的区别,不再使用PersonAppData中的ViewerID取值,而是直接使用getData()方法:
数据的存储也仅仅在newUpdatePersonAppDataRequest添加参数实现,例如:
function onSubmit()
{
if(viewername == "")
{
$('errorBox').style.display = "block";
$('errorBox').innerHTML = "您可能尚未登录...";
return;
}
var actionObj = $("actionSel");
var resultObj = $("resultSel");
var actionStr = actionObj.options[actionObj.selectedIndex].text;
var resultStr = resultObj.options[resultObj.selectedIndex].text;
var rs = opensocial.newDataRequest();
//key由ownerid区分
var key = ownerid + "lovemewidget";
var value = ownername + "正在被 " + "<a href=\""+ viererprofile +"\" target=\"_blank\">" + viewername + "</a> <strong>"+ actionStr + "</strong>的<strong>" + resultStr + "</strong>";
displayContent = value;
//存储Appdata,全局变量
rs.add(rs.newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, key, value), 'loveme');
rs.send(updateSent);
$('output').innerHTML = "正在保存数,IE浏览器请提交后刷新页面查看结果。";
}
更加详细的源代码请参考Love Me挂件:http://www.myspace.cn/1306769259
在MyOpenSpace扩展中仍然使用Opensocial协议的newFetchPersonAppDataRequest / newUpdatePersonAppDataRequest方法,只是在存取是添加参数MyOpenSpace.Group.GLOBAL_APP_DATA即可实现InstanceAppData的功能,格式如下:
newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key");
newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, "key", "value");
比如在Love Me挂件中,每个用户独立的数据存储在全局GLOBAL_APP_DATA表中,为了区分不同用户的数据使用挂件安装者(Owner)的ID做Key,所以在获取数据之前要首先取得OwnerID:
function init()
{
$('errorBox').style.display = "none";
var os = opensocial.Container.get();
var dataReqObj = os.newDataRequest();
dataReqObj.add(os.newFetchPersonRequest(opensocial.DataRequest.PersonId.OWNER));
dataReqObj.send(onGetOwner);
}
function onGetOwner(response)
{
if(response.hadError())
{
//
}
else
{
var owner = response.get(opensocial.DataRequest.PersonId.OWNER).getData();
ownername = owner.getDisplayName();
ownerid = owner.getId();
getAppData();
}
}
接下来则需要利用该ownerid获取存储的数据,由于每条数据由正文和回复组成,所以key由ownerid + 'lovemewidget' 与ownerid + 'lovememanager'组成:
function getAppData()
{
var os = opensocial.Container.get();
var dataReqObj = os.newDataRequest();
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovemewidget'), 'loveme');
dataReqObj.add(os.newFetchPersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, ownerid + 'lovememanager'), 'manager');
dataReqObj.send(onGetAppdata);
}
function onGetAppdata(response)
{
if(response.hadError())
{
//
}
else
{
var data = response.get('loveme').getData();
var resp = response.get('manager').getData();
var html = "";
if(data[ownerid + "lovemewidget"])
html+= data[ownerid + "lovemewidget"];
if(resp[ownerid + "lovememanager"])
html+= resp[ownerid + "lovememanager"];
$('output').innerHTML = html;
getViewerData();
}
}
注意取得Appdata的方式与普通newFetchPersonAppDataRequest的区别,不再使用PersonAppData中的ViewerID取值,而是直接使用getData()方法:
var data = response.get('loveme').getData();
数据的存储也仅仅在newUpdatePersonAppDataRequest添加参数实现,例如:
function onSubmit()
{
if(viewername == "")
{
$('errorBox').style.display = "block";
$('errorBox').innerHTML = "您可能尚未登录...";
return;
}
var actionObj = $("actionSel");
var resultObj = $("resultSel");
var actionStr = actionObj.options[actionObj.selectedIndex].text;
var resultStr = resultObj.options[resultObj.selectedIndex].text;
var rs = opensocial.newDataRequest();
//key由ownerid区分
var key = ownerid + "lovemewidget";
var value = ownername + "正在被 " + "<a href=\""+ viererprofile +"\" target=\"_blank\">" + viewername + "</a> <strong>"+ actionStr + "</strong>的<strong>" + resultStr + "</strong>";
displayContent = value;
//存储Appdata,全局变量
rs.add(rs.newUpdatePersonAppDataRequest(MyOpenSpace.Group.GLOBAL_APP_DATA, key, value), 'loveme');
rs.send(updateSent);
$('output').innerHTML = "正在保存数,IE浏览器请提交后刷新页面查看结果。";
}
更加详细的源代码请参考Love Me挂件:http://www.myspace.cn/1306769259
网友评论(0):


