【非推奨】マイページ機能を利用して、閲覧ページ上からユーザー情報を変更できるようにする

Ver. 3.1 より、a-blog cms にマイページ機能が追加されたためこの機能は非推奨になりました。マイページ機能を利用したい場合は、標準機能のモジュールをご利用ください。


Shopping Cart 拡張アプリを使用することでマイページ機能を実装することができます。通常では、ユーザーの情報(基本設定・カスタム設定)を変更するためには管理画面上で編集する必要がありますが、マイページ機能を利用することで閲覧ページ上からユーザーの情報(基本設定・カスタム設定)を変更することができるようになります。


このエントリーではマイページ機能を実装して、閲覧ページ上でユーザー情報を変更できるようにする方法を解説します。

Mypage モジュール

Shopping Cart 拡張アプリをインストールすることで Mypage モジュールという GET モジュールが利用できるようになります。

Mypage モジュールでは、ユーザーの情報(基本設定・カスタム設定)の表示、更新時にエラーを検知した場合や更新に成功した場合に表示するブロックを提供しています。

ユーザーの情報(基本設定・カスタム設定)の表示

Mypage モジュールを利用することで、ユーザーの情報(基本設定・カスタム設定)の表示ができます。例えば、以下のように記述することでユーザーの名前を表示できます。

<!-- BEGIN_MODULE Mypage -->
<input id="name" type="text" name="name" autocomplete="name" class="" value="{name}" placeholder="山田太郎"data-validator="name">
<input type="hidden" name="user[]" value="name">
<input type="hidden" name="name:v#required"> <!-- 必須項目 -->
<!-- BEGIN name:v#required -->
<p class="form-error-text">名前を入力してください</p>
<!-- END name:v#required -->
<!-- END_MODULE Mypage -->

更新時にエラーを検知した場合にエラーメッセージを表示する

ユーザーの情報(基本設定・カスタム設定)の更新時に、フォームのバリデーターに引っかかった場合などでエラーが発生してユーザー情報(基本設定・カスタム設定)の更新ができないことがあります。Mypage モジュールを利用することで、更新時のエラーを検知して、エラーメッセージを表示することができます。

Mypage モジュールでは、 msg#error ブロックを記述することで、エラー時に msg#error ブロックを表示することができます。

<!-- BEGIN msg#error -->
<p class="alert-message">マイページの更新に失敗しました</p>
<!-- END msg#error -->

ユーザー情報の更新に成功した場合に、更新成功メッセージを表示する

Mypage モジュールでは、ユーザーの情報(基本設定・カスタム設定)の更新に成功した場合に msg#update ブロックを表示します。

<!-- BEGIN msg#update -->
<p class="success-message">マイページの更新に成功しました</p>
<!-- END msg#update -->

MypageUpdate モジュール

Shopping Cart 拡張アプリをインストールすることで MypageUpdate モジュールという POST モジュールが利用できるようになります。

MypageUpdate モジュールは、ユーザーの情報(基本設定・カスタム設定)の更新を行うためのモジュールになります。使い方は、他の POSTモジュールと同様に送信したいフォームの submit ボタン要素の name 属性の値に ACMS_POST_Mypage_Update を指定します。

<form action="" method="post">
  <!-- フォーム部品を読み込むためのinclude文 -->
  @include("/login/basic.html")
  <div class="form-btn-wrap">
    <button type="submit" class="btn" name="ACMS_POST_MypageUpdate">マイページ情報を更新する</button>
  </div>
</form>

また、MypageUpdate モジュールの仕様として、基本設定には更新可能な項目と不可能な項目が存在します。カスタム設定はユーザーのカスタムフィールドになるので、すべての値が更新可能です。

MypageUpdate モジュールで更新できるユーザー情報(基本設定)


ユーザー情報 フィールド 概要
名前 name ユーザーの名前です。(日本語可)
ユーザーID code ユーザーがログイン時に入力するIDです。半角英数字で設定します。
アイコン画像 icon ユーザーのアイコン画像です。
メールアドレス mail ユーザーのメールアドレスです。
メールマガジン mail_magazine この値が有効だとメールマガジンを送信できます。
メールアドレス (携帯) mail_mobile ユーザーの携帯電話のEメールアドレスです。
メールマガジン(携帯) mail_mobile_magazine この値が有効だとメールマガジンを送信できます。
URL url ユーザーがwebサイトを持っている場合のURLです。
ロケール locale ユーザーのロケールです。
パスワード pass ユーザーのパスワードです。

MypageUpdate モジュールで更新できないユーザー情報(基本設定)


ユーザー情報 フィールド 概要
ステータス status ユーザーのステータスです。
有効期限 login_expire ユーザーの有効期限です。
ログイン端末の制限 user_login_terminal_restriction この値が有効だと許可された端末からしかログイン出来なくなります。
どこでもログイン login_anywhere この値が有効だとユーザーが所属するブログ以下のどのブログでもログインできるようになります。
インデキシング indexing この値が有効だとユーザー一覧に表示されます。
子ブログへの権限 global_auth この値が有効だとユーザーに子ブログへの権限を与えます。

MypageUpdate モジュールでユーザー情報を更新する場合の注意点

MypageUpdate モジュールでユーザー情報を更新する場合、基本設定の項目はフィールドが送信されなかった場合、空として保存されてしまいます。更新が不要な項目は以下のように hidden で設定しておくことで、ユーザー情報が空で保存されてしまうことを防ぐことができます。

<form action="" method="post" class="h-adr js-validator">
  <!-- マイページ更新時に空で保存されないようにする -->
  <input type="hidden" name="code" value="{code}">
  <input type="hidden" name="user[]" value="code">

  <input type="hidden" name="url" value="{url}">
  <input type="hidden" name="user[]" value="url">

  <input type="hidden" name="locale" value="{locale}">
  <input type="hidden" name="user[]" value="locale">
  
  <!-- 更新するフィールドは省略 -->
  <button type="submit" class="btn" name="ACMS_POST_MypageUpdate">
    <!--T-->保存する<!--/T-->
  </button>
</form>

カスタムフィールドのデータの場合、こちらのドキュメントで説明されている内容を実装することで、送信されなかった項目が空になることを回避することができます。

まとめ

マイページ機能を実装することで、閲覧画面上からユーザー自身でユーザーの情報(基本設定・カスタム設定)を変更することができるようになり、ユーザーの引っ越しなどで、お届け先の住所が変更した場合でも、ユーザー側で住所を自由に変更するといったことができるようになります。ECサイトにおいては便利な機能かと思いますので、ぜひご活用ください。

Shopping Cart 拡張アプリの設定

このエントリーでは、Shopping Cart 拡張アプリの設定について以下のことを説明します。

  • 税金について設定する
  • 適格請求書発行事業者について設定する
  • 決済方法について設定する
  • 配送について設定する
  • 追加手数料について設定する

税金について設定する

Shopping Cart 設定 > 基本設定 > 税金設定では、税金についての設定ができます。Shopping Cart 拡張アプリの税金設定では以下の項目の設定ができます。

  • 消費税区分(内税・外税)
  • 税計算方式(積み上げ・割り戻し)
  • 税計算端数処理(切り捨て・四捨五入・切り上げ)

消費税区分の設定は、注文内容の金額や convertToTax 校正オプションの計算などで利用されます。
消費税区分が外税の場合、エントリー(商品)のカスタムフィールド(item_price)で設定した販売価格は、消費税を含んでいないものとして扱われます。消費税区分を外税で使用する場合、商品価格の総額表示が義務付けられておりますので、商品価格を掲載する際は税込価格を表示する必要があることに注意してください。

税計算方式の設定は、注文内容の金額や convertToTotalPrice 校正オプションの計算などで利用されます。
割り戻し計算は商品の税別合計金額から消費税を計算する方式。積み上げ計算は商品毎に消費税を計算し合計する方式(令和5年9月30日以降使用不可)となっております。

税計算端数処理の設定は、注文内容の金額や、convertToIncludingTax 、convertToTotalPrice 、convertToTax 校正オプションの計算などで利用されます。

