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


目次

  1. はじめに
  2. カスタムフィールドとは
  3. カスタムフィールドの作り方
  4. ヘッダー・フッターの編集用の管理画面の作成
  5. ヘッダーの表示側の実装
  6. フッターの表示側の実装
  7. カテゴリー毎のヘッダーの実装
  8. カテゴリーカスタムフィールド表示側の実装
  9. まとめ

はじめに

「静的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 を用意するのですが、入力ミスで動作しなくなることから「カスタムフィールドメーカー」というツールが管理ページやデベロッパーサイト上で提供されています。管理ページのカスタムフィールドメーカーには、クイックサーチ(どこでも検索) でアクセスしてみましょう。

  • Windows: Ctrl + k
  • MacOS: ⌘K

の検索窓に「カスタムフィールドメーカー」と入れればサジェストされます。

カスタムフィールドメーカー



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

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



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



フッター部分は、左側の会社名・郵便番号・住所・電話番号と、右側にある 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>

会社情報

入力欄の種類タイトルフィールド
テキスト会社名company-name
テキスト郵便番号zip
テキスト住所address
テキスト電話番号tel
<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情報    

入力欄の種類タイトルフィールド
テキストFacebookfacebook
テキストTwittertwitter
テキストYouTubeyoutube
<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>

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

またタグの上にh2などの見出しを設置しておくことでた各項目の区切り分かりやすくなります。

<h2>ヘッダー情報</2>


ここまで作ると、次は表示側のテンプレートの実装になります。

ヘッダーの表示側の実装

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

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

<!-- 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「モジュール編」 で、さらに完成度を高めていきます!

Twitterで「カスタムフィールド編」完了をシェアする

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


目次

  1. はじめに
  2. HTMLで作られたサイトを themes フォルダーに設定
  3. 管理画面でテーマを設定
  4. 出力されるHTMLのコードを確認
  5. トップページの記事の一覧を実装
  6. 記事詳細ページの実装
  7. テーマ用の HTML に必須の CSS と JavaScript について
  8. お知らせ一覧ページの実装
  9. 汎用的に利用する一覧ページにするための変更
  10. エントリーを追加するボタンを追加する
  11. まとめ

はじめに

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

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

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



https://www.ablogcms.io というサイトで、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 フォルダーにコピーしてください。

管理画面でテーマを設定

管理画面 / テーマ を表示し、テーマセットの作成 をクリックします。


テーマセットには分かりやすい名前をつけておきます。ここでは「静的HTMLからのテーマ」としておき、作成 をクリックします。作成できたら、一覧 をクリックしてテーマセット管理に戻ります。


作成した「静的HTMLのテーマ」の右にある テーマ設定 をクリックします。


「テーマディレクトリ名」から sample を選択します。


テンプレートファイルの名前を、今回の静的HTMLのファイルに合わせて下の画像のように 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(詳細ページ)というファイル名の付け方を推奨しています。(後ほど修正予定です)


サイト管理の ブログ をクリックしてブログ管理 画面に行き、テーマセットから 静的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">
  <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 を読み込んでいる <script> タグ部分を置き換えて、今回のスニペットに置き換えるのがオススメです。



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> を参考に残していますが、動作確認ができた時点で削除ください。 同じく最初に貼り付けたEntry_summaryのスニペットが残っている場合も削除ください。

この段階では 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">


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



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

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

まとめ

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

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

a-blog cms の基本である「エントリー」の表示部分の実装ができました。その2「カスタムフィールド編」 では、さらにテーマのカスタマイズを進めていきます。

Twitterで「エントリー編」完了をシェアする

チュートリアル

静的HTMLサイトからCMSのテーマを作ってみよう

a-blog cms は CMS のカスタマイズには、テンプレートに PHP のコードを書くことなく実装していく事ができる ローコードCMS です。このチュートリアルでは、サンプルの HTML から オリジナルのテーマを作る手順をご紹介していきます。



上記の画像のようなデザインで

  • トップページ ( index.html )
  • 一覧ページ ( list.html )
  • 詳細ページ ( entry.html )

