a-blog cmsのカスタムユニットとしてMapboxを使用する方法(IE11対応)
Mapboxとは
Mapboxは世界中で採用されている地図サービスです。近年、日本でも徐々に利用されるようになってきています。今回は、Mapboxをユニットとして使用できるようにするまでの手順を紹介します。作業をすすめることで以下のような地図をa-blog cmsのユニットとして作成できるようになります。-
事前準備
a-blog cmsのカスタムユニットとしてMapboxを使用するためにMapbox側で準備するものが2つあります。
- 1. アクセストークン: MapboxのWebページ(https://www.mapbox.jp/)でアカウントの作成を行うことで簡単に入手できます。
- 2. スタイルURL:MapboxStudio(https://studio.mapbox.com/)というツールを使い、地図の見た目を決める「スタイル」を作成してください。スタイルの作成後にスタイルURLを入手することができます。
ブログのカスタムフィールドを作る
/themes/利用中のテーマ/admin/blog/field.html に以下のコードを追加します。
<h3 class="acms-admin-admin-title2">Mapboxアクセストークン登録</h3>
<table class="adminTable acms-admin-table-admin-edit">
<tr>
<th><label for="input-text-mapbox_accesstoken">アクセストークン</label><i data-acms-tooltip="アクセストークンを設定します。" class="acms-admin-icon-tooltip js-acms-tooltip-hover"></i></th>
<td>
<input type="text" name="mapbox_accesstoken" value="{mapbox_accesstoken}" id="input-text-mapbox_accesstoken" class="acms-admin-form-width-large" />
<input type="hidden" name="field[]" value="mapbox_accesstoken" />
</td>
</tr>
<tr>
<th><label for="input-text-mapbox_styleurl">スタイルURL</label><i data-acms-tooltip="スタイルURLを設定します。" class="acms-admin-icon-tooltip js-acms-tooltip-hover"></i></th>
<td>
<input type="text" name="mapbox_styleurl" value="{mapbox_styleurl}" id="input-text-mapbox_styleurl" class="acms-admin-form-width-large" />
<input type="hidden" name="field[]" value="mapbox_styleurl" />
</td>
</tr>
</table>これにより、管理ページ > ブログ > カスタム設定 にMapboxをa-blog cms内で利用する際に必要となるアクセストークンの入力欄、表示する地図のスタイルを決定するスタイルURLの入力欄が追加されます。
追加された入力欄に事前準備で入手したアクセストークンとスタイルURLを入力し、保存してください。
管理側フォームの実装
ユニット追加ボタン
管理ページ > カスタマイズ管理 > コンフィグ > エントリー編集画面 > 編集設定 > ユニット追加ボタン に「custom_mapbox」というモードを設定します。 ラベル部分は「Mapbox」とすることで(Mapbox)ボタンが追加されることになります。
ユニット設定
管理ページ > カスタマイズ管理 > コンフィグ > エントリー編集画面 > ユニット設定 の画面の最後に何も設定していない空の「Mapbox」ユニットが用意されていますので、(Mapbox)のボタンを一度クリックして Mapbox ユニットを追加し、保存します。
これにより、エントリー作成・変更画面にてMapboxユニットを追加するためのボタンが追加されます。
管理側フォームhtml
エントリー作成・変更画面のMapboxユニットをクリックした際に表示されるhtmlを設定します。
/themes/*テーマ名*/admin/entry/unit/extend.html に以下のコードを貼り付けます。
<!-- BEGIN_SetRendered id="js-mapboxunit" -->
<!-- Maboxライブラリ読み込み -->
<script src='https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js'></script>
<link href='https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.css' rel='stylesheet' />
<!--Mapbox Geocoderの読み込み 検索フォームに入力した場所の位置を取得 -->
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.min.js"></script>
<link rel="stylesheet"
href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.css" type="text/css" />
<!-- 自作ライブラリ読み込み -->
<script src="/js/mapboxunit.js"></script>
<!-- END_SetRendered -->
<!-- BEGIN custom_mapbox -->
<!-- BEGIN_MODULE Blog_Field -->
<div id="accesstoken_styleurl" data-accesstoken="{mapbox_accesstoken}" data-styleurl="{mapbox_styleurl}"></div>
<!-- END_MODULE Blog_Field -->
<!-- jsからunitidを取得するためのdivタグ -->
<div class="unitid" data-unitid="{id}"></div>
<!-- 地図が挿入される -->
<div id='mapwrapper{id}' style="width: 820px; height: 320px; max-width: 100% ;">
<div id='map{id}' style='max-width: 100%;' data-lat="{mapbox-lat}" data-lng="{mapbox-lng}"
data-zoom="{mapbox-zoom}" data-pitch="{mapbox-pitch}" data-bearing="{mapbox-bearing}" data-setstyleurl="{mapbox_setstyleurl}" data-accesstoken="{mapbox_accesstoken}"
data-comment='{mapbox-comment}' data-mapsize="{mapbox-mapsize}" data-maptype="admin">
</div>
<div id="geocoder{id}" class="geocoder"></div>
</div>
<div id="geocoderspace" style="width: 100%; height: 50px;" ></div>
<table class="acms-admin-table-admin-edit">
<tr>
<th>緯度</th>
<td>
<input id="lat{id}" type="text" name="mapbox-lat{id}" value="{mapbox-lat}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-lat{id}" />
</td>
</tr>
<tr>
<tr>
<th>経度</th>
<td>
<input id="lng{id}" type="text" name="mapbox-lng{id}" value="{mapbox-lng}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-lng{id}" />
</td>
</tr>
<th>ズーム</th>
<td>
<input id="zoom{id}" type="text" name="mapbox-zoom{id}" value="{mapbox-zoom}"
class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-zoom{id}" />
</td>
</tr>
<tr>
<tr>
<th>角度</th>
<td>
<input id="pitch{id}" type="text" name="mapbox-pitch{id}" value="{mapbox-pitch}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-pitch{id}" />
</td>
</tr>
<tr>
<th>回転</th>
<td>
<input id="bearing{id}" type="text" name="mapbox-bearing{id}" value="{mapbox-bearing}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-bearing{id}" />
</td>
</tr>
<th>地図の大きさ</th>
<td>
<select id='size{id}' name="mapbox-mapsize{id}" class="acms-admin-form-width-full">
<!-- <option value=""></option> -->
<option id='small' value="small" {mapbox-mapsize:selected#small}>中:幅1/2(400x300)</option>
<option id='big' value="big" {mapbox-mapsize:selected#big}>大:幅1/1(820x320)</option>
</select>
<input type="hidden" name="unit{id}[]" value="mapbox-mapsize{id}" />
</td>
</tr>
<tr>
<th>吹き出し(HTML)可</th>
<td>
<textarea id='comment{id}' name="mapbox-comment{id}"
class="acms-admin-form-width-full">{mapbox-comment}</textarea>
<input type="hidden" name="unit{id}[]" value="mapbox-comment{id}" />
</td>
</tr>
<tr>
<!-- <th>MapboxユニットID</th> -->
<td>
<input type="hidden" name="mapbox-unitid{id}" value="{id}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox-unitid{id}" />
</td>
</tr>
<tr>
<th>スタイルURL</th>
<td>
<input id='setstyleurl{id}' type="text" name="mapbox_setstyleurl{id}" value="{mapbox_setstyleurl}" class="acms-admin-form-width-full" />
<input type="hidden" name="unit{id}[]" value="mapbox_setstyleurl{id}" />
</td>
</tr>
</table>
<!-- END custom_mapbox -->Mapboxユニット表示用のJavascriptを設置
js.htmlの編集
/themes/利用中のテーマ/include/head/js.html に以下のコードを追加します。
<!-- GET_Rendered id="js-mapboxunit" -->
admin.htmlの編集
/themes/利用中のテーマ/admin.html に以下のコードを追加します。
<!-- カスタムJSを記述 --> <script src="/js/edit.js" charset="UTF-8"></script> <!-- 以下の一文を追加--> <!-- GET_Rendered id="js-mapboxunit" -->
Javascriptの追加
/themes/利用中のテーマ/js/ にmapboxunit.jsを作成し、
以下のリンクのコードを貼り付けてください。
これでエントリー作成・変更画面にてMapboxユニットが使えるようになります。
表示側のテンプレート実装
/include/unit/extend.htmlに以下のコードを貼り付けることによりMapboxユニットのフォームに入力した内容に応じて地図が表示されます。
<!-- BEGIN_SetRendered id="js-mapboxunit" -->
<!-- Maboxライブラリ読み込み -->
<script src='https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js'></script>
<link href='https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.css' rel='stylesheet' />
<!--Mapbox Geocoderの読み込み 検索フォームに入力した場所の位置を取得 -->
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.min.js"></script>
<link rel="stylesheet"
href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v4.5.1/mapbox-gl-geocoder.css" type="text/css" />
<!-- 自作ライブラリ読み込み -->
<script src="/js/mapboxunit.js"></script>
<!-- END_SetRendered -->
<!-- BEGIN unit#custom_mapbox -->
<!-- BEGIN_MODULE Blog_Field -->
<!-- 地図作成のためのアクセストークンとスタイルURL -->
<div id="accesstoken_styleurl" data-accesstoken="{mapbox_accesstoken}" data-styleurl="{mapbox_styleurl}"></div>
<!-- END_MODULE Blog_Field -->
<!-- ここに地図が表示される -->
<!-- BEGIN unit#custom_mapbox:loop -->
<div class="unitid" data-unitid="{mapbox-unitid}"></div>
<div id='mapwrapper{mapbox-unitid}' style="width: 400px; height: 300px; max-width: 100% ;">
<div id='map{mapbox-unitid}' style='width: 100%; height: 80%; max-width: 100%;' data-lat="{mapbox-lat}"
data-lng="{mapbox-lng}" data-pitch="{mapbox-pitch}" data-bearing="{mapbox-bearing}" data-zoom="{mapbox-zoom}"
data-setstyleurl="{mapbox_setstyleurl}" data-comment='{mapbox-comment}'
data-mapsize="{mapbox-mapsize}" data-maptype="show">
</div>
</div>
<!-- END unit#custom_mapbox:loop -->
<!-- END unit#custom_mapbox -->Mapboxを安全に使用する方法
本実装ではMapboxのアクセストークンが開発者ツールを通じて見られるようになっています。本番環境での使用の際には以下のリンクの内容に従い、URL制限の有効化を行ってください。URL制限を追加したトークンは指定URLから発信されたリクエストのみ処理をするため、Webアプリのアクセス・トークンをよりセキュアにする事が可能です。
https://docs.mapbox.com/jp/help/troubleshooting/how-to-use-mapbox-securely/