Shopping Cart 拡張アプリでは、税金設定に合わせて税込価格を計算するための GET モジュールと校正オプションを用意していますのでご活用ください。詳細はリファレンスを参照してください

適格請求書発行事業者について設定する

Shopping Cart 設定 > 基本設定 > 適格請求書発行事業者の設定では、以下の項目の設定ができます。

  • 登録番号
  • 氏名または名称

決済方法ついて設定する

Shopping Cart 設定 > 決済方法設定では、注文画面で表示する決済方法を設定します。

決済方法設定で重要な設定項目は、ブロックと手数料です。

基本的にはブロックは任意の文字列を設定することができますが、クレジットカード決済を設定する場合は creditcard ​という文字列を設定する必要があります。また手数料についても注文内容の金額の計算に使用されるため、正しい数値を設定する必要があります。手数料を空で設定した場合は決済手数料が0円ということになります。

利用条件設定

利用条件によって決済手数料を変動させたいといった場合には、決済方法の利用条件を設定することができます。

例えば、以下のように設定することで、注文の合計金額が0円 ~ 9999円の場合の決済手数料は 330 円、10000円 以上の場合の決済手数料は 440 円 とすることができます。



利用条件設定を有効にすることで、代引き手数料など、金額によって決済手数料が変動するような決済方法を販売者側の損になることなく導入することが可能になります。

配送について設定する

Shopping Cart 設定 > 配送設定では、配送についての設定をすることができます。

送料無料のしきい値(小計)

注文商品の小計金額(消費税を含む)が設定した値を超えている場合、送料を無料にする金額を数値で設定できます。

送料の適用方法

注文時に複数の商品を購入した場合の送料の適用方法を設定できます。

配送グループ

配送グループを設定します。配送グループには名前と全国一律の送料、送料の計算方法を設定できます。全国一律の送料は送料設定で送料が設定されていなかった場合に適用される送料になります。配送グループを追加すると、追加された名前と同名のタブが送料設定に追加され、送料設定で設定できるようになります。

送料設定

送料設定では、配送グループで設定したグループに対して、地域と送料を設定できます。配送地域ごとに送料を変更したい場合に設定する設定項目になります。

追加手数料について設定する

Shopping Cart 設定  > 追加手数料の項目では追加手数料についての設定をすることができます。例えば、ギフト用のラッピング手数料の設定などにお使いいただけます。

まとめ

ここまでで、Shopping Cart 拡張アプリ 設定について学びました。ここまでの内容を理解することができたら、次は商品データ(エントリー)を登録する方法を学ぶと良いでしょう。商品データ(エントリー)を登録する方法についてはこちらのエントリーで解説しています。

Ver.3.1.x インストール方法

こちらでは a-blog cms Ver.3.1.x のインストール方法について紹介します。

1. サーバー環境

PHP 7.3.x - 8.3.x & MySQL 5.x - 8.0 の動作するウェブサーバーをご用意ください。

旧バージョンである Ver. 2.11.x までであれば、PHP 5.3.3 - 7.4.x で動作させることができます。詳しくは 旧バージョンのインストール方法 をご覧ください。

簡単にテストで試してみたいという方については、無料で30日間のお試し可能な a-blog cms インストール済みのレンタルサーバーサービスとして ablogcms.io を提供しておりますので、そちらもご活用ください。



2.ダウンロード & アップロード

ダウンロードページより新規インストールパッケージをダウンロードください。

新規インストールパッケージ ダウンロード

ZIPファイルを解凍すると ablogcms フォルダがありますので、ablogcms フォルダ自身はアップロードぜずに、ablogcms フォルダの中のファイルのみをサーバーの指定場所にアップロードしてください。

ファイル数 7,000ファイル以上で 90MB以上のデータ量を FTP する際には時間がかかりますので、20KBほどの PHPファイル1つをアップロードするだけで、この 2. 3. 4. の工程を自動化する「簡単セットアップ」というプログラムが用意されていますので、こちらの利用もおすすめ致します。



omake フォルダには、build・snippets 等が用意されていますので、必要に応じてご活用ください。

CMSの設置場所について

一般的には、ドキュメントルートに設置することが通常ですが、ディレクトリの中に設置することも可能です。またインストール後に、他のディレクトリに移すことも可能です。その場合、ファイルを移動するだけで問題なく動作します。

3.パーミッションの設定

PHP の動作モードによって設定が異なります。

共用サーバー

共用サーバーをご利用の場合には、一般的には CGIモードで動作していることが多く、この場合にはパーミッションの変更をする必要はありません。もし、インストーラーの画面で「パーミッションの変更が必要」だとメッセージが表示されるようであれば「専用サーバー / VPS など」と同様の設定を行ってください。

専用サーバー / VPS など

専用サーバーや VPS のようなサーバーについては、モジュールモードで PHP が動作していることが多いですので、読み書き可能な権限を設定します。

  • config.server.php
  • archives
  • archives_rev
  • media
  • cache
  • themes

パーミッションの設定については、サーバーのセキュリティに関わることになりますので、分かる方が自己責任で対応ください。

4.ファイル名の変更

アップロードしたファイルの中に htaccess.txt というファイルが、いくつかあります。このファイルを .htaccess というファイル名に変更してください。

  • htaccess.txt
  • archives/htaccess.txt
  • archives_rev/htaccess.txt
  • media/htaccess.txt
  • cache/htaccess.txt
  • private/htaccess.txt
  • themes/htaccess.txt

また、htaccess.txt 以外に、以下の 3つのファイルも同様にドットをファイル名の前につけて、.txt を消してください。

  • editorconfig.txt
  • env.txt
  • gitignore.txt

FTPソフトによっては、ドットで始まるファイルは初期設定では表示させないこともありますので、名前を変更した時点で見えなくなってしまうことがあります。

5.セットアップの開始

Webブラウザから、各ファイルをアップロードした URL にアクセスします。 最初に利用規約のページが表示されますので、ご利用規約をよくお読みのうえ、[同意してインストールを続ける]を押してください。


インストール画面が表示されます。事前準備を確認し必要な作業・情報確認をおこなってください。



セットアップページのメッセージに従って、セットアップを進めます。

5-1. 動作環境のチェック

3 4 の作業が完了しているかのチェックが行われます。



5-2. ドメインの設定

一般的には、インストール環境から自動的にドメインが編集されます。



5-3. データベースの設定

データベースの情報を設定します。以下情報を環境に合わせて設定ください。


項目名 説明 デフォルト値
データベースサーバー名 MySQLサーバーのホストを指定ください。ポートが3306では無い場合「hostname:port」のようにポート番号を指定することができます。
データベース名 MySQLのデータベース名を指定ください。
データベースユーザー名 MySQLのユーザー名を指定ください。
データベースパスワード MySQLのパスワードを指定ください。
テーブル先頭文字列 作成されるテーブルの先頭文字(接頭辞)になります。必要がなければ変更する必要はありません。 acms_
データベース文字コード データベースの文字コードを設定します。必要がなければ変更する必要はありません。(utf8mb4だと絵文字が利用可能になります) utf8mb4
データベース照合順序 データベースの照合順序を設定します。詳しくは以下を参照ください。 utf8mb4_general_ci

照合順序について

照合順序は文字を並び替えや比較・検索するときのルールになります。 大文字と小文字の区別や、文字の並び順を指定します。

例えば「utf8(mb4)_general_ci」は、アルファベットの大文字小文字は区別しませんが他は全て区別します。「utf8(mb4)_unicode_ci」は、大文字小文字/全角半角を区別しないようになります。

これにより、検索などで「utf8(mb4)_unicode_ci」を使用すると、曖昧な検索ができるようになります。

比較表 区別する場合は「×」、区別せず同じ扱いになるのが「○」になります。


照合順序 A、a はは、ぱぱ はは、ハハ びょういん、びよういん ?、? +、+
utf8mb4_unicode_ci
utf8mb4_general_ci × × × ×
utf8mb4_0900_ai_ci ×
utf8mb4_0900_as_ci × ×
utf8mb4_ja_0900_as_cs × × × ×
utf8mb4_ja_0900_as_cs_ks × × × × ×


