« Baby CareReport ~ワンワンとあそぼう編~ | トップページ | 「mixiアプリ」は課金対応とモバイル対応もするらしい »

2009年4月24日 (金)

mixiアプリを作ってみた、その2(マイミクのマイミクまでを含めた一覧表示)

前回、マイミクのマイミクまでを含めた一覧を表示するmixiアプリを作ってみたもののAPIの動きが安定してない感じで取得できない不具合が続いてましたが、先日mixi側が対応したらしくマイミク一覧を取得できるよーになってました。

で、動かしてみた様子が↓こんな感じ。

20090423_mixiapp_01
プライバシーの関係でモザイクだらけだけなのは勘弁。m(_ _)m

チャンとニックネームやプロフィール画面へのリンクも取得できてて動作するっぽい。
ただ、1回に取得できるのは20人までとなっている模様。

で、調べてみるとnewFetchPeopleRequestにオプションのMAXを指定しないとデフォルトの20が適用されちゃうらしい。

で、改良してみたコードが↓こんな感じ。

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
  <ModulePrefs title="FriendList">
    <Require feature="opensocial-0.8"/>
  </ModulePrefs>
  <Content type="html" preferred_height="400"><![CDATA[

<STYLE type="text/css">
.fixinline {
    display:-moz-inline-box;
    -moz-box-align: center;
    display: inline-block;
    vertical-align: middle;
    width:90px;
}
.thumimg {
    margin: 5px;
    vertical-align: middle;
}
</STYLE>

<div id="friendlist">
</div>

<script type="text/javascript">

//マイミク一覧の表示
gadgets.util.registerOnLoadHandler(function () {
    try {
        //アプリを組み込んだオーナーのマイミクから取得開始
        get_friends(opensocial.IdSpec.PersonId.OWNER,1,"friendlist");
    } catch(e) {
        element.innerHTML = element.innerHTML + "error!:" + e.description + "<br>";
    }
});

function get_friends(pId,level,elementId) {
   
    //マイミク一覧の表示要素を設定
    var element = document.getElementById(elementId);
   
    //opensocial.DataRequestオブジェクトを生成
    var request = opensocial.newDataRequest();
   
    //取得元となる人と取得内容がマイミクである事を指定
    var param = {};
    param[opensocial.IdSpec.Field.USER_ID] = pId;
    param[opensocial.IdSpec.Field.GROUP_ID] = "FRIENDS";
    var friends = opensocial.newIdSpec(param);
   
    //フェッチする際のオプションを指定
    var fetchOpt = {};
    fetchOpt[opensocial.DataRequest.PeopleRequestFields.MAX ] = 1000;
    fetchOpt[opensocial.DataRequest.PeopleRequestFields.SORT_ORDER] = opensocial.DataRequest.SortOrder.NAME;
   
    //マイミクを取得
    request.add(request.newFetchPeopleRequest(friends,fetchOpt), "friends_data");
    request.send(function (response) {
        var item = response.get("friends_data");
        if (item.hadError()) {
            // エラー処理
            element.innerHTML = element.innerHTML + "error!:" + item.getErrorMessage() + "<br>";
            return;
        }
       
        //マイミクのコレクションを返す
        var people = item.getData();
       
        //デバッグ用表示
        if (window.console) console.log("マイミクの全体数:" + people.getTotalSize());
        if (window.console) console.log("マイミクの取得数:" + people.size());
        if (window.console) console.log("階層      :" + level);
        if (window.console) console.log("要素ID     :" + elementId);
        if (window.console) console.log(people);
       
        //マイミクの表示処理
        var fcnt = 0;
        if (people.size() > 0) {
            people.each(function (person) {
                //IDの取得
                var gid = person.getId();
                //ニックネームの取得
                var nickname = person.getDisplayName();
                //プロフィールURLの取得
                var prourl = person.getField(opensocial.Person.Field.PROFILE_URL);
                //サムネイルURLの取得
                var thumurl = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
                               
                if (level == 1) {
                    //マイミク一覧の生成(マイミク用)
                    fcnt = fcnt + 1 ;
                    var ol = document.createElement('ol');
                    ol.id = "fid" + gid;
                    var div = document.createElement('div');
                    if (fcnt%2 == 0) {
                        div.style.backgroundColor = '#FFFFFF';
                    } else {
                        div.style.backgroundColor = '#FFF8E9';
                    }
                    div.innerHTML = "<span class='fixinline'><img src='" + thumurl + "' class='thumimg'></span><b><a href='" + prourl + "' target='_blank'>" + nickname + "</a></b>";
                    div.appendChild(ol);
                    element.appendChild(div);
                   
                    //マイミクのマイミクを取得
                    get_friends(gid,2,ol.id);
                } else {
                    //マイミク一覧の生成(マイミクのマイミク用)
                    var li = document.createElement('li');
                    li.innerHTML = "<span class='fixinline'><img src='" + thumurl + "' class='thumimg'></span><a href='" + prourl + "' target='_blank'>" + nickname + "</a>";
                    element.appendChild(li);
                }
            });
        } else {
            element.innerHTML = element.innerHTML + "友達いないよ・・・(´・ω・`)";
        }
    });
}
</script>

]]></Content>
</Module>

一応、並びを一定にするためにSORT_ORDERを指定して名前で並ぶよーにしているけど・・・ニックネーム表示じゃ、あんまり意味が無いかもね。(^^;A

あと、再帰処理の実装がかなり泥臭いですが気にしないで下さい。( ̄▽ ̄;A

ちなみにプロフィール画像のサムネイルのサイズが揃ってないために、ニックネームの表示開始位置が揃わない事を防ぐため、ココに記載されているCSSテクニックの「インライン要素に固定幅を与える」を利用しています。

インディーズアプリとして下記URLで公開していますので、興味のある方は試してみてください。
http://platform001.mixi.jp/view_appli.pl?id=1377

【2009.06.02追記】

この後、数回改良を加えてます。その詳細はコチラです。

|

« Baby CareReport ~ワンワンとあそぼう編~ | トップページ | 「mixiアプリ」は課金対応とモバイル対応もするらしい »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/29262269

この記事へのトラックバック一覧です: mixiアプリを作ってみた、その2(マイミクのマイミクまでを含めた一覧表示):

» 2009/4/23 mixiアプリカンファレンスのまとめ(2) [ラボブログ]
2009/4/23 mixiアプリカンファレンスのまとめ ( ラボブログ ) からの続きです。ちょっと長くなり保存出来なくなったので分けました。 mixi アプ... [続きを読む]

受信: 2009年4月24日 (金) 03:35

» OpenSocial アプリ向け仮想通貨の仕様の翻訳があげられてます [ラボブログ]
スパイスラボ神部です。 OpenSocialでの共通課金APIの仕様の翻訳があがってます。 -天使やカイザーと呼ばれて: OpenSocialでの共通課金API... [続きを読む]

受信: 2009年7月 5日 (日) 22:11

« Baby CareReport ~ワンワンとあそぼう編~ | トップページ | 「mixiアプリ」は課金対応とモバイル対応もするらしい »