More Related Content
Similar to JavaScriptテンプレートエンジンで活かすData API (20)
More from Hajime Fujimoto (20)
JavaScriptテンプレートエンジンで活かすData API
- 2. アジェンダ
• 自己紹介
• JavaScriptテンプレートエンジンでData APIを活かす
• Handlebarsでの例
• Angular.jsでの例
• まとめ
2
- 9. Data APIの概要
• 管理画面を使わずにMovable Typeのデータを操作する仕組み
• アクセスするアドレスとメソッドに応じて操作(REST)
• データの取得/作成/更新/削除が可能
• データはJSON形式で受け渡し
• 各種のプログラム言語でアクセス可能
• JavaScriptライブラリあり
9
- 10. Data APIにアクセスする例
• IDが1番のウェブサイトから記事を読み込む
http://your-host/path-to-mt/mt-data-api.cgi/v1/sites/1/entries
10
- 11. Data APIでできること
• Web製作では…
• ページ分割
• 検索
• 独自の管理画面
• Etc.
• Web製作以外では…
• スマートフォン/タブレット用アプリのバックエンド
• Etc.
11
- 12. Data APIの難点
• プログラミングが必要
• デザイナー(ノンプログラマー)の方には難しい
• 開発すべてをプログラマーに任せると…
• デザインが…
• HTMLを修正するたびにプログラマーに依頼…
12
- 17. HandleBarsの基本
17
テンプレートJavaScript
<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);
- 18. HandleBarsの基本
18
テンプレート結果
<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>
- 20. 記事一覧出力部分
20
<ul>
{{#mt:Entries}}
<li>
<h2>
<a href="{{mt:EntryPermalink}}">{{mt:EntryTitle}}</a>
</h2>
<p>{{mt:EntryExcerpt}}</p>
</li>
{{/mt:Entries}}
</ul>
- 21. ページ移動リンク出力部分
21
<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>
- 22. 記事の読み込みとデータの加工
22
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
});
}
- 23. ページ移動リンク出力用データの作成
23
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),
});
}
- 26. Angular.jsの基本
26
テンプレートJavaScript
<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',
];
}
);
- 27. Angular.jsの基本
27
テンプレート結果
<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>
- 29. 記事一覧出力部分
29
<ul>
<li ng-repeat="mt in mt.Entries">
<h2>
<a href="{{mt.EntryPermalink}}">{{mt.EntryTitle}}</a>
</h2>
<p>{{mt.EntryExcerpt}}</p>
</li>
</ul>
- 30. ページ移動リンク出力部分
30
<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>
- 31. 記事編集ページ出力部分
31
<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>
- 32. 記事一覧の読み込みとデータの加工
32
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
});
}
});
- 34. 記事の保存
34
var entry = {
title: $scope.mt.EntryTitle,
body: $scope.mt.EntryBody
};
DataAPI.updateEntry(<$mt:BlogID$>, $scope.entry_id,
entry, function(response) {
alert('記事を保存しました。');
});