5-4. テーブルの作成

データベースの接続情報が正しければ、テーブルが作成されます。


5-5. ブログとユーザーの設定

初心者の方は「beginner テーマ」を、多くの機能を試したい方は「siteテーマ」か「UTSUWAテーマ」を選択されることをおすすめします。



6.セットアップの終了

セットアップを最後まで進め、「セットアップ完了」というメッセージが表示されたら、setup ディレクトリの名前を変更する事で全てインストール作業が完了となります。

以下の画面で(移動)ボタンをクリックすれば、自動で setup ディレクトリがリネームされます。



setup ディレクトリーを変更するまで他のページにはアクセスすることができません。 インストールが完了すると setup ディレクトリーはメンテナンス用のログイン画面に役割が変わります。



これで a-blog cms のインストールが完了しました。サイトにアクセスし、表示できることを確認しましょう。

管理ページにアクセスする際には URL の後に /login をつけてアクセスしてください。


静的HTMLサイトからCMSのテーマを作ってみよう 1「エントリー編」


はじめに

「静的HTMLサイトからCMSのテーマを作ってみよう」では、静的HTMLファイルをa-blog cmsで利用できるようなテンプレートファイルに編集し、最終的には1つのオリジナルテーマを作成します。

またチュートリアルの実践環境として、本編ではローカルサーバー http://localhost を使用して説明しておりますが、以下のフォームから実際に作業をするサーバーのURLを入れていただく事で、文中のテキストを希望のURLに書き換えることができます。ぜひご活用ください。

a-blog cms のインストールされた環境を用意しましょう。ローカル環境( XAMPP / MAMP など)にインストールする際には、「簡単セットアップ」を利用するのがオススメです。その際に、インストール利用するテーマは beginner を選択してください。


もしくは http://ablogcms.io というサイトで、a-blog cms の実装を30日間お試しすることができる環境を無料で貸ししております。こちらを利用いただいても beginner テーマがインストールされた状態になっております。


インストールが完了したら、初期インストール時より登録されていたモジュールID については、すべて削除します。

管理画面 / モジュールID管理 より、すべてのチェックボックスにチェックをつけ、プルダウンメニューより削除を選択しましょう。表示された削除ボタンをクリックすると、削除が完了します。



エントリーやカテゴリーのようなデータについては、表示のサンプルとして、そのまま使います。サイト制作の際には、テーマを作る前にある実際に利用するであろうカテゴリー名とカテゴリーコードを設定しましょう。エントリーはサンプルで構いませんが、テキストだけでなく画像もあった方がいいでしょう。

HTMLで作られたサイトを themes フォルダーに設定

サンプルサイトのデータをダウンロードしてください。

上記のファイルが練習用の静的なHTMLサイトのデータになり、中には以下のフォルダ・ファイルが同梱されています。

フォルダ・ファイル名種類
index.htmlトップページ
list.html一覧ページ
entry.html詳細ページ
jsJavaScriptフォルダ
cssCSSフォルダ
imagesイメージフォルダ
fontウェブフォントフォルダ
相対パス版パスの記述の違う上記一式フォルダ

index.htmllist.htmlentry.html のファイル内リンクについては、作業のしやすさを考慮して絶対パスを使用しています。サイトのデザインについてブラウザでチェックしたい場合は、同封している相対パス版フォルダの中のテンプレートをご利用ください。

今回はこのデータファイルをテーマとして設定します。フォルダの名前を sample とを変更して、a-blog cms がインストールされているサーバーの themes フォルダーにコピーしてください。

管理画面でテーマを設定

管理画面 / コンフィグ / このブログの初期コンフィグ / 一般設定 / テーマ設定 を表示し、1. のように テーマディレクトリー名を sample に設定します。



テンプレートファイルの名前を、今回の静的HTMLのファイルに合わせて 2. のように index.html , list.html , entry.html を設定します。

種類ファイル名今回の作業
トップページindex.html修正
一覧ページlist.html修正
詳細ページentry.html修正
エラーページ(404 Not Found)404.html
管理ページadmin.html
エントリー編集ページentry.html修正
ユニット追加ページentry.html修正
ログインページlogin.html

エントリー編集ページ・ユニット追加ページのテンプレートは、基本的には詳細ページと共通になるように設定を行なってください。

今回は上記のように、利用しますが a-blog cms のテーマ作りとしては _top.html (トップページ), index.html(一覧ページ) , _entry.html(詳細ページ)というファイル名の付け方を推奨しています。(後ほど修正予定です)

これで、保存すると http://localhost に、sample テーマのサイトが表示されるようになりました。

出力されるHTMLのコードを確認

ブラウザからソースコードを確認すると の前に下記のような タグが追加され、閲覧しているページが a-blog cms で生成されたファイルであることを確認できます。

<meta name="generator" content="a-blog cms">

また a-blog cms では、ブラウザでテンプレートを表示する際に画像のパスが自動修正されます。例としてヘッダー部分のマーク画像のソースをご確認ください。

テンプレート上では、/images から記述されていますが

<img src="/images/ablogcms_mark.png" alt="ablogcms" class="site-logo">

ブラウザに表示される HTML のソースコードを確認すると、/themes/sample が追加され、リンク切れをしないようにシステム側でパスの補完処理が行われていることが確認できます。

<img src="/themes/sample/images/ablogcms_mark.png" alt="ablogcms" class="site-logo">

このようなパスの自動修正は、画像だけでなく タグ内の タグのパスについても行われています。以下は自動修正されたCSSリンクの例です。このように a-blog cms では、静的HTMLファイルをテーマ化する際も基本的にはテンプレートファイルを修正することなく、既存のコードを活用していただけます。

<link rel="stylesheet" href="/themes/sample/css/normalize.css">
<link rel="stylesheet" href="/themes/sample/css/acms.css">
<link rel="stylesheet" href="/themes/sample/css/site.css">
<link rel="stylesheet" href="/themes/sample/js/slick/slick.css">

1点、下のように背景画像をインラインスタイルで設定している部分では、パスの自動修正は行われません。今回は list.html の以下のソースが該当しています。

<div class="page-title-wrapper" style="background-image: url(/images/header.jpg);">

トップページの記事の一覧を実装

http://localhost トップページを表示します。「特定のカテゴリーの一覧」と書かれている5件の記事を CMS で、データベース内に保存されている情報を表示できるようにします。この1つの記事のことを a-blog cms では「エントリー」と呼び、CMS の情報を表示させるパーツのことをモジュールと呼んでいます。



以下の section 部分を a-blog cms の Entry_Headline モジュールに置き換えていきます。

<section class="module-section" id="top-headline">
   <div class="module-header clearfix">
      <h2 class="module-heading">特定のカテゴリーの一覧</h2>
      <a href="list.html" class="module-index-link"><span class="acms-icon acms-icon-arrow-right"></span>一覧</a>
   </div>
   <ul class="headline acms-list-group clearfix">
      <li class="acms-list-group-item headline-item  js-biggerlink">
         <time class="headline-dat" datetime="2016-04-27">2016年04月27日( 水 )</time>
         <a href="entry.html" class="acms-list-group-title-link headline-title">エントリー名1</a>
      </li>
      <li class="acms-list-group-item headline-item  js-biggerlink">
         <time class="headline-dat" datetime="2016-04-12">2016年04月12日( 火 )</time>
         <a href="entry.html" class="acms-list-group-title-link headline-title">エントリー名2</a>
      </li>
      <li class="acms-list-group-item headline-item  js-biggerlink">
         <time class="headline-dat" datetime="2015-04-13">2015年04月13日( 月 )</time>
         <a href="entry.html" class="acms-list-group-title-link headline-title">エントリー名3</a>
      </li>
      <li class="acms-list-group-item headline-item  js-biggerlink">
         <time class="headline-dat" datetime="2013-06-19">2013年06月19日( 水 )</time>
         <a href="entry.html" class="acms-list-group-title-link headline-title">エントリー名4</a>
      </li>
      <li class="acms-list-group-item headline-item  js-biggerlink">
         <time class="headline-dat" datetime="2013-06-19">2013年06月19日( 水 )</time>
         <a href="entry.htmll" class="acms-list-group-title-link headline-title">エントリー名5</a>
      </li>
   </ul>