の3つのページが用意されている HTML ファイルになります。

サンプルファイル ダウンロード

環境を用意する

a-blog cms はインストール型の CMS になります。 このチュートリアルを行うためには PHP と MySQL が利用できるサーバー環境が必要になります。

  1. ご自身のパソコンに XAMPP・MAMP・Docker などをインストールして利用する。
  2. ご自身で契約しているレンタルサーバーを利用する。
  3. 弊社で無料で提供しているお試し専用サーバー ablogcms.io を利用する。

上記の 1. 2. については「簡単セットアップ」を利用して環境の準備を行なってみてください。

3. についてはメールアドレスを入れるとログイン情報と FTP情報が書かれたメールが届きます。 beginnerが設定されたサイトがインストールされた状態からのスタートになります。

それでは a-blog cms のカスタマイズを体験ください

  1. エントリー編
  2. カスタムフィールド編
  3. モジュール編
  4. 子ブログ編
  5. フォーム編

静的HTMLサイトからCMSのテーマを作ってみよう 5「フォーム編」


目次

  1. はじめに
  2. フォーム機能とは
  3. 今回の実装のゴールについて
  4. ファイルをコピーしましょう
  5. フォームID の確認しメール送信先を設定しましょう
  6. フォームに項目を追加するファイルを探してみる
  7. フォームにチェックボックス「サンプル」を追加する
  8. 確認画面に入力した「サンプル」を表示
  9. メールに「サンプル」を表示
  10. 必須入力の項目を設定するには
  11. チェックのタイミングについて
  12. 最後に

はじめに

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

このコンテンツについては

を完了した後にご覧ください。

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

フォーム機能とは

ウェブサイトの閲覧者が入力した情報を、サイト管理者にメールで送信することができます。機能としては、以下のようなものがあげられます。

  • サイトのどこのページにでも設置が可能
  • フォームの入力内容はサイト管理者とフォーム登録者にメールを送信
  • 入力項目のチェック機能(必須入力やメールアドレスが一致しているか、数字判定など)
  • 入力項目のコンバート機能(大文字を小文字に変換や、ひらがなをカタカナなど)
  • 複数ステップのフォームを作る事ができる
  • フォームの送信内容を蓄積してCSVのダウンロードする
  • webhook 機能で外部サーバーへのデータ送信

フォームもモジュールの1つではありますが、他のモジュールと違いモジュールIDを設定することができず、フォーム管理の管理画面でフォームID毎に送信先やメールのテンプレートを管理しています。

<!-- BEGIN_MODULE Form -->

<!-- BEGIN step-->
<!-- 新規 -->
<!--#include file="/include/form/input.html"-->
<!-- END step -->

<!-- BEGIN step#reapply -->
<!-- 修正 -->
<!--#include file="/include/form/update.html"-->
<!-- END step#reapply -->

<!-- BEGIN step#confirm -->
<!-- 確認 -->
<!--#include file="/include/form/confirm.html"-->
<!-- END step#confirm -->

<!-- BEGIN step#result -->
<!-- 完了 -->
<!--#include file="/include/form/result.html"-->
<!-- END step#result -->

<!-- END_MODULE Form -->

今回の実装のゴールについて

初めてフォームを何もないところから作るのは大変なので、今回は既存の beginnerテーマ の contact フォルダから必要なファイルをコピーしつつ、フォームの項目を追加する方法を学ぶことをゴールとしたいと思います。



beginnerテーマと siteテーマどちらも contactフォルダがありますが、beginnerテーマでは POST時にサーバー側で入力チェックを行うような実装となっており、siteテーマでは 項目の入力毎にブラウザの JavaScript で行う実装 となっております。

ファイルをコピーしましょう

beginnerテーマの contact フォルダを今回のテーマの中にコピーしてください。



もちろん、そのままの HTML では表示できません。 index.html で必要な部分は

@include("/contact/form/main.html")

の部分のみで、それ以外は今まで利用してきていた元の index.html を利用した方がいいでしょう。 <main> 〜 </main> のあたりに記述します。

