a-blog cms Training Camp 2023を開催しました!

11月17日(金)に、a-blog cms Training Camp 2023 を開催しました。
今回は実に4年ぶりの開催!!世間ではその4年の間にオンラインイベントも増えてきたことから、リアルとライブ配信のハイブリッドイベントとして復活いたしました。



a-blog cms Training Camp とは?
a-blog cms Training Camp は、通称「合宿」とも呼ばれているイベントで、コロナ禍前までは、まさに合宿のように2日間連続で開催していました。全国からa-blog cms のユーザーさんが集まり、a-blog cmsに関するセッションに参加したり意見交換を行うなど、 a-blog cms の最大規模の勉強会・交流会としての役割を担っています。

概要

日程

2023年11月17日(金) 13:30 - (懇親会 : 19:00 - )

会場

イベント会場
名古屋コンファレンスホール(名駅)
愛知県名古屋市中村区名駅3-18-5 モンマートビル4F
※ ベースキャンプ名古屋の1階下のフロアです

懇親会会場
楽楽 名駅店
愛知県名古屋市中村区名駅3-5-7 1F

動画URL

https://www.youtube.com/watch?v=W0p8wwSyv5Y

セッション一覧

  • 新バージョン Ver. 3.1 の目玉機能を紹介! 有限会社アップルップル 伊藤 淳
  • 最近の CMS 業界の動向 株式会社ミツエーリンクス 藤田 拓さん
  • cronで定期的に動作するa-blog cms 有限会社アップルップル 永富 敬千
  • a-blog cms での実装フローを紹介 有限会社アップルップル 菅原 彩
  • How to Learn a-blog cms ー 学びの散歩道 ー 有限会社アップルップル 笠谷 亜貴子
  • アクセシビリティに対応した a-blog cms テンプレート 株式会社スワールコミュニケーションズ 三枝 由希さん・馬場 杏奈さん
  • この要件、標準機能で実装できます! Suzulabo 太田 小夏さん
  • ECテーマをつかって一覧からカートに追加するボタンを実装してみよう! 有限会社アップルップル 宇井 陸登

新バージョン Ver. 3.1 の目玉機能を紹介!
有限会社アップルップル 伊藤 淳

Ver. 3.1 の新機能についてここだけは押さえておきたいポイントや、新しいバージョンでのサイトの作り方などについて紹介いたしました。



最近の CMS 業界の動向
株式会社ミツエーリンクス 藤田 拓さん


最近のCMSのシェア率から注目のCMSをピックアップしてお話しいただきました。「顧客に求められるCMSとは?」「これからのa-blog cms の方向性は?」などの問いかけや、a-blog cms への要望などをお話しいただきました。




cronで定期的に動作するa-blog cms
有限会社アップルップル 永富 敬千


バックアップ処理やメンテナンスなど、定期的にプログラムを実行する際に利用する「cron」。監査ログでの活用方法に焦点を当ててお話しいたしました。
質疑応答では、https://www.ablogcms.io/をリニューアルした経験から得たcronの使いどころも話に上がりました。



a-blog cms での実装フローを紹介
有限会社アップルップル 菅原 彩


受託案件の実装フローを順序立ててお話しさせていただきました。工程の後戻りや手が止まってしまう…ということを回避するための考え方や、段階ごとに押さえておきたいポイントを解説いたしました。



How to Learn a-blog cms ー 学びの散歩道 ー
有限会社アップルップル 笠谷 亜貴子


初心者の方向けに、ご自身のラーニングカーブやおすすめの学習方法をご紹介。a-blog cms で制作することで得られるCMS以外のスキルアップなどについてもお話しいたしました。



アクセシビリティに対応した a-blog cms テンプレート
株式会社スワールコミュニケーションズ 三枝 由希さん・馬場 杏奈さん


「ウェブアクセシビリティとは何なのか?」基礎知識からサイト制作で気をつけるポイント、さらにはa-blog cms を使ったアクセシビリティに準拠したテンプレートをご紹介いただきました。



この要件、標準機能で実装できます!
Suzulabo 太田 小夏さん