</section>

Entry_Headline モジュールのスニペットとして、以下のようなものが用意されていますので、上記の HTML にあわせて実装していきます。

<!-- BEGIN_MODULE Entry_Headline -->
<div class="acms-margin-bottom-medium">
@include("/admin/module/setting.html")
<div class="clearfix">
	<p class="acms-float-right">
		<a href="{indexUrl}" class="acms-btn-flat acms-btn-flat-default acms-btn-flat-small">一覧へ</a>
		<a href="{indexUrl}rss2.xml" class="acms-btn-flat acms-btn-flat-default acms-btn-flat-small"><span class="acms-icon-config_feed_rss2"></span><span class="acms-hide-visually">RSS</span></a>
	</p>
</div>
<ul class="acms-list-group">
	<!-- BEGIN entry:loop -->
	<li class="acms-list-group-item"><time datetime="{date#Y}-{date#m}-{date#d}">{date#Y}年{date#m}月{date#d}日</time><!-- BEGIN category:veil --> <span class="acms-label acms-label-default">{categoryName}</span><!-- END category:veil --><!-- BEGIN url#front --><a href="{url}" class="acms-list-group-title-link"><!-- END url#front -->{title}<!-- BEGIN url#rear --></a><!-- END url#rear --><!-- BEGIN new --><span class="acms-label acms-label-warning">New!</span><!-- END new --></li>
	<!-- END entry:loop -->
</ul>
</div>
<!-- END_MODULE Entry_Headline -->

<section> 〜 </section> の外側に <!-- BEGIN_MODULE Entry_Headline --> と <!-- END_MODULE Entry_Headline --> を記述し、 <li> の下に <!-- BEGIN entry:loop --> 〜 <!-- END entry:loop --> を追記してください。

<li class="acms-list-group-item headline-item  js-biggerlink">
      <time class="headline-dat" datetime="2013-06-19">2013年06月19日( 水 )</time>
      <a href="entry.htmll" class="acms-list-group-title-link headline-title">エントリー名5</a>
</li>

<!-- BEGIN entry:loop -->
<li class="acms-list-group-item">
      <time datetime="{date#Y}-{date#m}-{date#d}">{date#Y}年{date#m}月{date#d}日</time>
      <!-- BEGIN category:veil --> <span class="acms-label acms-label-default">{categoryName}</span><!-- END category:veil -->
      <!-- BEGIN url#front --><a href="{url}" class="acms-list-group-title-link"><!-- END url#front -->{title}<!-- BEGIN url#rear --></a><!-- END url#rear -->
      <!-- BEGIN new --><span class="acms-label acms-label-warning">New!</span><!-- END new -->
</li>
<!-- END entry:loop -->

少し class の設定が違うので、もう少し修正する必要がありますが、この段階でブラウザで http://localhost にアクセスすれば、何らか CMS からコンテンツを表示できたことが確認できます。



現状表示されているエントリーは、全てのエントリーの新着数件が表示されていますが、ここには「お知らせ」のカテゴリーのみを表示させるようにしていきます。 HTMLタグのように、モジュールにも id="top_headline" のように id を設定することができます。

<!-- BEGIN_MODULE Entry_Headline id="top_headline" -->

こうすることで、Entry_Headline に条件を設定できるようになり、さらに表示件数や表示順ような表示側の設定も独立し設定が可能になります。モジュールID 化するといいます。

管理ページ / モジュールID に今回の top_headline を設定します。



この設定が終わったら、もう一度 http://localhost/ にアクセスしてみてください。これで「お知らせ」カテゴリーのエントリーのみの表示になります。

表示させたい情報が出るようになったら、最後は最終の HTML と等しくなるように class などを調整しましょう。

<!-- BEGIN_MODULE Entry_Headline id="top_headline"-->
<section class="module-section" id="top-headline">
  <div class="module-header clearfix">
    <h2 class="module-heading">お知らせの一覧</h2>
    <a href="/news/" class="module-index-link"><span class="acms-icon acms-icon-arrow-right"></span>一覧</a>
  </div>
  <ul class="headline acms-list-group clearfix">
    <!-- BEGIN entry:loop -->
    <li class="acms-list-group-item headline-item  js-biggerlink">
      <time class="headline-dat" datetime="2013-06-19">{date#Y}年{date#m}月{date#d}日( {date#l}[weekEN2JP] )</time>
      <a href="{url}" class="acms-list-group-title-link headline-title">{title}</a>
      <!-- BEGIN new --><span class="acms-label acms-label-warning">New!</span><!-- END new -->
    </li>
    <!-- END entry:loop -->
  </ul>
</section>
<!-- END_MODULE Entry_Headline -->

最終的には、以下のような表示になります。



記事詳細ページの実装

トップページの「お知らせの一覧」からリンクをクリックすると、ページを遷移しエラーになる事なく、詳細ページが表示されます。まだ、何も HTML を修正していないので entry.html がそのまま表示されています。

今回、CMS化する部分は <article> 〜 </article> の部分になります。

<article class="entry clearfix ">
  <header class="acms-page-header page-header">
    <!--
    <p class="entryInfo">
      <time datetime="2016-04-27">2016年04月27日(水)</time>
      <span class="acms-label entry-category"><a href="list.html">カテゴリー名</a></span>
      <span class="acms-label acms-label-danger entry-new">NEW</span>
    </p>
    -->
    <h1 class="entry-title"><a href="entry.html">エントリー名1</a></h1>
  </header>

  <div class="acms-entry entry-column">
    <div class="acms-grid">
      <div class="column-image-auto js_notStyle acms-col-sm-12">
        <a href="/images/bear.jpg">
          <img class="columnImage" src="/images/bear.jpg" alt="" width="858" height="483">
        </a>
      </div>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。</p>

      (量が多いので省略)
  
    </div>  
  </div>
</article>

ここにトップページの時と同様にモジュールのスニペットを貼り付けます。 今回は、エントリーの本文を表示するための Entry_Body スニペットを利用します。

<!-- BEGIN_MODULE Entry_Body -->
<div>
<!-- BEGIN notFound -->
<p>ただいまページを準備しております。もうしばらくお待ちください。</p>
<!-- END notFound -->

<!-- BEGIN serialNavi:veil -->
<ul class="acms-pager">
  <li>
    <!-- BEGIN prevNotFound -->prev not found<!-- END prevNotFound -->
    <!-- BEGIN prevLink -->
    <a href="{url}">« {name}[trim(27, '...')|escape]</a>
    <!-- END prevLink -->
    &nbsp;</li>
  <li><a href="{upperUrl}">一覧へ</a></li>
  <li>&nbsp;
    <!-- BEGIN nextNotFound -->next not found<!-- END nextNotFound -->
    <!-- BEGIN nextLink -->
    <a href="{url}">{name}[trim(27, '...')|escape] » </a>
    <!-- END nextLink -->
  </li>
</ul>
<!-- END serialNavi:veil -->

<!-- BEGIN entry:loop -->
@include("/admin/entry/revision-info.html")

<div class="acms-page-header">
  <!-- BEGIN pageHubHeader:veil -->
  <div>
    <p><!-- BEGIN date:veil --><time datetime="{date#Y}-{date#m}-{date#d}">{date#Y}年{date#m}月{date#d}日</time>
    <!-- END date:veil --><!-- BEGIN category:loop -->
      <span class="acms-label"><a href="{url}">{name}</a></span>
      <!-- BEGIN glue -->
      <
      <!-- END glue -->
      <!-- END category:loop --><!-- BEGIN new -->
    <span class="acms-label acms-label-warning">NEW</span>
    <!-- END new --></p>
  </div><!-- END pageHubHeader:veil -->
  @include("/admin/entry/title.html")
  <!-- BEGIN title:veil -->
    <h2><a href="{titleUrl}">{title}</a></h2>
  <!-- END title:veil -->
</div>
<div>
  <div>
    <!-- BEGIN unit:veil -->
    <div class="acms-entry">
      <div class="acms-grid-r">
      @include("/include/unit.html")
      </div>
    </div>
    <hr class="clearHidden">
    <!-- END unit:veil -->
    <!-- BEGIN continueLink:veil -->
    <p><a href="{continueUrl}" class="acms-btn-flat"><span class="acms-icon-arrow-right"></span>「{continueName}」の続きを読む</a></p>
    <!-- END continueLink:veil -->

    <!-- BEGIN formBody -->
    @include("/include/form/unit.html")
    <hr class="clearHidden">
    <!-- END formBody -->

    @include("/admin/entry/edit-%{IS_ADMIN}.html")

    <!-- BEGIN tag:veil -->
    <p>タグ:<!-- BEGIN tag:loop --><a href="{url}" class="acms-inline-space">{name}</a> <!-- END tag:loop --></p>
    <!-- END tag:veil -->

    @include("/admin/entry/action.html")
  </div>
  <!-- BEGIN footer:veil -->
  <div>
    <p class="acms-text-info">Posted by {posterName} at {date#H}:{date#i}  <a href="{inheritUrl}#permalink">パーマリンク</a>
      <!-- BEGIN commentAmount -->
      <a href="{commentUrl}#comment">コメント ( {commentAmount} )</a>
      <!-- END commentAmount -->
    </p>
  </div>
  <!-- END footer:veil -->
</div>
<!-- END entry:loop -->

<!-- BEGIN pager:veil -->
<div class="acms-text-center">
  <ul class="acms-pager">
    <!-- BEGIN backLink --><li><a href="{url}">« 前の{backNum}件</a></li><!-- END backLink -->
    <!-- BEGIN firstPage:veil --><li{pageCurAttr}[raw]><span><a href="{firstPageUrl}">{firstPage}</a></span></li><!-- END firstPage:veil -->
    <!-- BEGIN page:loop --><!-- BEGIN glue --><!-- END glue --><li{pageCurAttr}[raw]><span><!-- BEGIN link#front --><a href="{url}"><!-- END link#front -->{page}<!-- BEGIN link#rear --></a><!-- END link#rear --></span></li><!-- END page:loop -->
    <!-- BEGIN lastPage:veil --><li>...</li><li{pageCurAttr}[raw]><span><a href="{lastPageUrl}">{lastPage}</a></span></li><!-- END lastPage:veil -->
    <!-- BEGIN forwardLink --><li><a href="{url}">次の{forwardNum}件 »</a></li><!-- END forwardLink -->
  </ul>
</div>
<!-- END pager:veil -->
</div>

<!-- BEGIN simplePager:veil -->
<ul class="serialNav clearfix">
  <li class="serialNavItem serialNavItemPrev"><!-- BEGIN prevPage -->
    <a href="{url}">« 前ページ</a>
    <!-- END prevPage -->
  </li>
  <li class="serialNavItem serialNavItemNext"><!-- BEGIN nextPage --><a href="{url}">次ページ »</a>
    <!-- END nextPage -->
  </li>
</ul>
<!-- END simplePager:veil -->

<!-- END_MODULE Entry_Body -->

<article class="entry clearfix "> の下、<header class="acms-page-header page-header"> の上に、Entry_Body のスニペットを貼り付けてみてください。

<article class="entry clearfix ">
	
	(ここに Entry_Body のスニペットを貼ります)
	
  <header class="acms-page-header page-header">

その結果は、このようになります。 少し、レイアウトが崩れている部分もありますが、トップページからリンクされているページを順番にアクセスしてみると、表示させたい情報は出てくるようになったことが確認できます。

テーマ用の HTML に必須の CSS と JavaScript について

a-blog cms の管理用の UI は、一般の閲覧者のための HTML の中に追加で表示されます。このため、そのスタイルを設定している CSS が無いために表示がおかしくなっています。



これを修正するために entry.html の の中に以下のスニペットを追記します。

<link rel="stylesheet" href="/css/acms-admin.min.css">
<script src="%{JS_LIB_JQUERY_DIR}jquery-%{JS_LIB_JQUERY_DIR_VERSION}.min.js" charset="UTF-8"></script>
<!-- BEGIN_MODULE Js -->
<script src="%{ROOT_DIR}acms.js{arguments}" charset="UTF-8" id="acms-js"></script><!-- END_MODULE Js -->

このコードは、a-blog cms の管理画面を表示させ、キーボードショートカットの Windows なら「コントロール+K」、Mac なら「コマンド+K」 を実行し、検索ウィンドウを表示させ、 ;js(セミコロン JS) と入力してみてください。



これで、いつでも a-blog cms のカスタマイズをしているときに、この大事なコードを入手することができるようになります。

<head>タグの中に貼る際に、気を付けることが1つあります。 上記のスニペットの中には jQuery のタグも書かれていますので、2つの jQuery を読み込まないようにする必要があります。

<script src="/js/jquery-2.2.3.min.js" charset="UTF-8"></script>

ですので、jQuery を読み込んでいる部分に、今回のスニペットを貼るのがオススメです。



entry.html の <head> に CSS と JavaScript ( jQuery & acms.js ) を貼り、ブラウザのリロードをするとボタンも正しく横並びになり、(変更)ボタンをクリックすると編集画面も表示されるようになります。

同様に、index.htmllist.html についても、<head> 内に、a-blog cms で必須の CSS と JavaScript タグを設定してください。

お知らせ一覧ページの実装

ざっくり動かすところを優先して、次は list.html の <section> 〜 </section> 部分を CMS化していきます。

<section class="module-section">
  <div class="module-header clearfix">
    <h2 class="module-heading">カテゴリー名</h2>
  </div>
  <ul class="summary-custom clearfix">
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo1.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名1</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo2.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名2</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo3.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名3</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo4.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名4</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo5.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名5</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo6.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名6</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
  </ul>

  <nav class="acms-pager-container">
    <ul class="pager">
      <li><a href="list.html" aria-label="前へ" class="pager-link"><span aria-hidden="true">&laquo;</span></a></li>
      <li><span><a href="list.html" class="pager-link">1</a></span></li>
      <li class="cur"><span>2</span></li>
      <li><span><a href="list.html" class="pager-link">3</a></span></li>
      <li><a href="list.html" aria-label="次へ" class="pager-link"><span aria-hidden="true">&raquo;</span></a></li>
    </ul>
  </nav>

</section>

index.html や entry.html と同様にモジュールのスニペットを貼り付けます。 今回は、画像付きエントリーの一覧ページ用の Entry_Summary になります。

<!-- BEGIN_MODULE Entry_Summary -->
<div class="acms-margin-bottom-medium">
  @include("/admin/module/setting.html")
  <!-- BEGIN notFound -->
  <p>ただいまページを準備しております。もうしばらくお待ちください。</p>
  <!-- END notFound -->
  
  <div class="acms-grid">
    <!-- BEGIN unit:loop -->
    <!-- BEGIN entry:loop -->
    <div class="acms-col-md-4 js-autoheight-r"><!-- BEGIN image:veil -->
      <img src="%{ROOT_DIR}{path}" alt="{alt}" class="acms-img-responsive"><!-- END image:veil --><!-- BEGIN noimage --><img src="/images/default/noimage.gif" alt="" class="acms-img-responsive"><!-- END noimage -->
      <h3>{title}</h3>
      <p>{summary}</p>
      <p><a href="{url}" class="acms-btn">詳細をみる</a></p>
      <!-- BEGIN relatedEntry -->
        <!-- BEGIN relatedEntry.default -->
        <ul>
          <!-- BEGIN relatedEntry.default:loop -->
          <li><a href="{url}">{categoryName}: {title}</a></li>
          <!-- END relatedEntry.default:loop -->
        </ul>
        <!-- END relatedEntry.default -->
      <!-- END relatedEntry -->
    </div>
    <!-- END entry:loop -->
    <!-- END unit:loop -->
  </div>
  
  <!-- BEGIN pager:veil -->
  <div class="acms-text-center">
    <ul class="acms-pager">
      <!-- BEGIN backLink --><li><a href="{url}">« 前の{backNum}件</a></li><!-- END backLink -->
      <!-- BEGIN page:loop --><li{pageCurAttr}[raw]><span><!-- BEGIN link#front --><a href="{url}"><!-- END link#front -->{page}<!-- BEGIN link#rear --></a><!-- END link#rear --></span></li><!-- END page:loop -->
      <!-- BEGIN lastPage:veil --><li><span>...</span></li><li{pageCurAttr}[raw]><span><a href="{lastPageUrl}">{lastPage}</a></span></li><!-- END lastPage:veil -->
      <!-- BEGIN forwardLink --><li><a href="{url}">次の{forwardNum}件 »</a></li><!-- END forwardLink -->
    </ul>
  </div>
  <!-- END pager:veil -->
</div>
<!-- END_MODULE Entry_Summary -->

<main class="acms-col-md-9 main"> の下、<section class="module-section"> の上に、Entry_Summary スニペットを貼り付けてみてください。

<main class="acms-col-md-9 main">
	
	(ここに Entry_Summary のスニペットを貼ります)
	
  <section class="module-section">

http://localhost/news/ にアクセスすると、いくつかのエントリーの「画像・タイトル・本文が少し」表示されることが確認できます。



これまでと同様に、スニペットを参考に元の HTML を修正していきます。 <section> の前に <!-- BEGIN_MODULE Entry_Summary --> を、</section> の後に <!-- END_MODULE Entry_Summary --> を追記します。

<li> のループ部分ですが、 Entry_Headline と違って、<!-- BEGIN entry:loop --> の外側に <!-- BEGIN unit:loop --> というものがあります。

<!-- BEGIN unit:loop -->
<!-- BEGIN entry:loop -->
  <li> ... </li>
<!-- END entry:loop -->
<!-- END unit:loop -->

繰り返しになる部分の外側に、このようにセットで書いてください。 unit:loop は、例えば <table> の <td> を entry:loop で繰り返し、<tr> 部分を unit:loop で実装できるようにするためのもので、<ul> の時には関係ない事になりますが、unit:loop は省略できないので、このような記述になります。

<!-- BEGIN_MODULE Entry_Summary -->
<section class="module-section">
  <div class="module-header clearfix">
    <h2 class="module-heading">カテゴリー名</h2>
  </div>
  <ul class="summary-custom clearfix">
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="entry.html"><div class="photo">
        <img src="/images/box_zoo1.jpg" alt="" class="acms-img-responsive">
      </div>
      <p class="photo-title">エントリー名1</p></a>
      <p>本文が少し表示されています。本文が少し表示されています。本文が少し表示されています。本文が少し表示されて...</p>
    </li>
    <!-- BEGIN unit:loop -->
    <!-- BEGIN entry:loop -->
    <li class="summary-custom-entry acms-col-6 acms-col-sm-4">
      <a href="{url}"><div class="photo">
        <img src="%{ROOT_DIR}{path}" alt="{alt}" class="acms-img-responsive"><!-- END image:veil --><!-- BEGIN noimage --><img src="/images/default/noimage.gif" alt="" class="acms-img-responsive"><!-- END noimage -->
      </div>
      <p class="photo-title">{title}</p></a>
      <p>{summary}</p>
    </li>
    <!-- END entry:loop -->
    <!-- END unit:loop -->
  </ul>

<!-- BEGIN pager:veil -->
<div class="acms-text-center">
  <ul class="acms-pager">
    <!-- BEGIN backLink --><li><a href="{url}">« 前の{backNum}件</a></li><!-- END backLink -->
    <!-- BEGIN page:loop --><li{pageCurAttr}[raw]><span><!-- BEGIN link#front --><a href="{url}"><!-- END link#front -->{page}<!-- BEGIN link#rear --></a><!-- END link#rear --></span></li><!-- END page:loop -->
    <!-- BEGIN lastPage:veil --><li><span>...</span></li><li{pageCurAttr}[raw]><span><a href="{lastPageUrl}">{lastPage}</a></span></li><!-- END lastPage:veil -->
    <!-- BEGIN forwardLink --><li><a href="{url}">次の{forwardNum}件 »</a></li><!-- END forwardLink -->
  </ul>
</div>
<!-- END pager:veil -->

</section>
<!-- END_MODULE Entry_Summary -->

<!-- BEGIN unit:loop --> の上に1つ、元の <li> を参考に残していますが、動作確認ができた時点で削除ください。

この段階では http://localhost/news/ にアクセスすると、「お知らせ」以外のエントリーも表示されてしまっています。どうしたらいいか思いつきますでしょうか? top.html の時に設定したようにモジュールIDを新しく作ってみましょう。

管理画面 / モジュールID管理 より、 モジュールID を作成します。今回は id="index_summary" という設定を作ってみてください。

汎用的に利用する一覧ページにするための変更

これまでのことを学んでいる状態で id="index_summary" を作ると以下のような設定を作られているのではないかと思います。



この場合、「お知らせ」専用のテンプレートであった場合には、この設定で大丈夫ですが、実は他のカテゴリーの一覧ページにアクセスすると問題があり、今回は汎用的に利用する一覧ページのための実装方法をご紹介します。

例えば、 http://localhost/recruit/ にアクセスすると、beginnerテーマのデータであればエラーにならず一覧ページが表示されるハズです。 しかし「採用情報」のエントリーではなく、 http://localhost/news/ と変わらない「お知らせ」が表示されてしまいます。

現在、一覧用のテンプレートは list.html ですので、「採用情報」と「お知らせ」の一覧は同じテンプレートという事になります。ですから、モジュールIDの設定で「お知らせ」を選択する以外の設定が必要となります。



カテゴリーIDに設定されている「お知らせ」の設定を削除し、カテゴリーID の設定にあるチェックボックスにチェックをつけます。 この設定にすることで、 URL の http://localhost/recruit/recruit 部分をモジュールID の検索条件としてモジュールが動作するようになります。



採用情報」の一覧ページは、画像サイズが同じなので気になりませんが、「お知らせ」の一覧ページを確認してみてください。 http://localhost/news/ 4つ目のオレンジのエントリーが、2つ目に引っ掛かっているのが気になります。これを改善するためのオマジナイもご紹介しておきます。



list.html で以下の記述を探してみてください。

<li class="summary-custom-entry acms-col-6 acms-col-sm-4">

エントリーを枠の要素の class に js-autoheight-r を追加してみてください。

この class があることで、高さを揃える JavaScript が動作します。 それ以外にも class をつけるだけで色々な JavaScript を動かすことができるようにもなっていますので、組み込みJS のページも参考にご覧ください。


<li class="summary-custom-entry acms-col-6 acms-col-sm-4 js-autoheight-r">


エントリーを追加するボタンを追加する



どこに置くかは自由ですが、index.html , list.html , entry.html どのファイルにもインクルードするようにしてください。

@include("/admin/action.html")

まとめ

ここまでの実装で、ザックリではありますが以下の実装ができた事になります。

  • トップページの「お知らせ」一覧表示
  • 「お知らせ」詳細ページ表示
  • 「お知らせ」の一覧ページ表示
  • 汎用的な一覧ページの表示(詳細ページも汎用的に利用できています)
  • エントリーを追加するボタンを追加する

これで完成では、いろいろ問題もありますので その2「カスタムフィールド編」 で、さらに完成度を高めていきます。

静的HTMLサイトからCMSのテーマを作ってみよう2「カスタムフィールド編」


はじめに

総復習「静的HTMLサイトからCMSのテーマを作ってみよう」では、静的HTMLファイルをa-blog cmsで利用できるようなテンプレートファイルに編集し、最終的には1つのオリジナルテーマを作成していきます。

このページは 静的HTMLサイトからCMSのテーマを作ってみよう 1「エントリー編」 の続きになります。

またチュートリアルの実践環境として、本編ではローカルサーバー http://localhost を使用して説明しておりますが、以下のフォームから実際に作業をするサーバーのURLを入れていただく事で、文中のテキストを希望のURLに書き換えることができます。ぜひご活用ください。

カスタムフィールドとは

管理画面上に標準で用意されている入力欄ではなく、カスタマイズする人が欲しい追加された入力欄のことです。一般的にテーマ作成では、サイトの閲覧者がアクセスする表側のテンプレートを作ることになりますが、カスタムフィールドについては管理画面のテンプレートを作ることで希望の管理画面の UI を構築していきます。



カスタムフィールドの種類と、そのテンプレートのファイルの置き場は以下のようになります。

カスタムフィールドの種類テンプレートファイル
エントリー カスタムフィールド/themes/sample/admin/entry/field.html
カテゴリー カスタムフィールド/themes/sample/admin/category/field.html
ブログ カスタムフィールド/themes/sample/admin/blog/field.html
ユーザー カスタムフィールド/themes/sample/admin/user/field.html
モジュール カスタムフィールド/themes/sample/admin/module/field.html

カスタムフィールドの作り方

a-blog cms のカスタムフィールドは、フォームの HTML を用意するのですが、入力ミスで動作しなくなることから「カスタムフィールドメーカー」というツールが管理ページやデベロッパーサイト上で提供されています。

管理ページ / コンフィグ / このブログの初期コンフィグ / ガイドライン/ツール / カスタムフィールドメーカー



ヘッダー・フッターの編集用の管理画面の作成

カスタムフィールドの基礎の紹介が終わったので、ここからテンプーレートを実装を進めます。このヘッダー・フッター部分は、サイト全体どこでも利用するデータということになりますので、ブログのカスタムフィールドを利用します。



ヘッダー部分は、アイコンとタイトルを編集可能にします。



フッター部分は、左側の会社名・郵便番号・住所・電話番号と、右側にある SNSアイコンのリンク先を設定したり、使わないものは消したりできるようにしてみます。

ブログのカスタムフィールドの記述については、 /themes/sample/admin/blog/field.html に記述しますが、 /admin/blog/field.html は、存在していないため admin ディレクトリを作成し、blog ディレクトリを作成し、その中に空の field.html ファイルを作成する必要があります。

その後、カスタムフィールドメーカーを利用して以下の情報から管理画面のフォームのHTMLを作成します。

ヘッダー情報

入力欄の種類タイトルフィールド
メディアアイコンsite-icon
テキストサイト名site-name
<table class="acms-admin-table-admin-edit">
  <tr>
    <th>アイコン</th>
    <td class="js-media-field">
      <div class="js-droparea" data-thumbnail="{site-icon@thumbnail}" data-type="image" data-thumbnail-type="{site-icon@type}" data-width="200px" data-height="200px"></div>
      <p class="js-text acms-admin-text-danger" style="display:none">許可されていないファイルのため挿入できません。</p>
      <div class="acms-admin-margin-top-mini">
        <button type="button" class="js-insert acms-admin-btn" data-type="image">メディアを選択</button>
      </div>
      <input type="hidden" name="site-icon" value="{site-icon}" class="js-value" />
      <input type="hidden" name="field[]" value="site-icon" />
      <input type="hidden" name="site-icon:extension" value="media" />
    </td>
  </tr>
  <tr>
    <th>サイト名 </th>
    <td>
      <input type="text" name="site-name" value="{site-name}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="site-name" />
    </td>
  </tr>
</table>

会社情報

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>会社名</th>
    <td>
      <input type="text" name="company-name" value="{company-name}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="company-name" />
    </td>
  </tr>
  <tr>
    <th>郵便番号</th>
    <td>
      <input type="text" name="zip" value="{zip}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="zip" />
    </td>
  </tr>
  <tr>
    <th>住所</th>
    <td>
      <input type="text" name="address" value="{address}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="address" />
    </td>
  </tr>
  <tr>
    <th>電話番号</th>
    <td>
      <input type="text" name="tel" value="{tel}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="tel" />
    </td>
  </tr>
</table>

SNS情報    

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>Facebook</th>
    <td>
      <input type="text" name="facebook" value="{facebook}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="facebook" />
    </td>
  </tr>
  <tr>
    <th>Twitter</th>
    <td>
      <input type="text" name="twitter" value="{twitter}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="twitter" />
    </td>
  </tr>
  <tr>
    <th>YouTube</th>
    <td>
      <input type="text" name="youtube" value="{youtube}" class="acms-admin-form-width-full" />
      <input type="hidden" name="field[]" value="youtube" />
    </td>
  </tr>
</table>

これらをテンプレート上に設定すると ブログ管理のカスタム設定 に入力欄が表示されます。



ここまで作ると、やっとテンプレート側の実装になります。

ヘッダーの表示側の実装

管理画面が出来上がると、次はそのデータを表示できるようにします。

今回はブログのカスタムフィールドを表示させます。表示にはブログフィールドを利用します。カスタムフィールドモジュールの中で利用する {変数} は、制作者側で用意していますので、中身は空っぽになっています。

<!-- BEGIN_MODULE Blog_Field -->

<!-- END_MODULE Blog_Field -->

修正する場所は <div class="header-logo"> になります。

<div class="header-logo">
  <div>
    <h1 class="site-name"><a href="index.html">
      <img src="/images/ablogcms_mark.png" alt="ablogcms" class="site-logo"><span class="siteNameText">sample static site</span></a>
    </h1>
  </div>
</div>

表示用のコードについても、カスタムフィールドメーカーの表示用ソースを参考に、以下のように書き換えます。

<!-- BEGIN_MODULE Blog_Field -->
<div class="header-logo">
  <div>
    <h1 class="site-name"><a href="index.html">
      <img src="%{MEDIA_ARCHIVES_DIR}{site-icon@path}" alt="{site-name}" class="site-logo"><span class="siteNameText">{site-name}</span></a>
    </h1>
  </div>
</div>
<!-- END_MODULE Blog_Field -->

IFブロックを利用して条件分岐の設定をする

先ほど最低限の実装を済ませましたが、もう少ししっかり作り込みを行います。 CMS ではデータがある時に出すのは当たり前ではありますが、無い時にどうするのかも大事です。例えばアイコンが無い時に何もしてないと、画像のパスが無いままだけ残ってしまうことになります。

IFブロックを利用するとテンプレートに条件分岐を設定できます。


<div class="header-logo">
  <div>
    <h1 class="site-name"><a href="index.html">
      <!-- BEGIN_IF [{site-icon@path}/nem] -->
      <img src="%{MEDIA_ARCHIVES_DIR}{site-icon@path}" alt="{site-name}" class="site-logo">
      <!-- END_IF -->
      <span class="siteNameText">
      <!-- BEGIN_IF [{site-name}/nem] -->
        {site-name}
      <!-- ELSE -->
        %{BLOG_NAME}
      <!-- END_IF -->
    </span>
    </a>
    </h1>
  </div>
</div>

フッターの表示側の実装

ヘッダーと同じようにフッター部分も実装をしていきます。こちらもデータが無い時にタグが残らないような実装をする必要がありますが、IFブロックより手軽な :veilブロック <!-- BEGIN xxx:veil --> 〜 <!-- END xxx:veil --> を使ってみます。

:veilブロックは、 BEGIN 〜 END の中に {変数} が複数あったとして、何も編集されなかったら、囲まれているエリアは無かったことにできるというブロックです。


編集前

<address class="acms-col-md-4">
  <dl class="company-about">
    <dt class="company-name">有限会社アップルップル</dt>
    <dd class="company-detail">〒450-0002</dd>
    <dd class="company-detail">名古屋市中村区名駅3-18-5 モンマートビル5F</dd>
    <dd class="company-detail">TEL : <a href="tel:052-485-8577">052-485-8577</a></dd>
  </dl>
</address>
<div class="acms-col-md-8">
  <div class="acms-hide acms-block-lg acms-block-xl">
    <ul class="sns-list">
      <li class="sns-list-item"><a href="https://www.facebook.com/ablogcms" class="sns-list-facebook"><span class="acms-icon-facebook"></span></a></li>
      <li class="sns-list-item"><a href="https://twitter.com/ablogcms" class="sns-list-twitter"><span class="acms-icon-twitter"></span></a></li>
      <li class="sns-list-item"><a href="https://www.youtube.com/user/ablogcmsTube" class="sns-list-youtube"><span class="acms-icon-youtube"></span></a></li>
    </ul>
  </div>
</div>

以下のような実装になりました。{変数}毎に :veil で囲み、データが無い時には、<dd> が無くなるように設定しています。全部書いてない時には <dl> や <ul> も消えるように company:veil というものも用意しました。その外の <address class="acms-col-md-4"> や <div class="acms-col-md-8"> を囲むとレイアウトがズレる可能性があるので残すようにしています。

<!-- BEGIN_MODULE Blog_Field -->
<address class="acms-col-md-4">
  <!-- BEGIN company:veil -->
  <dl class="company-about">
    <!-- BEGIN company-name:veil --><dt class="company-name">{company-name}</dt><!-- END company-name:veil -->
    <!-- BEGIN zip:veil --><dd class="company-detail">〒{zip}</dd><!-- END zip:veil -->
    <!-- BEGIN address:veil --><dd class="company-detail">{address}</dd><!-- END address:veil -->
    <!-- BEGIN tel:veil --><dd class="company-detail">TEL : <a href="tel:{tel}">{tel}</a></dd><!-- END tel:veil -->
  </dl>
  <!-- END company:veil -->
</address>
<div class="acms-col-md-8">
  <!-- BEGIN sns:veil -->
  <div class="acms-hide acms-block-lg acms-block-xl">
    <ul class="sns-list">
      <!-- BEGIN facebook:veil --><li class="sns-list-item"><a href="{facebook}" class="sns-list-facebook"><span class="acms-icon-facebook"></span></a></li><!-- END facebook:veil -->
      <!-- BEGIN twitter:veil --><li class="sns-list-item"><a href="{twitter}" class="sns-list-twitter"><span class="acms-icon-twitter"></span></a></li><!-- END twitter:veil -->
      <!-- BEGIN youtube:veil --><li class="sns-list-item"><a href="{youtube}" class="sns-list-youtube"><span class="acms-icon-youtube"></span></a></li><!-- END youtube:veil -->
    </ul>
  </div>
  <!-- END sns:veil -->
</div>
<!-- END_MODULE Blog_Field -->

カテゴリー毎のヘッダーの実装

次は list.htmlentry.html のヘッダー部分の仕上げを行います。現状は、カテゴリー名と書かれていますが、それぞれのカテゴリー名が編集されるようにします。また、黒い部分には背景画像を設定し、「カテゴリーの説明文が書かれます。」の部分も編集可能にします。



まずは修正する場所は <div class="page-title-wrapper"> になります。

<div class="page-title-wrapper" style="background-image: url(/images/header.jpg);">
  <div class="page-title-filter"></div>
  <div class="page-title-inner">
  	<div class="acms-container">
    <p class="page-title">カテゴリー名</p>
    <p class="page-description">カテゴリーの説明文が書かれます。</p>
  	</div>
  </div>
</div>

グローバル変数を利用

a-blog cms のグローバル変数を利用すると、簡単にカテゴリー名が設定できます。通常の変数は中括弧(波括弧)を利用して {変数} を設定しますが、グローバル変数は %{変数} のように中括弧の前にパーセントがついています。どのようなグローバル変数があるのかは、デベロッパーサイトのドキュメントのグローバル変数をご覧ください。


ヘッダー部分でも実は %{BLOG_NAME} と実装結果の HTML には書いてありましたが、カテゴリー毎に変わっているところで確認してもらった方が分かりやすいかと説明しないでいました。

カテゴリー名のグローバル変数は %{CATOGORY_NAME} と書きます。

<div class="page-title-wrapper" style="background-image: url(/images/header.jpg);">
  <div class="page-title-filter"></div>
  <div class="page-title-inner">
  	<div class="acms-container">
    <p class="page-title">%{CATEGORY_NAME}</p>
    <p class="page-description">カテゴリーの説明文が書かれます。</p>
  	</div>
  </div>
</div>

これで http://localhost/news/http://localhost/recruit/ を表示させると「お知らせ」や「採用情報」という表示が出るようになります。

カテゴリーカスタムフィールド管理画面の作成

次に、背景画像と説明文はカテゴリーのカスタムフィールドを利用します。項目としては以下のような項目になりますので、カスタムフィールドメーカーを利用し管理画面のフォームのHTMLを作成します。入力用ソース のエリアに書かれたフォームのHTMLを単体のファイルとして、 /themes/sample/admin/category/field.html に保存します。

入力欄の種類タイトルフィールド
メディア背景画像category-image
テキストエリア説明文category-description
<table class="acms-admin-table-admin-edit">
  <tr>
    <th>背景画像</th>
    <td class="js-media-field">
    <div class="js-droparea" data-thumbnail="{category-image@thumbnail}" data-type="image" data-thumbnail-type="{category-image@type}" data-width="200px" data-height="200px"></div>
    <p class="js-text acms-admin-text-danger" style="display:none">許可されていないファイルのため挿入できません。</p>
    <div class="acms-admin-margin-top-mini">
      <button type="button" class="js-insert acms-admin-btn" data-type="image">メディアを選択</button>
    </div>
    <input type="hidden" name="category-image" value="{category-image}" class="js-value" />
    <input type="hidden" name="field[]" value="category-image" />
    <input type="hidden" name="category-image:extension" value="media" />
    </td>
  </tr>
  <tr>
    <th>説明文</th>
    <td>
    <textarea name="category-description" class="acms-admin-form-width-full">{category-description}</textarea>
    <input type="hidden" name="field[]" value="category-description" />
    </td>
  </tr>
</table>

これらをテンプレート上に設定すると カテゴリー管理 の管理画面の 例えばお知らせ」のカスタム設定 を確認してみると、入力欄が表示されます。



カテゴリーカスタムフィールド表示側の実装

ブログのカスタムフィールドで行った事の繰り返しになりますが、今回はカテゴリーになりますので、利用するモジュールはカテゴリーフィールドを利用します。

<!-- BEGIN_MODULE Category_Field -->

<!-- END_MODULE Category_Field -->

ブログのカスタムフィールドと同様なので、以下 HTML は見ないで、実装が完了したら答え合わせにご利用ください。

<!-- BEGIN_MODULE Category_Field -->
<div class="page-title-wrapper" style="background-image: url(%{MEDIA_ARCHIVES_DIR}{category-image@path});">
  <div class="page-title-filter"></div>
  <div class="page-title-inner">
    <div class="acms-container">
      <p class="page-title">%{CATEGORY_NAME}</p>
      <!-- BEGIN description:veil -->
      <p class="page-description">{category-description}[nl2br4html]</p>
      <!-- END description:veil -->
    </div>
  </div>
</div>
<!-- END_MODULE Category_Field -->

今回、見慣れない [nl2br] という記述が見つかります。 これは a-blog cms の機能で、校正オプション と呼びます。{変数}の値を利用し情報を編集するようなプログラムを実行することができます。


{category-description}[nl2br4html] と記述することで、{category-description} の改行コードを \<br> に置き換える処理を行います。

カテゴリー「採用情報」カスタム設定 から、データを入れることで http://localhost/recruit/ には、以下のような表示となります。



まとめ

今回はカスタムフィールドを中心に、テンプレートで使う機能を紹介しました。

  • ブログのカスタムフィールドでヘッダー・フッターの編集
  • カテゴリーのカスタムフィールドでカテゴリーヘッダーの編集
  • 条件分岐をするための IFブロックや :veilブロックの紹介
  • グローバル変数の利用
  • 校正オプションの利用

それらしくなってきましたが、まだまだな部分もあります。 その3「モジュール編」 で、さらに完成度を高めていきます!