OpenPNE3.8ではJavaScriptのテンプレートエンジンとしてjQueryTemplateを利用しています。 これを利用することで、APIを通じて受け取ったJSONから簡単にHTMLを加工することができます。
jQuery.tmpl()はjQueryのプラグインとして提供されているテンプレートエンジンです。 ※今後、より優れたテンプレートエンジンが登場したら変更する可能性があります。
1:OpenPNEがHTMLの土台をレンダリングする
2:JavaScriptからスマートフォンAPIを呼び出す
3:APIから取得したJSONをテンプレートに流し込む
4:できあがったHTMLを、jQuery.appned()などで出力する
この動作を示すために、一番簡単な例としてスマートフォンのメンバー検索ページに注目します。
検索結果を表示。メンバーの顔写真のアイコンが橫4列ずつ表示される。
検索ページを実現する ソースコード一式
<script id="friendListTemplate" type="text/x-jquery-tmpl">
<div class="span3">
<div class="row_memberimg row"><div class="span3 center"><a href="${profile_url}"><img src="${profile_image}" class="rad10" width="57" height="57" /></a></div></div>
<div class="row_membername font10 row"><div class="span3 center"><a href="${profile_url}">${name}</a> (${friends_count})</div></div>
</div>
</script>
4x4の1つ分のマス目を表現するテンプレートです。4列で自動的に折り返すようになっているので、 段落切り替えのためのテーブルは必要なく、シンプルな構造になっています。
<script type="text/javascript">
$(function(){
$.getJSON( openpne.apiBase + 'member/search.json?apiKey=' + openpne.apiKey, function(json) {
$result = $('#friendListTemplate').tmpl(json.data);
$('#memberFriendList').html($result);
$('#memberFriendList').show();
$('#memberFriendListLoading').hide();
});
$('#memberFriendSearch').keypress(function(){
$('#memberFriendListLoading').show();
$('#memberFriendList').hide();
$('#memberFriendList').empty();
});
$('#memberFriendSearch').blur(function(){
var keyword = $('#memberFriendSearch').val();
var requestData = { keyword: keyword, apiKey: openpne.apiKey };
$.getJSON( openpne.apiBase + 'member/search.json', requestData, function(json) {
$result = $('#friendListTemplate').tmpl(json.data);
$('#memberFriendList').html($result);
$('#memberFriendList').show();
$('#memberFriendListLoading').hide();
});
});
});
</script>
検索フォームの文字列処理と、検索結果を表示するコントロール部分はJavaScriptで書かれています。
<hr class="toumei" />
<div class="row">
<div class="gadget_header span12"><?php echo __('Search Members') ?></div>
</div>
<hr class="toumei" />
<div class="row" id="memberFriendSearchBox">
<div class="input-prepend span12">
<span class="add-on"><i class="icon-search"></i></span>
<input type="text" id="memberFriendSearch" class="realtime-searchbox" value="" />
</div>
</div>
<div class="row" id="memberFriendList">
</div>
<div class="row" id="memberFriendListLoading" style="margin-left: 0; text-align: center;">
<?php echo op_image_tag('ajax-loader.gif') ?>
</div>
検索フォームや見出しなどのHTMLはあらかじめHTMLでレンダリングされています。