ポストインクルードやエスケープを使うことで、様々な要件を標準機能でクリアできるというお話でした。a-blog cms に関する情報収集方法もおまけでご紹介いただきました。



ECテーマをつかって一覧からカートに追加するボタンを実装してみよう!
有限会社アップルップル 宇井 陸登


公式テーマsquare@ecを使って、商品一覧ページに「カートへ追加する」ボタンを追加する方法と、商品ごとに表示したい項目を設定する方法を解説いたしました。



最後に


登壇者の皆様、会場参加の皆様、オンラインでご参加の皆様、ご協力いただいた皆様、誠にありがとうございました。また皆様にお会いできるのを楽しみにしております。


a-blog cmsの内部構造について

目次

  1. テンプレートを使ったカスタマイズの前に
  2. ファイルの種類について
  3. テンプレートの内部構造について①
  4. テンプレートの内部構造について②

テンプレートを使ったカスタマイズの前に


ここからは、実際にテンプレートを開いてa-blog cmsの内部構造について見ていきます。まずは事前準備として、このハンズオンの解説使用テーマ「beginner」のディレクトリに移動しましょう。


a-blog cmsをインストールしている場合


a-blog cmsをインストールしたディレクトリから、themes/beginner まで移動してください。


a-blog cms.ioで体験している場合


a-blog cms.ioから送られたメールアドレスにSFTP情報が記載されています。


SFTP情報

FPTソフトを使ってSFTP接続し、themes/beginner まで移動してください。


ファイルの種類について


a-blog cmsのテーマファイルの構成として、_top.html などの基本のテンプレートファイルはテーマディレクトリ内直下に置かれています。その他CSS・JS・imagesなどのデータはフォルダで管理されています。



それでは主要なフォルダについて確認していきましょう。


admin
管理ページのテンプレートが入っているフォルダです。エントリーの編集ページやカテゴリーの編集ページにオリジナルの入力項目を設置する際に作業する場所です。

include
a-blog cms デフォルトテーマは、機能/パーツごとにHTMLファイルを分割し、_top.html や index.html、_entry.html に必要なパーツをインクルード(読み込んで)することでテンプレート管理をしています。includeフォルダはそのパーツを管理するフォルダです。詳しくは後述「インクルード」にて解説しています。

contact
お問い合わせフォームを管理するフォルダです。このようなフォームを管理するフォルダは、フォームを設置した分だけ準備する必要があります。beginnerでは、お問い合わせフォームのページをカテゴリーとしているため、カテゴリーコードである「contact」をフォルダ名としています。

テーマ「beginner」では、「お知らせ」や「物件情報」のカテゴリーコード名と一致する「news」「realestate」といったフォルダが用意されています。a-blog cmsは、基本的にテーマ直下にある _top.html や index.html 、_entry.html を共通のテンプレートとして表示しますが、このようにカテゴリーコード名のフォルダを作成しその中に index.html や _entry.html を設置することで、カテゴリーごとにデザインをかえることができます。



共通して使われているindex.html

共通して使われているindex.html


newsカテゴリーで使われているindex.html

newsカテゴリーで使われているindex.html


テンプレートの内部構造について①


ここからは、テンプレート _top.html を開いてa-blog cmsの記述のルールを見ていきます。


解説使用テンプレート_top.html

インクルード


_top.html のheadタグは以下のように書かれています。ここで使われているのが「インクルード機能」です。


<head>
	<meta charset="UTF-8">
	@include("/include/head/meta.html")
	@include("/include/head/link.html")
	<link href="/js/slick/slick.css" rel="stylesheet">
	@include("/include/head/js.html")
	<script src="/js/slick/slick.js" charset="UTF-8"></script>
	<script src="/js/top.js" charset="UTF-8"></script>
</head>

インクルード
テンプレート内に外部ファイルを読み込む機能を「インクルード」といいます。複数のテンプレートに共通するパーツを1つのファイルから呼び出すことで、内容を編集した際に関係している全てのテンプレートへ一括して反映できるため、メンテナンス性を向上させることができます。

例えばheadの例では、meta情報について以下のようにインクルードされています。


@include("/include/head/meta.html")

