SlideShare a Scribd company logo
1 of 43
JavaScript
テンプレートエンジンで
活かすData API
2015/2/22
【MT東京-10】Data API 2.0
藤本 壱
1
アジェンダ
• 自己紹介
• Data APIの概要
• JavaScriptテンプレートエンジンでData APIを活かす
• Handlebarsでの例
• Angular.jsでの例
• まとめ
2
自己紹介
3
自己紹介その1
• 藤本 壱(ふじもと はじめ)
• 兵庫県伊丹市出身
• 群馬県前橋市在住
東京
埼玉
山梨
神奈川
栃木
茨城
千葉
4
富岡製糸場
世界遺産入り
ゆるキャラ
グランプリ
優勝
自己紹介その2
• 本職はPC系のフリーライター
• 2004年秋からMovable Typeユーザー
• さまざまなプラグインを開発
5
自己紹介その3
• ブログはもちろんMovable Type
6
http://www.h-fj.com/blog/
Data APIの概要
7
Data APIを
使ったことがありますか?
8
今までのWeb製作
• HTMLとCSSでページを作成
• JavaScriptを入れて動きを持たせる
• 動的なコンテンツはサーバー側(PHP等)で生成
9
フロントエンド側の処理が増加
• Ajaxによるレンダリング
• サーバーからデータのみ受け取り
• クライアント側でJavaScriptでレンダリング
• Webブラウザのアプリケーションプラットフォーム化
• 例:Webメール、Google Maps、Google Document
10
サーバー側でのHTML生成の必要性が減少
フロントエンド側から生データを取得して処理することが増加
ネイティブアプリの流行
• iOS/Androidの伸長でネイティブアプリ化
• WebアプリではiOS/Androidの機能/性能をフルには引き出せない
• ネイティブアプリの利用が増加
• PCではブラウザ、スマートフォン/タブレットではネイティブアプリで
閲覧することが増加
• サーバー側との連携が必要
• HTTPでサーバーにアクセスしたい
• HTMLではなく生データが欲しい
11
Data APIの登場
• 管理画面を使わずにMovable Typeのデータを操作する仕組み
• HTTPプロトコルでData APIにアクセス
• アクセスするアドレスとメソッドに応じて操作(REST)
• データの取得/作成/更新/削除が可能
• データはJSON形式で受け渡し
• 各種のプログラム言語でアクセス可能
• JavaScriptライブラリあり
• プラグインで拡張可能(事例はこの後のセッションで)
12
Data APIにアクセスする例
• IDが1番のウェブサイトから記事を読み込む
http://your-host/path-to-mt/mt-data-api.cgi/v2/sites/1/entries
13
Data APIバージョン2.0が登場
• Movable Type 6.0ではバージョン1.0
• 利用頻度が特に高い機能だけ装備
• できないことも少なくなかった
• Movable Type 6.1でバージョン 2.0に進化
• 機能が大幅に増加
• Movable Typeの大半の部分をData APIで操作可能
• 詳しくは後の高山さんのセッションで…
14
Data APIでできること
• Web製作では…
• ページ分割
• 検索
• 独自の管理画面
• Etc.
• Web製作以外では…
• スマートフォン/タブレット用アプリのバックエンド
• 外部へのデータ提供
• Etc.
15
テンプレートエンジンでData APIを活かす
16
Data APIの難点
• プログラミングが必要
• デザイナー(ノンプログラマー)の方には難しい
• 開発すべてをプログラマーに任せると…
• デザインが…
• HTMLを修正するたびにプログラマーに依頼…
17
テンプレートエンジンでデザインとロジックを分離
• テンプレートエンジン=テンプレートを解釈してHTML等に変換
して出力する仕組み
• Movable Typeもテンプレートエンジン
• ロジック(プログラム)とデザインを分離
• プログラマーとデザイナーの分業
18
JavaScriptテンプレートエンジンを活用
• JavaScriptならData APIのプログラミングをしやすい
• JavaScriptのテンプレートエンジンと組み合わせることも可能
• MTMLに近い形でテンプレートを記述できるように工夫
19
HandleBarsでの例
20
HandleBarsの概要
• http://handlebarsjs.com/
• 比較的シンプルなテンプレートエンジン
• ロジックレス(テンプレートにプログラムを書かない)
• mustacheの上位互換
• JavaScriptのオブジェクトをテンプレートに当てはめて出力
• 機能拡張も可能(ヘルパー)
21
HandleBarsの基本
22
<script id="tmpl" type="text/x-
handlebars-template">
<ul>
{{#names}}
<li>Hello, {{name}}</li>
{{/names}}
</ul>
</script>
<div id="output"></div>
var src = $('#tmpl').html();
var tmpl = Handlebars.compile(src);
var names = [
{ name: 'Taro' },
{ name: 'Jiro' },
{ name: 'Saburo' }
];
var output = tmpl({ names: names });
$('#output').html(output);
テンプレート JavaScript
HandleBarsの基本
23
<script id="tmpl" type="text/x-
handlebars-template">
<ul>
{{#names}}
<li>Hello, {{name}}</li>
{{/names}}
</ul>
</script>
<div id="output"></div>
<div id="output">
<ul>
<li>Hello, Taro</li>
<li>Hello, Jiro</li>
<li>Hello, Saburo</li>
</ul>
</div>
テンプレート 結果
HandlerBars+Data APIの例:ページ分割
• Data APIで各ページの記事のデータを取得
• できるだけMovbale Typeのテンプレートに近い感じになるよう
にデータを一部加工
• テンプレートにデータを当てはめて出力
24
記事一覧出力部分
25
<ul>
{{#mt:Entries}}
<li>
<h2>
<a href="{{mt:EntryPermalink}}">{{mt:EntryTitle}}</a>
</h2>
<p>{{mt:EntryExcerpt}}</p>
</li>
{{/mt:Entries}}
</ul>
ページ移動リンク出力部分
26
<ul class="pager">
{{#mt:PagerBlock}}
<li>
{{#mt:IfCurrentPage}}
{{mt:CurrentPage}}
{{/mt:IfCurrentPage}}
{{#mt:IfNotCurrentPage}}
<a href="{{mt:PagerLink}}">{{mt:CurrentPage}}</a>
{{/mt:IfNotCurrentPage}}
</li>
{{/mt:PagerBlock}}
</ul>
記事の読み込みとデータの加工
27
DataAPI.listEntries(<$mt:BlogID$>, params, function(response) {
var o = {};
o['mt:Entries'] = [];
for (var i = 0; i < response.items.length; i++) {
var r = response.items[i];
o['mt:Entries'].push({
'mt:EntryTitle': r.title,
'mt:EntryExcerpt': r.excerpt,
'mt:EntryPermalink': r.permalink
});
}
ページ移動リンク出力用データの作成
28
o['mt:PagerBlock'] = [];
for (var i = 0; i < totalPages; i++) {
o['mt:PagerBlock'].push({
'mt:CurrentPage': i + 1,
'mt:IfCurrentPage': (i + 1 == page_num),
'mt:IfNotCurrentPage': (i + 1 != page_num),
'mt:IfMoreResults': (i < totalPages - 1),
'mt:IfPreviousResults': i > 1,
'mt:NextLink': '#/' + (i + 2),
'mt:PreviousLink': '#/' + i,
'mt:PagerLink': '#/' + (i + 1),
});
}
Angular.jsでの例
29
Angular.jsの概要
• https://angularjs.org/
• Google製/オープンソース
• MVW(Model-View-Whatever)のWebアプリ開発フレームワーク
• 多彩な機能
• テンプレートエンジン
• 双方向データバインディング
• URLのルーティング
• Etc.
30
Angular.jsの基本
31
<html ng-app="SampleApp">
<head>
・・・
</head>
<body ng-controller="SampleAppCtrl">
<ul>
<li ng-repeat="name in names">
Hello, {{name}}
</li>
</ul>
</body>
</html>
var SampleApp =
angular.module('SampleApp', []);
SampleApp.controller('SampleAppCtrl',
function($scope) {
$scope.names = [
'Taro', 'Jiro', 'Saburo',
];
}
);
テンプレート JavaScript
Angular.jsの基本
32
<html ng-app="SampleApp">
<head>
・・・
</head>
<body ng-controller="SampleAppCtrl">
<ul>
<li ng-repeat="name in names">
Hello, {{name}}
</li>
</ul>
</body>
</html>
<ul>
<li>Hello, Taro</li>
<li>Hello, Jiro</li>
<li>Hello, Saburo</li>
</ul>
テンプレート 結果
Angular.js+Data APIの例:独自の記事編集画面
• 一覧で編集対象の記事を選択
• 編集ページで記事を編集して保存
• Data APIで記事の取得/保存を行い、Angular JSで入出力を管
理
33
記事一覧出力部分
34
<ul>
<li ng-repeat="mt in mt.Entries">
<h2>
<a href="{{mt.EntryPermalink}}">{{mt.EntryTitle}}</a>
</h2>
<p>{{mt.EntryExcerpt}}</p>
</li>
</ul>
ページ移動リンク出力部分
35
<ul class="pager">
<li ng-repeat="mt in mt.PagerBlock">
<span ng-if="mt.IfCurrentPage">
{{mt.CurrentPage}}
</span>
<a ng-if="mt.IfNotCurrentPage" href="{{mt.PagerLink}}">
{{mt.CurrentPage}}
</a>
</li>
</ul>
記事編集ページ出力部分
36
<form ng-submit="save()">
<p>タイトル
<input type="text" size="50" ng-model="mt.EntryTitle“
ng-disabled="disableFlag" />
</p>
<p>本文<br />
<textarea rows="15" cols="80" ng-model="mt.EntryBody“
ng-disabled="disableFlag"></textarea>
</p>
<p><button type="submit">保存</button></p>
</form>
記事一覧の読み込みとデータの加工
37
DataAPI.listEntries(<$mt:BlogID$>, params, function(response) {
$scope.mt = {};
$scope.mt.Entries = [];
for (var i = 0; i < response.items.length; i++) {
var r = response.items[i];
$scope.mt.Entries.push({
EntryTitle: r.title,
EntryExcerpt: r.excerpt,
EntryPermalink: r.permalink
});
}
});
記事編集画面の表示
38
DataAPI.getEntry(<$mt:BlogID$>, $scope.entry_id,
function(response) {
$scope.mt.IfLogin = true;
$scope.mt.EntryTitle = response.title;
$scope.mt.EntryBody = response.body;
$scope.$apply();
}
);
記事の保存
39
var entry = {
title: $scope.mt.EntryTitle,
body: $scope.mt.EntryBody
};
DataAPI.updateEntry(<$mt:BlogID$>, $scope.entry_id,
entry, function(response) {
alert('記事を保存しました。');
});
テンプレートエンジンの使い分け
• 案件によって異なる
• 単純なデータ出力だけ → シンプルなテンプレートエンジン
• Webアプリ的な複雑な処理 → フレームワーク
40
まとめ
41
まとめ
• JavaScriptテンプレートエンジンを活用して、JavaScript絡みの処
理でもロジックとデザインを分離
• Data APIとJavaScriptテンプレートエンジンを組み合わせることも
可能
• テンプレートエンジンでData APIを活用
42
ご清聴ありがとうございました
43

More Related Content

Similar to JavaScriptテンプレートエンジンで活かすData API

Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
Naoyuki Yamada
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
 

Similar to JavaScriptテンプレートエンジンで活かすData API (20)

Data APIの基本
Data APIの基本Data APIの基本
Data APIの基本
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
Data APIの背景と活用方法
Data APIの背景と活用方法Data APIの背景と活用方法
Data APIの背景と活用方法
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
 
Movable type 6 Overview (2013.10.24)
Movable type 6 Overview (2013.10.24)Movable type 6 Overview (2013.10.24)
Movable type 6 Overview (2013.10.24)
 
Develop Web Application with Node.js + Express
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
 
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccamp
 
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
 
Power Appsで Excel関数を利用する3つの方法
Power Appsで Excel関数を利用する3つの方法Power Appsで Excel関数を利用する3つの方法
Power Appsで Excel関数を利用する3つの方法
 
KanbanとTHETAとDK2とわたし
KanbanとTHETAとDK2とわたしKanbanとTHETAとDK2とわたし
KanbanとTHETAとDK2とわたし
 
20120118 titanium
20120118 titanium20120118 titanium
20120118 titanium
 
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道かSwift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
 
Azure IoT Edge で Custom Vision
Azure IoT Edge で Custom VisionAzure IoT Edge で Custom Vision
Azure IoT Edge で Custom Vision
 

More from Hajime Fujimoto

More from Hajime Fujimoto (20)

Movable Typeでロボットを動かす?AIスピーカーをしゃべらせる?Data APIでMovable TypeとIoTをFUSION
Movable Typeでロボットを動かす?AIスピーカーをしゃべらせる?Data APIでMovable TypeとIoTをFUSIONMovable Typeでロボットを動かす?AIスピーカーをしゃべらせる?Data APIでMovable TypeとIoTをFUSION
Movable Typeでロボットを動かす?AIスピーカーをしゃべらせる?Data APIでMovable TypeとIoTをFUSION
 
コンテンツタイプの活用と拡張
コンテンツタイプの活用と拡張コンテンツタイプの活用と拡張
コンテンツタイプの活用と拡張
 
PowerCMSとIoTの連携
PowerCMSとIoTの連携PowerCMSとIoTの連携
PowerCMSとIoTの連携
 
Connect with Data API
Connect with Data APIConnect with Data API
Connect with Data API
 
Objecttreeプラグイン&ObjectRelationプラグインのご紹介
Objecttreeプラグイン&ObjectRelationプラグインのご紹介Objecttreeプラグイン&ObjectRelationプラグインのご紹介
Objecttreeプラグイン&ObjectRelationプラグインのご紹介
 
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
PHPやVBAでMovable Typeを操作しようData API Library for PHP/VBAのご紹介
 
Movable Typeの権限と承認フロー
Movable Typeの権限と承認フローMovable Typeの権限と承認フロー
Movable Typeの権限と承認フロー
 
2つの「Layout」プラグインでMovable Typeをパワーアップ
2つの「Layout」プラグインでMovable Typeをパワーアップ2つの「Layout」プラグインでMovable Typeをパワーアップ
2つの「Layout」プラグインでMovable Typeをパワーアップ
 
はじめよう!MovableType.net ハンズオン
はじめよう!MovableType.net ハンズオンはじめよう!MovableType.net ハンズオン
はじめよう!MovableType.net ハンズオン
 
Movable Type 6.0をできるだけ安く使う方法
Movable Type 6.0をできるだけ安く使う方法Movable Type 6.0をできるだけ安く使う方法
Movable Type 6.0をできるだけ安く使う方法
 
WordPress on Movable Type
WordPress on Movable TypeWordPress on Movable Type
WordPress on Movable Type
 
WordPress on Movable Type
WordPress on Movable TypeWordPress on Movable Type
WordPress on Movable Type
 
Vagrantのすすめ
VagrantのすすめVagrantのすすめ
Vagrantのすすめ
 
WordPress on Movable Type
WordPress on Movable TypeWordPress on Movable Type
WordPress on Movable Type
 
WordPress on movable type(WordCamp Kobe 2013)
WordPress on movable type(WordCamp Kobe 2013)WordPress on movable type(WordCamp Kobe 2013)
WordPress on movable type(WordCamp Kobe 2013)
 
Wordpress on Movable Type~WPConnectorプラグインのご紹介~
Wordpress on Movable Type~WPConnectorプラグインのご紹介~Wordpress on Movable Type~WPConnectorプラグインのご紹介~
Wordpress on Movable Type~WPConnectorプラグインのご紹介~
 
デザイナーにもできる再構築の高速化/負荷分散
デザイナーにもできる再構築の高速化/負荷分散 デザイナーにもできる再構築の高速化/負荷分散
デザイナーにもできる再構築の高速化/負荷分散
 
Amazonec2ではじめるMovable Type
Amazonec2ではじめるMovable TypeAmazonec2ではじめるMovable Type
Amazonec2ではじめるMovable Type
 
Word Press on Movable Type
Word Press on Movable TypeWord Press on Movable Type
Word Press on Movable Type
 
MTCafe Gunma 2013へのお誘い
MTCafe Gunma 2013へのお誘いMTCafe Gunma 2013へのお誘い
MTCafe Gunma 2013へのお誘い
 

JavaScriptテンプレートエンジンで活かすData API