SlideShare a Scribd company logo
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

PDF
Data APIの背景と活用方法 MTCafe Nagoya Ver.
PPTX
Clash of Oni Online - VR Multiplay Sword Action
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
PPTX
RuntimeUnitTestToolkit for Unity
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PPTX
JavaScriptテンプレートエンジンで活かすData API
PDF
Movable Type 6の新機能 Data APIの活用法
Data APIの背景と活用方法 MTCafe Nagoya Ver.
Clash of Oni Online - VR Multiplay Sword Action
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
RuntimeUnitTestToolkit for Unity
NextGen Server/Client Architecture - gRPC + Unity + C#
JavaScriptテンプレートエンジンで活かすData API
Movable Type 6の新機能 Data APIの活用法

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

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

More from Hajime Fujimoto (20)

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

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