この記載されているパスにしたがって /beginner/include/head/meta.html のファイルを開くと、ここで読み込まれているHTMLコードを確認することができます。


テーマ「beginner」ではheadタグ内で主にリンク情報などをインクルードし、body タグ内でヘッダーなどのパーツやモジュールをインクルードしています。このようにインクルード部分が多岐にわたる場合は、人の目で見ても分かりやすく管理するために、それぞれの役割についてコメント表記をしています。


<!-- エントリーヘッドライン(トップ用) -->
@include("/include/entry/headline-top.html")

スタイルガイド(CSSフレームワーク)


a-blog cmsでは、専用のスタイルガイド(CSSフレームワーク)を用意しています。このフレームワークを活用することで、クラス名の表記のみでデザインやレイアウトを素早く整え、サイト制作を効率化することができます。ここで使用するクラス名は、接頭辞にacms-がつく場合とacms-admin-がつく場合の2種類があります。


クラスの接頭辞読み込むCSSファイル主な使用場所
acms-acms.css公式テーマ
acms-admin-acms-admin.css公式テーマ・管理画面

a-blog cmsはVer.2.5より、管理画面で使うCSSファイル「acms-admin.css」と、CSSフレームワークとして使うCSSファイル「acms.css」を分けて管理し始めました。これによりCMSのアップデートと同時にバージョンが上がるファイルが acms-admin.css のみになるため、アップデートによるスタイル崩れの心配がなくなります。


スタイルガイドの使用例として _top.html の22〜33行目を見ていきましょう。


<main class="acms-col-lg-9 main">
    <div class="main-inner is-space-right">
        <!-- エントリーヘッドライン(トップ用) -->
        @include("/include/entry/headline-top.html")

        <!-- エントリーサマリー -->
        @include("/include/entry/summary-top.html")

        <!-- 確認用テンプレート -->
        @include("/include/check-seo.html")
    </div>
</main>

mainタグ内のacms-col-lg-9は、デスクトップ画面で12カラム中9カラムの幅を使ってコンテンツを表示させるフレームワークです。a-blog cmsでは一般的に、サイトの表側のスタイルに関わるテンプレートでスタイルガイドを利用するときはacms-の接頭辞で記述します。このようにすることで、管理画面以外で acms-admin.css を読み込む必要がなくなり、サイトを軽量化することができます。


これらのCSSフレームワークの種類については、管理画面コンフィグ内の「スタイルガイド(CSSフレームワーク)」内、もしくはリファレンス | ドキュメント | a-blog cms developerにて確認できます。レスポンシブデザインにも対応し、種類も豊富に取り揃えているので、サイトを制作する際には是非ご活用ください。



組み込みJS


_top.html の36〜54行目を見ると、接頭辞がjs-から始まるクラスが確認できます。ここでは、a-blog cmsが用意する組み込みJSという機能を使用しています。


組み込みJS
HTMLにクラス属性を設定するだけで作動するJavaScriptライブラリを「組み込みJS」といいます。一般的に、スライダーやオフキャンバスを実装する際はJavaScriptの知識が必要ですが、a-blog cmsでは、組み込みJSを活用することでJavaScriptの知識がなくともサイト内に様々な効果を加えることができます。

<div class="js-pretty-scroll">
	<!-- 検索フォーム -->
	@include("/include/parts/search.html")

	<!-- ピックアップリスト -->
	@include("/include/entry/summary-pickup.html")

	<!-- バナー -->
	@include("/include/siteparts/banner.html")

	<!-- リンクリスト -->
	@include("/include/siteparts/link-list.html")

	<!-- モバイル:ナビゲーションメニュー -->
	@include("/include/parts/mobile-nav.html")

	<!-- ログインボタン -->
	@include("/include/parts/login-button.html")
</div>

上記のソースでは、組み込みJSを使ってオフキャンバスを実装しています。オフャンバスとは、スマートフォンなどで画面全体を右もしくは左にスクロールさせ、画面外に隠れていたメニューを表示させる機能です。



オフキャンバスが適応されるエリアにjs-offcanvasのクラスを、オフキャンバスを閉じるボタンにjs-offcanvas-closeのクラスを振ることで、JavaScriptを書かずとも該当エリアをオフキャンバスメニューに収めています。