<main class="acms-col-md-9 main">
  <section class="module-section">
    <div class="module-header clearfix">
      <h2 class="module-heading">お問い合わせ</h2>
    </div>
    @include("/contact/form/main.html")
  </section>
</main>

これで http://localhost/contact/ にアクセスするとフォームが表示されます。

フォームID の確認しメール送信先を設定しましょう

フォームモジュールはモジュールID の設定ではなく、独自のフォームID の設定を専用の管理画面「フォーム管理」から行います。 今回、beginnerテーマ でインストールを行なっていることから contactForm というフォームID が設定済みです。



(変更)ボタンより、設定を確認します。基本設定 / 入力チェック・変換 / 一般メール設定 / 管理者メール設定 と設定項目があります。

まずは動かしてみるというとことで info@example.com と設定されている 2つの項目にご自身のメールアドレスを設定してみましょう。



項目は beginnerテーマのままですが、まずはメールが届くようになったのではないかと思います。 http://localhost/contact/ で試してみましょう。

もし、届かないようであれば、利用しているサーバーの sendmail が利用できない状況ですので、外部の SMTPサーバーを利用してメールを送る設定を行います。 コンフィグ / メール設定 / SMTPサーバー を設定ください。



フォームに項目を追加するファイルを探してみる

a-blog cms の標準テーマのファイルは再利用を考え、HTMLファイルをパーツ単位に分けて作っています。どのファイルを修正したらいいのか迷うような時には、ブラウザの機能で「ページのソースを表示」を行なってみてください。



今回は、フォーム部分を修正するのですから「お問い合わせ情報」の文字列を探してみると

<!-- Start of include : source=themes/sample/contact/form/input.html -->

  *今回修正すべきファイル*

<!-- End of include : source=themes/sample/contact/form/input.html -->

contact/form/input.html にフォームの HTMLタグ が書かれていることを確認できます。

フォームにチェックボックス「サンプル」を追加する

a-blog cms のフォームはカスタムフィールドメーカーで作成します。 これだけ知っていれば、フォームの項目の追加に困ることはありません。



