With the newest version of OpenSocial out, I felt compelled to revisit it, despite the fact that my new job couldn't have me farther from it. A labor of love, some would say, to stay up-to-date on a constantly evolving platform, like trying to hold onto pudding with your bare hands. Anyways, where was I?
I'm going to develop an OpenSocial 0.8 app from scratch. Let's get started. First, I need to set up the initial scaffold.
<?xml version="1.0" encoding="UTF-8" ?><Module><ModulePrefs title="Pandaface"><Require feature="opensocial-0.8"/></ModulePrefs><Content type="html"><![CDATA[<div id="gadgetdiv">Panda!</div>]]></Content></Module>
Step 2 is setting up the first data request. In my first request, I like to get the OWNER and VIEWER objects. These will allow me to know if the viewer is looking at their own version of the App or someone else's. To do this, gogoGadget is changed to look like this.
function gogoGadget()This creates a request object, adds two FetchPersonRequests, and sends the request out, saying that the function 'response' will deal with the data response. It is important to note that the callback will not execute until it has all the data. Let's lake a took at the response function.
{
var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest("OWNER"), "get_owner");
request.add(request.newFetchPersonRequest("VIEWER"), "get_viewer");
request.send(response);
};
function response(responseData) { owner = responseData.get('get_owner').getData(); viewer = responseData.get('get_viewer').getData(); };
Not terribly interesting at the moment, but it is important to note a few things. In gogoGadget, the last paramter that is given is a name for the specific response. MAKE SURE THESE MATCH UP. In my other OpenSocial adventures, I got that mixed up at one point, and couldn't for the life of me figure out what was going wrong.
Now, let's pull down some persistent data. I'm just going to have a single variable, face_data, and pull it from the orkut sandbox server. To do this, I have to declare another datarequest, and add a newFetchPersonAppDataRequest. Back in .7, you could just pass the user's id, and the name of the app data you wanted to pull. Now, however, you have to create an IdSpec object for it. This is new, and fairly unintuitive (especially to people who've been working with it as long as I have). Here's the full data request.
var ownerspec = opensocial.newIdSpec({ "userId" : "OWNER" , "groupId" : "SELF"});var datarequest = opensocial.newDataRequest();datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_data"),"face_data");datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_url"),"face_url");datarequest.send(loadUI);
function loadUI(responseData){var facedata = responseData.get('face_data').getData()[owner.getId()];var faceurl = responseData.get('face_url').getData()[owner.getId()];var to_output = owner.getDisplayName() + " is a ";if(facedata == null){to_output += "lazy";}else{to_output += facedata.face_data;}to_output += " panda.";if(faceurl == null){faceurl = "http://www.cs.drexel.edu/~asc38/Google/meh.png";}else{faceurl = faceurl.face_url;}
if(owner.isViewer()){
owner_output = '
';document.getElementById("gadgetdiv").innerHTML += owner_output;}
var updaterequest = opensocial.newDataRequest();updaterequest.add(updaterequest.newUpdatePersonAppDataRequest("VIEWER", "face_data", newemotion), "update1");updaterequest.send(finishUpdate);
function finishUpdate(responseData){var ownerspec = opensocial.newIdSpec({ "userId" : "OWNER" , "groupId" : "SELF"});var datarequest = opensocial.newDataRequest();datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_data"),"face_data");datarequest.add(datarequest.newFetchPersonAppDataRequest(ownerspec,"face_url"),"face_url");datarequest.send(loadUI);}