またテーマ「beginner2020」ではナビゲーション部分にも、「link match location」という組み込みJSを使用しています。モジュールの表示設定内にある「属性」の項目を見てみましょう。



ここでは、ホームのラベルに js-link_match_location-full というクラスが、その他のラベルに js-link_match_location というクラスが振られています。これらは、表示しているページのURLごとにナビゲーションのスタイルを区別する組み込みJSです。試しに「ホーム」にアクセスすると、ナビゲーションの項目に赤いボーダーがつくようになっています。


ナビゲーション

js-link_match_location-full は現在表示しているページのURLとリンク先が“完全に”同じ場合に、js-link_match_location は現在表示しているページのURLがアンカーリンクのリンク先URL中に含まれている場合に作動するようになっています。組み込みJS「link match location」のその他の種類については、リファレンス | ドキュメント | a-blog cms developerをご覧ください。


ここでご紹介した組み込みJSはほんの一例ですが、この他にもページ内の任意の場所へスクロールさせるものや、リンクのクリックエリアを拡大させるものなど様々なライブラリを取り揃えています。HTMLの作業だけで手軽にJavaScriptの効果を取り入れることができるので、是非色々なものを試してみてください。


テンプレートの内部構造について②


ここからは、テンプレート summary-top.html を元にa-blog cmsの記述のルールを見ていきます。まずは _top.html でインクルードされているエントリーサマリーのパスに従って、summary-top.html を開いてください。


<!-- エントリーサマリー -->
@include("/include/entry/summary-top.html")

a-blog cmsのシステムと変数


summary-top.html の1行目と最終行には、下のようなコメントがあります。


<!-- BEGIN_MODULE Entry_Summary id="top_summary" -->

<!-- END_MODULE Entry_Summary -->

これらはモジュールの範囲を定める記述です。このようにa-blog cmsは、ブロックで <!-- BEGIN(システム名) --> から <!-- END(システム名) --> と定められた範囲ごとにシステムが作動する仕組みになっています。


さらにテンプレートの14〜29行目には下の記述があります。


<li class="summary-default-item js-autoheight-r {entry:loop.class}">
<a href="{url}" class="summary-default-link">
	<div class="acms-summary">
		(中略)
		<div class="acms-summary-body">
			<p class="summary-title">{title}</p>
			<p class="summary-detail">{summary}[trim(500, '...')]</p>
		</div>
	</div>
</a>
</li>

ここではブラウザ上で登録されたデータを示す部分として、15行目の {url} や 24行目の {title} などの変数が使われています。システムはこれらの変数を認識して、表示するエントリーごとに {url} でURLを、{title} でエントリータイトルを自動で読み込み、画面に出力しています。


<!-- 出力ソース -->
<li class="summary-default-item js-autoheight-r ">
	<a href="http://********.ablogcms.io/realestate/entry-7.html" class="summary-default-link">
		<div class="acms-summary">
			<div class="summary-default-image-wrap acms-summary-image">
				
				(中略)
				
			</div>
			<div class="acms-summary-body">
				<p class="summary-title">物件情報1</p>
				<p class="summary-detail"></p>
			</div>
		</div>
	</a>
</li>

a-blog cmsが用意している変数は膨大な数があります。これらを確認・利用するにあたっては、「変数表」を活用しましょう。変数表を確認するにはクイックサーチでの閲覧が便利です。チュートリアルで使用しているページにログインしている状態で、Macなら ⌘ + K 、Windowsなら control + K でクイックサーチを開きます。「:」と入力し、エントリーサマリーを選択すると、ここで使われているエントリーサマリーの変数表が確認できます。または、a-blog cms のデベロッパーサイトにある「ビルトインモジュール」のページでも確認できます。


クイックサーチ

エントリーサマリーの変数表

変数表では、それぞれのシステムの中で利用できる変数が一覧でまとめられています。特にモジュールの構造は様々なシステムが入れ子で組み込まれ、少々複雑なため、不慣れなうちはテンプレートと変数表を照らし合わせて全体像を確認することもできます。