今回は「サンプル」という項目でチェックボックスを追加してみることにします。HTML や CSS のことは今回は無視して動くところだけを確認していきます。

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>サンプル</th>
    <td>
      <div class="acms-admin-form-checkbox">
        <input type="checkbox" name="sample[]" value="AAA" {sample:checked#AAA} id="input-checkbox-sample-AAA" />
        <label for="input-checkbox-sample-AAA">
          <i class="acms-admin-ico-checkbox"></i>AAA</label>
      </div>
      <div class="acms-admin-form-checkbox">
        <input type="checkbox" name="sample[]" value="BBB" {sample:checked#BBB} id="input-checkbox-sample-BBB" />
        <label for="input-checkbox-sample-BBB">
          <i class="acms-admin-ico-checkbox"></i>BBB</label>
      </div>
      <div class="acms-admin-form-checkbox">
        <input type="checkbox" name="sample[]" value="CCC" {sample:checked#CCC} id="input-checkbox-sample-CCC" />
        <label for="input-checkbox-sample-CCC">
          <i class="acms-admin-ico-checkbox"></i>CCC</label>
      </div>
      <input type="hidden" name="field[]" value="sample" />
    </td>
  </tr>
</table>

カスタムフィールドメーカーで生成された HTML をそのまま「お客様情報」の見出しの上あたりに貼り付けます。



これでチェックボックスが追加できたことになります。1行のテキストや、複数行のテキスト、ラジオボタンやファイルなども同様に追加ができます。

確認画面に入力した「サンプル」を表示

次に、追加した「サンプル」のチェックを表示させます。カスタムフィールドメーカーの「出力用ソース」を contact/form/confirm.html に貼り付けます。

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>サンプル</th>
    <td>
      <!-- BEGIN sample:loop -->
      <!-- BEGIN sample:glue -->,
      <!-- END sample:glue -->
      <!-- BEGIN_IF [{sample}/eq/AAA] -->
      AAA
      <!-- END_IF -->
      <!-- BEGIN_IF [{sample}/eq/BBB] -->
      BBB
      <!-- END_IF -->
      <!-- BEGIN_IF [{sample}/eq/CCC] -->
      CCC
      <!-- END_IF -->
      <!-- END sample:loop -->
    </td>
  </tr>
</table>

この記述は ラベル と value が違う場合にラベルを表示させるための表示ですが、もしラベルと value が今回のように同じであれば、もう少し簡略化して記述することも可能になります。

<table class="acms-admin-table-admin-edit">
  <tr>
    <th>サンプル</th>
    <td>
      <!-- BEGIN sample:loop -->
      <!-- BEGIN sample:glue -->,
      <!-- END sample:glue -->
      {sample}
      <!-- END sample:loop -->
    </td>
  </tr>
</table>

スタイルは無視していますので、少しおかしな感じではありますが、3つにチェックをつける事で AAA , BBB , CCC のようなカンマ区切りの情報が表示されるようになります。

:loop のブロックの中にある :glueブロックは初回のループの時だけ表示しないという仕様です。これにより AAA の前にはカンマが表示されないようになっています。



メールに「サンプル」を表示

最後に送信するメールにも「サンプル」を追加してみます。

フォームに情報を入力した人に送る body.txt と、管理者宛に送る adminbody.txt に追記します。 HTML のテンプレートであれば改行は無効になっていますが、テキストメールの場合には改行がそのまま反映されますので、改行しないで記述しています。

■お問い合わせ情報

ご用件    : {description}
お問い合わせ内容:
{inquiry}

サンプル   : <!-- BEGIN sample:loop --><!-- BEGIN sample:glue --> , <!-- END sample:glue --> {sample} <!-- END sample:loop -->

ここまで実装できれば、フォームの基本的な実装は完了になります。

必須入力の項目を設定するには

カスタムフィールドメーカーでフォームを作る部分については説明が終わっていますが、今回は入力チェックについて説明します。



オプション のリンク部分をクリックすると「テキストの変換」と「入力チェック」の設定が表示されます。



入力チェック

バリデータを選択 からチェックしたい項目を選択し、メッセージ部分にはエラーの時の文章を設定します。 必須入力の際には値の欄は空になりますが、数値をチェックするような時には値の欄に数値を設定します。

テキストの変換

住所の番地などを全角で送って欲しい時などに、半角を全角に変換する設定をしたり、振り仮名を「カタカナ」や「ひらがな」どちらかに統一するような時に利用します。

チェックのタイミングについて

フォーム入力チェック機能については、以下の 2種類の方法が用意されております。

  1. (送信内容の確認へ)ボタンをクリックした際にサーバー側でチェック
  2. フォームの項目入力毎に JavaScript でチェック

beginnerテーマでは 1. で実装されており、カスタムフィールドメーカーも通常は 1. のコードを出力します。

また、siteテーマでは 2. で実装されており、以下の JavaScriptによるバリデーとを使用する のチェックボックスをクリックするとカスタムフィールドメーカーで生成されたコードも変わりますので、そのコードをご活用ください。



最後に

今回は、フォームの実装について紹介しました。

  • フォーム機能の基本
  • フォーム管理 (フォームID)
  • フォームはカスタムフィールドメーカーで作る
  • 確認画面やメール本文のカスタマイズ
  • 必須入力を設定する
  • チェックのタイミングについて

この他にも、フォームについては多くのドキュメントが「フォーム」に用意されていますので合わせてご覧ください。

Twitterで「フォーム編」完了をシェアする

CMSバージョンアップ後、入力したHTMLがそのまま出力されてしまう

Ver.2.11から、セキュリティ対策としてXSS(クロスサイトスクリプティング)を防止するため校正オプションを指定していた時もエスケープ処理が自動で行われるようになりました。これにより、一部のカスタムフィールドやユニットなどでHTMLタグがそのまま出力されてしまう可能性があります。

詳しくはこちらをご覧ください。 https://developer.a-blogcms.jp/blog/raw211escape.html