校正オプション


summary-top.html テンプレートの25行目には、エントリー本文の要約を表す下のような変数が記述されています。


<p class="summary-detail">{summary}[trim(500, '...')]</p>

<!-- 出力ソース -->
<p class="summary-detail">
 この製品についての説明文です。この製品についての説明文です。この製品についての説明文です。この製...
</p>

この変数 {summary} に付随している [trim(500, '...')] が校正オプションです。


校正オプション
変数によって読み込まれた情報を適切な形に処理して出力する機能を校正オプションといいます。変数に付随した[ ]内に表記され、これを利用することで、誕生日のデータを元に年齢を算出したり、登録された画像をリサイズして表示することができます。

この例では、{summary}[trim(500, '...')]と表記することによって文字幅を500で足切りし、さらに足切りした後の表記として、'...' を指定しています。


基本的に {変数} は自動でエスケープ処理が行われるようになっております。もし、HTMLのタグを有効にしたい時には [raw] を利用してください。


また校正オプションが何も指定されない場合には、「<」「>」「 "」といった文字を実体参照に変換する [escape] がデフォルトで指定されます。この [escape] は、その他に何か一つでもオプションを指定すると適応から外れるため、その場合には指定したいオプションと合わせて表記しなければなりません。オプションを複数指定する際は、下の例のようにパイプ ( | ) を使用します。


<p class="var">{var}[raw|nl2br]</p>

特にフォームで入力されたデータを取り扱う際には、校正オプション [escape|nl2br] を利用することでクロスサイトスクリプティングを防止することができ、安全性の向上につながります。


その他の校正オプションの種類について、詳しくは校正オプション | リファレンス | ドキュメント | a-blog cms developerをご覧ください。

トップページ内に新しいモジュールを追加する

目標


エントリーリストモジュールを使って、トップページに「物件情報」のコンテンツを追加しましょう。


解説使用テーマbeginner

Before

After

目次

  1. モジュールIDを新規作成する
  2. テンプレートを用意して_top.htmlにインクルードする
  3. 見出しを表示する

モジュールIDを新規作成する


まずはブラウザ上でモジュールIDを新規作成しましょう。以下の手順でIDの新規作成画面に移動してください。


  1. 管理ボックスの [管理ページ] をクリックする
  2. 左側のメニュー内 [モジュールID] をクリックする
  3. 一覧画面右上の [モジュールIDを作成] をクリックする


[条件設定] 内のID情報の項目を、以下のように設定します。


ステータス有効
モジュールエントリーリスト( Entry_List )
idtop_list
名前トップページ用のリストモジュール

モジュールID名や名前については、モジュールごとに自由に設定することができます。今回のハンズオンでは一例として「top_list」「トップページ用のリストモジュール」と定めていますが、命名に関しては特にルールがないため、サイト制作者にとって管理しやすい名前を設定しましょう。


さらに今回は「物件情報」のコンテンツを追加するため、カテゴリーID(cid)の「ID参照」ボタンをクリッックし、引数としてカテゴリーID欄で「物件情報」を選択します。



カテゴリーID物件情報(cid:5)

入力後は [作成] ボタンをクリックして、モジュールIDの設定を保存しましょう。


テンプレートを用意して_top.htmlにインクルードする


今回のハンズオンでは、すでに表示されている「新着情報」コンテンツの下部に新しいモジュールを表示します。従って「_top.html」では、24行目<main>タグ内のエントリーヘッドライン(トップ用)以下にエントリーリストを新規追加します。


<main class="acms-col-lg-9 main">
  <!-- エントリーヘッドライン(トップ用) -->
  @include("/include/entry/headline-top.html")

  <!-- ここにエントリーリストを新規追加する -->

  <!-- エントリーサマリー -->
  @include("/include/entry/summary-top.html")

  <!-- 確認用テンプレート -->
  @include("/include/check-seo.html")
</main>

それでは、インクルードするテンプレートを用意しましょう。まず以下の場所に list-top.html を新規作成します。


/使用テーマ/include/entry/list-top.html


この list_top.html 内に、エントリーリストモジュールのデータを入力します。a-blog cmsでは、モジュールごとのコード情報が「スニペット」という形で配布されています。スニペットはクイックサーチで「;」と入力し、「エントリーリスト」を選択することで表示できます。


クイックサーチ

スニペット

このスニペットをコピーして、 list-top.html ファイルにペーストしましょう。


<!-- BEGIN_MODULE Entry_List -->
<div class="acms-margin-bottom-medium">
@include("/admin/module/setting.html")
	<ul class="acms-list-group">
		<!-- BEGIN entry:loop -->
		<li><a href="{url}" class="acms-list-group-item">{title}</a></li>
		<!-- END entry:loop -->
	</ul>
</div>
<!-- END_MODULE Entry_List -->

次に、設置したモジュールに対して、先ほど作成したモジュールIDを紐付けます。テンプレート内でのモジュールIDの表記は、下のように 1行目の <!-- BEGIN(システム名) --> のブロック内へ「id="(モジュールID)"」と追記して行います。


<!-- BEGIN_MODULE Entry_List id="top_list" -->

これでモジュールのテンプレートが用意できました。続けて _top.html の該当箇所にこのテンプレートをインクルードしましょう。


<main class="acms-col-lg-9 main">
  <!-- エントリーヘッドライン(トップ用) -->
  @include("/include/entry/headline-top.html")
 
  <!-- エントリーリスト -->
  @include("/include/entry/list-top.html")
 
  <!-- エントリーサマリー -->
  @include("/include/entry/summary-top.html")

  <!-- 確認用テンプレート -->
  @include("/include/check-seo.html")
</main>

以上でモジュールの設置が完了しました。



見出しを表示する


仕上げとして、新しいコンテンツに「物件情報」の見出しを設定しましょう。テーマ「beginner」では、モジュールIDの [カスタム設定] にて見出しを入力することができます。



見出し物件情報

しかしこの設定を保存しても、サイト上に見出しは表示されません。これは、現在読み込まれているエントリーリストがa-blog cmsで共通して使われるスニペットをそのままコピーしたものになるため、テーマ「beginner」でカスタムされた設定に対応していないことが原因です。


このテーマの中で見出しがどのような変数を使って表示されているか確認するには、トップページで配置されている他のモジュールのテンプレートを参考にします。今回のハンズオンでは、新着情報を表示している headline-top.html を開いてみましょう。


/include/entry/headline-top.html


@include("/admin/module/setting.html")
<div class="module-header clearfix"><!-- BEGIN moduleField --><!-- BEGIN module_heading:veil -->
	<h2 class="module-heading">{module_heading}</h2><!-- END module_heading:veil --><!-- END moduleField -->
	<a href="{indexUrl}" class="module-index-link"><span class="acms-icon acms-icon-arrow-right"></span>一覧</a>
</div>

3〜7行目を見ると、見出しに関わるコードが記載されています。ここでは、変数 {module_heading} によって、カスタム設定画面で入力された見出しの値が読み込まれているようです。変数はテーマ内で共通して使うことができるため、この見出しに関わるコードは list-top.html でも同じように設定することができます。


コードを確認したところで、list-top.html にこのコードをコピー&ペーストして、見出しを設置しましょう。尚、ペーストする場所は、summary-top.html に習って設定に関わるインクルード文 @include("/admin/module/setting.html") の下部とします。


<!-- BEGIN_MODULE Entry_List id="top_list" -->
@include("/admin/module/setting.html")
<div class="module-header clearfix"><!-- BEGIN moduleField --><!-- BEGIN module_heading:veil -->
	<h2 class="module-heading">{module_heading}</h2><!-- END module_heading:veil --><!-- END moduleField -->
	<a href="{indexUrl}" class="module-index-link"><span class="acms-icon acms-icon-arrow-right"></span>一覧</a>
</div>

変数 {module_heading} は <!-- BEGIN_MODULE Entry_List id="top_list" --> 以下に設置されることで、モジュールID top_list の設定画面に入力された値を読み込みます。したがって、ここでは先ほど入力した見出し「物件情報」が読み込まれ、トップページで下図のように表示されます。


エントリーリスト見出し