静的HTMLサイトからCMSのテーマを作ってみよう 3「モジュール編」


はじめに

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

このページは 静的HTMLサイトからCMSのテーマを作ってみよう 2「カスタムフィールド編」 の続きになります。

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

タイトルタグを動的に変更する

現在、<head> 内の <title> 〜 </title> について初期状態のままですので、この部分も自動で編集されるように実装を進めます。

> エントリータイトル | カテゴリー名 | ブログ名

タイトルタグについては、OGPモジュールというモジュールが用意されておりますので、タイトルタグに加え、<meta>部分もこれで対応が可能です。

<!-- BEGIN_MODULE Ogp -->
<title>{title}</title>
<meta property="og:url" content="%{PERMALINK}">
<meta property="og:site_name" content="%{ROOT_BLOG_NAME}">
<meta property="og:title" content="{title}">
<meta property="og:type" content="{type}">
<!-- BEGIN_IF [{description}[delnl]/nem/] -->
<meta property="og:description" content="{description}[mb_trim(350, '...')|delnl|escape]"><!-- END_IF --><!-- BEGIN_IF [{image}/nem/] -->
<!-- BEGIN_IF [{image@type}/eq/media] -->
<meta property="og:image" content="http://localhost/media/{image}">
<meta property="og:image:secure_url" content="http://localhost/media/{image}" />
<!-- ELSE -->
<meta property="og:image" content="http://localhost/archives/{image}">
<meta property="og:image:secure_url" content="http://localhost/archives/{image}" />
<!-- END_IF -->
<meta property="og:image:width" content="{image@x}" />
<meta property="og:image:height" content="{image@y}" /><!-- END_IF --><!-- BEGIN_IF [{description}[delnl]/nem/] -->
<meta name="description" content="{description}[mb_trim(350, '...')|delnl|escape]"><!-- END_IF --><!-- BEGIN_IF [{keywords}/nem/] -->
<meta name="keywords" content="{keywords}"><!-- END_IF -->
<!-- END_MODULE Ogp -->

このスニペットでもいいのですが、beginnerテーマの中に用意されている /themes/beginner/include/head/meta.html を利用した方が Twitterカードについても対応されているのでオススメかもしれません。

sampleフォルダーに includeフォルダーを作成し、その中に headフォルダーを作り、meta.html ファイルをコピーしてきます。

index.html , list.html , entry.html の <title> <meta> を削除して

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

に置き換えます。このインクルード機能について説明ができていませんので、次でしっかり説明をします。

インクルード機能でファイルをまとめる

テンプレートの HTML の中で、別の HTML を読み込む機能をインクルード機能と呼びます。

一般的に、ヘッダー部分やフッター部分については、どのページでも同様なことが多いので、 header.htmlfooter.html のようなファイルを用意し各ファイルからインクルードします。 フォルダー名の決まりはありませんが、include にまとめるのが a-blog cms の一般的なルールになっています。

@include("/include/header.html")
	
@include("/include/footer.html")

さらに、インストール時に最初から用意されている beginnerテーマを参考に紹介しておきますが、基本はモジュール単位でファイル分けインクルードするようにしています。

<!DOCTYPE html>
<html class="no-js" lang="ja">
<head>
  @include("/include/head/meta.html")
  @include("/include/head/link.html")
  @include("/include/head/js.html")
</head>
<body>
<!-- ヘッダー -->
@include("/include/header.html")
<div class="acms-container js-pretty-scroll-container">
  <!-- ※管理用パーツ -->
  @include("/admin/action.html")
  @include("/include/header/top-image.html")
  <div class="acms-grid">
    <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>
    <div class="acms-col-lg-3 side">
      <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>
    </div>
  </div>
</div>
<!-- お問い合わせ -->
@include("/include/footer/suggest.html")
<!-- フッター -->
@include("/include/footer.html")
</body>
</html>

グローバルナビゲーションの実装

ナビゲーションは index.html , list.html , entry.html どのページにもあります。この段階では、インクルード機能でしっかりファイル分けができているようであれば、1つのファイルのみ修正すればいい事になっています。

<div class="header-nav">
  <div class="acms-grid">
    <nav class="navbar">
      <ul>
        <li><a href="index.html">ホーム</a></li>
        <li class="stay"><a href="list.html">一覧</a></li>
        <li><a href="entry.html">詳細</a></li>
      </ul>
    </nav>
  </div>
</div>

<div class="header-nav"> の辺りを Navigation に置き換えていきます。 Navigation モジュールは、<ul><li> で書かれていますが、入れ子構造にできる仕様になっており、それを1つの <!-- BEGIN navigation:loop --> 〜 <!-- END navigation:loop --> で作られているので制御用のブロックが多く分かりにくいです。

<!-- BEGIN_MODULE Navigation -->
<div>
  @include("/admin/module/setting.html")
  <div class="acms-navbar acms-margin-bottom-medium clearfix">
  <!-- BEGIN navigation:loop -->
    <!-- BEGIN ul#front --><ul><!-- END ul#front -->
      <!-- BEGIN li#front --><li {attr} class="c_{level}" ><!-- END li#front -->
        <!-- BEGIN link#front --><a href="{url}" {attr} target="{target}"><!-- END link#front -->
        <!-- BEGIN label:veil -->{label}[raw]<!-- END label:veil -->
        <!-- BEGIN link#rear --></a><!-- END link#rear -->
      <!-- BEGIN li#rear --></li><!-- END li#rear -->
    <!-- BEGIN ul#rear --></ul><!-- END ul#rear -->
  <!-- END navigation:loop -->
  </div>
</div>
<!-- END_MODULE Navigation -->

<nav class="navbar"> の中にある <ul> 〜 </ul> を <!-- BEGIN navigation:loop --> 〜 <!-- END navigation:loop --> に置き換えるような感じで実装を進めてください。

最終的には、以下のようになります。もちろんモジュールIDの設定 id="nav_global" も忘れずに行ってください。

<!-- BEGIN_MODULE Navigation id="nav_global" -->
<div class="header-nav">
  <div class="acms-grid">
    <nav class="navbar">
  <!-- BEGIN navigation:loop -->
    <!-- BEGIN ul#front --><ul><!-- END ul#front -->
    <!-- BEGIN li#front --><li {attr} class="c_{level}" ><!-- END li#front -->
      <!-- BEGIN link#front --><a href="{url}" {attr} target="{target}"><!-- END link#front -->
      <!-- BEGIN label:veil -->{label}[raw]<!-- END label:veil -->
      <!-- BEGIN link#rear --></a><!-- END link#rear -->
    <!-- BEGIN li#rear --></li><!-- END li#rear -->
    <!-- BEGIN ul#rear --></ul><!-- END ul#rear -->
  <!-- END navigation:loop -->
    </nav>
  </div>
</div>
<!-- END_MODULE Navigation -->

モジュールIDの条件設定しか行っていない人は、何も表示されずに焦った人もいることでしょう。表示設定側を以下のように行ってください。



画像だとコピぺできないので、表にも書いておきます。

ラベルURL属性
HOME%{HOME_URL}class="js-link_match_location-full"
会社概要%{HOME_URL}company/class="js-link_match_location"
物件情報%{HOME_URL}realestate/class="js-link_match_location"
お知らせ%{HOME_URL}news/class="js-link_match_location"
採用情報%{HOME_URL}recruit/class="js-link_match_location"
お問い合せ%{HOME_URL}contact/class="js-link_match_location"

class="js-link_match_location" について解説しておきます。

この class をつけておくと、そのディレクトリーを表示している時に class="stay" を JavaScript でつけてくれます。例えば、/news/ の時と /news/entry-11.html どちらでも今は「お知らせ」にいますを伝えるためです。

HOME だけは、少し違って class="js-link_match_location-full" と設定されているので完全一致している時という指定になります。

属性は <li> に設定したい class などを、子要素属性には <a> に追記したい class などを設定できるようになっています。



トップページのスライダーの画像を変更できるように実装

top.html のスライダー部分を探してみます。

<div class="module-section">
  <div class="js-slider">
    <div>
      <a href="list.html" target="_self" class="slider-item"><img src="/images/slider_zoo1.jpg" width="1150" height="400" alt="" class="acms-img-responsive slider-image" /></a>
    </div>
    <div>
      <a href="list.html" target="_self" class="slider-item"><img src="/images/slider_zoo2.jpg" width="1150" height="400" alt="" class="acms-img-responsive slider-image" /></a>
    </div>
    <div>
      <a href="list.html" target="_self" class="slider-item"><img src="/images/slider_zoo3.jpg" width="1150" height="400" alt="" class="acms-img-responsive slider-image" /></a>
    </div>
  </div>
</div>

スライダーは JavaScript で実装されており、上記のような HTML になっています。 class のついていない <div> 部分が3つ同じ構造になっているのが確認できます。

メディアバナーモジュールを利用して実装していきます。バナーというとサブカラムにある a-blog cms のロゴみたいなものを想像しますが、複数件の画像とリンクを管理できればどのようなモジュールでも大丈夫ではありますが、Media_Banner モジュールを利用するとバナーの表示期間の設定も活用できるので便利に使えるのではないでしょうか。

<!-- BEGIN_MODULE Media_Banner -->
<div>
@include("/admin/module/setting.html")
<ul class="acms-list-nostyle acms-grid">
  <!-- BEGIN banner:loop -->
  <li class="acms-col-md-4">
    <!-- BEGIN banner#src -->
    {src}[raw]
    <!-- END banner#src -->
    <!-- BEGIN banner#img -->
    <a href="{url}" target="{target}"><img src="%{MEDIA_ARCHIVES_DIR}{img}" width="{x}" height="{y}" class="acms-img-responsive" alt="{alt}" /></a>
    <!-- END banner#img -->
  </li>
  <!-- END banner:loop -->
</ul>
</div>
<!-- END_MODULE Media_Banner -->

元の HTML を挟むように <!-- BEGIN_MODULE Media_Banner --> 〜 <!-- END_MODULE Media_Banner --> を追記し、モジュールID id="top_image" を設定します。

<!-- BEGIN_MODULE Media_Banner id="top_image" -->
<div class="module-section">
  <div class="js-slider">
    <!-- <div>
      <a href="list.html" target="_self" class="slider-item"><img src="/images/slider_zoo1.jpg" width="1150" height="400" alt="" class="acms-img-responsive slider-image" /></a>
    </div> -->
    <!-- BEGIN banner:loop -->
    <!-- BEGIN banner#img -->
    <div>
      <a href="{url}" target="_self" class="slider-item"><img src="%{MEDIA_ARCHIVES_DIR}{img}" width="{x}" height="{y}" alt="{alt}" class="acms-img-responsive slider-image" /></a>
    </div>
    <!-- END banner#img -->
    <!-- END banner:loop -->
  </div>
</div>
<!-- END_MODULE Media_Banner -->

3つのループのうちの1つをコメントタグで囲み残しておき、2つ目の<div>をスニペットを参考に{変数}に置き換えていきます。3つ目の<div>は削除しました。

トピックパスを実装

トピックパス(パンくずリスト) は index.html には用意していませんが list.html , entry.html に用意されています。

<nav class="topicpath">
 <ol class="topicpath-list acms-container sp-container clearfix">
  <li class="topicpath-item"><a href="index.html" class="topicpath-link">HOME</a></li>
  <li class="topicpath-item"><a href="list.html" class="topicpath-link">カテゴリー名</a></li>
 </ol>
</nav>
<nav class="topicpath">
 <ol class="topicpath-list acms-container sp-container clearfix">
  <li class="topicpath-item"><a href="index.html" class="topicpath-link">HOME</a></li>
  <li class="topicpath-item"><a href="list.html" class="topicpath-link">カテゴリー名</a></li>
  <li class="topicpath-item"><a href="entry.html" class="topicpath-link">エントリー名</a></li>
 </ol>
</nav>

この部分を、どちらも @include("/include/topicpath.html") として、topicpath.html を用意します。

<!-- BEGIN_MODULE Topicpath -->
<ol class="acms-topicpath acms-margin-bottom-mini clearfix">
 <!-- BEGIN blog:loop -->
 <li><a href="{url}">{name}</a></li><!-- END blog:loop --><!-- BEGIN category:loop -->
 <li><a href="{url}">{name}</a></li><!-- END category:loop --><!-- BEGIN entry -->
 <li><a href="{url}">{title}</a></li><!-- END entry -->
</ol>
<!-- END_MODULE Topicpath -->

Topicpathスニペットtopicpath.html にコピペして

Topicpathモジュールの条件設定

トピックパスモジュールでは、条件設定タブの引数についてカテゴリーとエントリーにチェックをつけるのを忘れないようにしてください。



また、モジュールID を設定すると階層の指定が可能になります。 例えば「お知らせ」カテゴリーの子カテゴリーに「テスト」というカテゴリーを作った時に「下階層のカテゴリーも含める」を選択するようにしてください。

階層設定では

  • 下階層を含めない
  • 下階層も含める
  • 下階層のみを対象とする

の3種類でデータの絞り込み範囲を設定ができます。

Topicpathモジュールのみ、階層の範囲が下階層ではなく上階層になっています。

Topicpathモジュールの表示設定

表示設定タブでは、何も指定しないとトピックパスにブログ名が最初に表示されますので、HOME や TOP などの表記にしておきます。



トピックパスモジュールを利用すると、ブログ > 子ブログ > カテゴリー > 子カテゴリー > エントリー のように階層が自動的に作られ、リンクの設定もされます。



サイト内検索機能を実装する

各ページのサブカラムに用意されている検索フォームが機能するように実装していきます。

<div class="module-section">
  <section class="search">
    <div class="module-header clearfix">
      <h2 class="module-heading">検索</h2>
    </div>
    <form action="" method="post" name="searchForm" class="acms-form search-form" role="search">
      <div class="acms-form-action">
        <input type="search" id="searchForm" name="keyword" value="" size="15" class="search-form-input">
        <span class="acms-form-side-btn"><button type="submit" name="submit" class="acms-btn btn-search"><span class="acms-icon-search"></span><span class="acms-hide-visually">検索</span></button></span>
      </div>
    </form>
  </section>
</div>

この部分を少し書き換えます。

<div class="module-section">
  <section class="search">
    <div class="module-header clearfix">
      <h2 class="module-heading">検索</h2>
    </div>
    <form action="" method="post" name="searchForm" class="acms-form search-form" role="search">
      <div class="acms-form-action">
        <input type="search" id="searchForm" name="keyword" value="%{KEYWORD}" size="15" class="search-form-input">
        <input type="hidden" name="query" value="keyword">
        <span class="acms-form-side-btn"><button type="submit" name="ACMS_POST_2GET" class="acms-btn btn-search"><span class="acms-icon-search"></span><span class="acms-hide-visually">検索</span></button></span>
        <input type="hidden" name="tpl" value="/entry.html">
        <input type="hidden" name="bid" value="1">
      </div>
    </form>
  </section>
</div>

ポイントは以下の4点です。

  1. 既存のコードの input タグ内 value の空欄にvalue="%{KEYWORD}"を追加
  2. 既存のコードの button タグ内name="submit" をname="ACMS_POST_2GET"に書き換え
  3. input type="hidden" name="tpl" でPOST後のテンプレートファイルを指定
  4. type="hidden" name="bid" value="1" で検索範囲を指定(1:全部)

グローバル変数の %{KEYWORD} は、検索ワードを表示させる変数になります。

テンプレートのファイル名を変更し、テーマ設定ファイルを作る

静的なHTMLファイルだけで構成されていたウェブサイトが、a-blog cms を利用してブラウザからコンテンツの追加や更新が可能なサイトに生まれ変わりました。今回作ったテーマ sample をテーマ設定でテーマ名を選択するだけで動作するように設定ファイルを作ることと、ファイル名を標準的なものに変更します。

種類旧ファイル名新ファイル名
トップindex.html_top.html
一覧list.htmlindex.html
詳細entry.html_entry.html

ファイル名の先頭にあるアンダーバーについて少し説明しておくと、アンダーバー付きのファイルはブラウザから見えなくなります。

http://localhost/http://localhost/top.html どちらでもページが出てしまわないように http://localhost/_top.html とすることで _top.html のリンク先は 404 not found になることが確認できます。

/themes/sample/template.yaml を最後に用意します。 上記のファイル名の変更で /themes/beginner/template.yaml からコピーしても同様ですが、以下をコピペしても大丈夫です。

tpl_top         : _top.html
tpl_index       : index.html
tpl_detail      : _entry.html
tpl_404         : 404.html
tpl_admin       : admin.html
tpl_entry_edit  : _entry.html
tpl_entry_add   : _entry.html
tpl_login       : login.html

最後に

今回は、いろいろなモジュールを中心に紹介しました。

  • OGPモジュール
  • インクルード処理
  • Navigationモジュール
  • Media_Bannerモジュール
  • Topicpathモジュール
  • サイト内検索機能
  • テーマファイルを作る

について紹介しました。

これで小規模なサイトのテーマ作成における大まかな一連の作業が終了しました。 どこにも PHP や JavaScript の実装はなく、 HTML と管理画面の設定で CMS 化の作業が完了します。

ぜひ、次はご自身で用意したオリジナルの静的HTMLファイルをベースとしたテーマ作成にチャレンジしてみてください。



続きで学べる「子ブログ編」を追加しました。これまでに作ったサイトを階層化された複数のブログを利用する構成に改良していくものになりますので、よろしければコチラもあせて学習ください。

静的HTMLサイトからCMSのテーマを作ってみよう 4「子ブログ編」


はじめに

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

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

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

子ブログとは

a-blog cms のブログは、階層化されたブログシステムになり、親は子のブログを管理する権限を持たせる事ができ、子は親にアクセスする権限はありません。

子ブログと書くことが多いですが、子の下階層である孫ブログのように、さらに下階層や、その下にもブログを作ることは可能です。

http://localhost/ko-blog/mago-blog/cagegory/ko-cagtegory/entry.html

このように URL は表現されます。

サイトの設計側はブログなのか、カテゴリーなのか分かっていますが、サイトを閲覧している人は、どちらもディレクトリーであり、区別がつくものではありません。

カテゴリーを子ブログに変更する

まずは「お知らせ」の子ブログを作成していきます。現在 news というコードはお知らせカテゴリーで使われており、新しく作成する子ブログのコードには使用することができません。そのため、まずはお知らせのカテゴリーコード news を変更します。

管理ページより カテゴリー設定画面 にアクセスして、「news」を「news-delete」と変更してください。 エントリーを移設後は削除予定です。



次に ブログ管理の画面 より、右上にある緑色の 子ブログを作成 ボタンをクリックして、新規ブログ作成画面を表示させます。



名前を「お知らせ」とし、コードネームを「news」に設定ください。



以上でお知らせブログが作成できました。URLは http://localhost/news/ になります。 ブログ管理の画面でブログ間の移動は可能ですが、管理画面の左上にあるブログ名をクリックすると、親ブログと子ブログを切り替えることも可能です。



継承したテーマを作成&設定する

新しく作成した「お知らせ」の子ブログには、初期設定として blog テーマが設定されています。このテーマを変更して、親ブログで利用されている sample のような、お知らせブログ専用のテーマを作成し設定します。



この場合、sample と似たデザインや機能を持つテーマを作ることになり、その事を「テーマの継承」と呼びます。今回、お知らせの子ブログのテーマは、sample を継承した子テーマ news@sample という名前で用意します。

この継承機能を利用すると、 news@sample に無いファイルは sample を利用することになり、お知らせ子ブログ側のテーマのテンプレート数を減らし、メンテナンス時も1つ修正すればいいことになります。

/themes/news@sample を作成してください。



その後、お知らせブログのテーマ設定 より、テーマディレクトリ名を「news@sample」を選択し、テンプレート設定の テンプレート選択ファイル(template.yaml)の値を優先する のチェックを外します。

template.yaml が利用されないので、下部のテンプレートファイル指定が有効になりますので、以下のように設定します。 今回の子ブログ「お知らせ」では、特別なトップページを用意せず、一覧ページと同様のトップページとしますので、_top.html ではなく index.html をトップページのテンプレートとして指定しています。

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


エントリーを移行する

親ブログ内にある「お知らせ」のエントリーをまとめて子ブログ側に移動します。親ブログのエントリー管理画面から絞り込み機能を利用して、「お知らせ」エントリーを一覧表示してください。

  1. カテゴリーを選択
  2. 検索ボタンをクリック
  3. 一番上のチェックボックスをクリック
  4. チェックボックスの上のプルダウンを「ブログ」に設定
  5. 横にプルダウンが表示されるので「お知らせ」を選択
  6. 変更ボタンをクリック


以上でエントリーの移行は完了です。「お知らせ」の子ブログに移動すると、エントリーの情報が表示されているのが確認できます。

トップページに子ブログの情報を表示させる

この段階でトップページにアクセスすると、お知らせのカテゴリーを表示させる設定になっていたモジュールID の設定では表示ができなくなります。



管理ページ / モジュールID を開き、モジュールID top_headline の条件設定を開きます。



引数のカテゴリーIDの「お知らせ」を削除し、ブログの「お知らせ」を選択します。これで再度、トップページを開くと「お知らせ」の一覧が表示されるようになります。

親ブログのモジュールIDを子ブログでも利用する

ナビゲーション

お知らせの一覧や詳細ページにアクセスすると、ヘッダーやナビゲーション、フッターの情報が消えていることが確認できます。a-blog cms の情報は、上層のブログは下層のブログのデータを利用することはできますが、下層のブログ(子ブログ)は親のモジュールIDが見えません。



お知らせ」の子ブログのモジュールIDの一覧にアクセスしてみると、何もないことが確認できます。



次に、親ブログのモジュールIDの一覧にアクセス、グローバルナビゲーション id="nav_global" の条件設定を開いて、グローバル「下の階層のブログが利用することを許可する」にチェックをつけ保存します。



こうすることで、親のモジュールID は子での利用が許可され、表示されるようになります。



トピックパス

トピックパスには「お知らせ」しか表示されておらず、本来は HOME > お知らせ という表示でいて欲しいところです。グローバルナビゲーション id="nav_global と同様にグローバルのチェックだけつけても、今回は思ったように表示してくれません。

条件設定

カテゴリーの階層設定について「下層のカテゴリーも含める」という設定を以前行なっていますが、ブログも階層構造になっていますので、同様に「下層のブログも含める」設定に変更してください。



表示設定

階層設定に 1 が設定されていることから、親ブログしか表示できていません。表示できる階層数を増やすか、空にして全階層を表示させる設定にします。



これで、 ブログ名 > 子ブログ名 > エントリー名と表示できるようになりました。



試しに、子ブログ内に、カテゴリーと子カテゴリーを作成し、エントリーを用意して階層が表示されるかもテストしておいた方がいいかもしれません。



このようにブログの階層構造と、カテゴリーの階層構造を自動的にリンクを生成します。

ブログフィールドをモジュールIDを設定する

親ブログのページと比べて、残り表示ができていないのは、ヘッダーとフッターのカスタムフィールドが表示できていません。



カスタムフィールドの表示は、ブログフィールドで表示させていますが、これにモジュールIDを設定し、グローバルの設定を行います。 ここで大事なのは、ブログID に親ブログを設定しておくことです。



<!-- BEGIN_MODULE Blog_Field id="global" -->
<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 -->

フッターにあるブログフィールドモジュールにも同様に id="global" を設定します。

シークレットブログについて

ブログのステータスとして、公開(利用する)・非公開(利用を停止する)以外に、シークレットという設定が存在します。この設定にすることでログインしていないと閲覧できない会員制コンテンツを作ることができます。



会員は、シークレットブログ上に作成し、権限を読者に設定することでエントリーを作ることはできない閲覧専用のユーザーとして運用が可能です。また、読者ユーザーはライセンスのユーザー数に含まれず、読者登録の機能も標準で用意されています。設定は、コンフィグのログイン設定をご覧ください。



グローバルカテゴリーについて

今回は「お知らせ」の子ブログということで、設定しませんでしたが、例えば多店舗展開のウェブサイトを作る際には、店舗ブログ毎にカテゴリーを作るのではなく、親ブログ側のカテゴリーをモジュールIDのようにグローバル化することが可能です。



これで、親ブログ側で各店舗の特定のカテゴリーの新着を簡単に表示するモジュールIDを作ることができるようになります。

コンフィグセットについて

コンフィグの管理画面にアクセスすると、毎回「このブログの初期コンフィグ」を選択していましたが、このコンフィグは増やしたり、再利用が可能になっています。



(コンフィグセットの作成)で、名前をつけたコンフィグセットを作ることができ、これもグローバル化することで、子ブログでコンフィグを共有できるようになります。



子ブログ「お知らせ」のブログ管理の画面で選択できるようになりました。あまり「お知らせ」では使うことはないかもしれませんが、多店舗ブログのような店舗ブログを作るたびに各設定を細かくすることなく、このコンフィグセットを選択するだけで他の店舗と同じ設定にすることができます。



さらに、カテゴリーにもコンフィグセットの設定は存在しています。 こちらも、うまく活用すると便利なこともあります。



最後に

今回は、ブログの階層化をメインに、他のブログで設定を再利用するグローバル化について紹介しました。これで、カテゴリーであった「お知らせ」を、子ブログで管理できるようにし、子ブログ用の子テーマ news@sample の実装が完了したことになります。



4回に分けて解説した「a-blog cms を利用して静的HTMLサイトからCMSのテーマを作ってみよう」 を実践することで、ご自身のデザインしたウェブサイトを a-blog cms化する方法をマスターすることができたでしょうか。

各バージョンのアップデート変更点まとめ

システムのバージョンアップをする際に、利用しているバージョンから最新版までアップデートする際に、テンプレートや config の設定がどう変わっているのかを時系列で紹介しています。

Ver. 3.1.17 - 2024/06/10

  • Ajaxによる部分テンプレートアクセスにCSRFトークンによる認証を追加し、許可するtpl指定(allow_tpl_path)を個別指定しなくてもいいように改修 & Ajaxリクエストのセキュリティレベルオプションを用意(ajax_security_level)

ポストインクルードや htmx など、Ajax による部分テンプレートへのアクセス時に、許可するtplを private/config.system.yaml で指定(allow_tpl_path)する必要がなくなりました。 また、ポストインクルードや htmx など、Ajax によるテンプレート取得用のPOSTモジュールとして、ACMS_POST_2GET_Ajax が追加されました。

詳しくはブログ記事をご確認ください。

Ver. 3.1.14 - 2024/04/23

  • PHP8.2, 8.3対応

Ver. 3.1.12, 3.0.32 - 2024/04/08

  • 【セキュリティ対応】Webhook機能のSSRF対応 「JVN#24538269」
  • 【セキュリティ対応 & 仕様変更】Webhook機能のコードインジェクション対応 「JVN#36191600」

Webhook 機能のSSRF対策としてリクエスト先URLが「.env」で許可したホストのみ許可するように変更されました。またログ閲覧で機能でレスポンスの内容を表示するために「.env」の設定が必要になりました。 Webhook機能のコードインジェクション対策として、ペイロードのカスタマイズで利用するテンプレートエンジンがTwigに変更されました。

詳しくはブログ記事を御覧ください。

Ver. 3.1.7 - 2024/01/19

アップデートの際には off になっていますが、private/config.system.yaml を最新のファイルと置き換えると on になり、管理画面で編集の際にタグが消えてしまう恐れがありますので紹介しておきます。同様の修正が 3.0.29 以降、2.11.58 以降、2.10.50 以降も同様に行われています。

Ver. 3.1.0 - 2023/09/14

ログインテンプレートの仕様が変更

themes/ご利用テーマ/login.html を設置してログイン画面や会員サイトのログイン画面をカスタマイズしている場合、Ver. 3.1 にアップデートするとログインできなくなる可能性があります。

Ver. 3.1 では会員機能の強化のため、ログイン周りのテンプレートの改修、管理者と一般会員でログインページを別にする修正がはいっているので、ログイン画面のテンプレートが新しくなっております。ログイン画面をカスタマイズしている場合や、会員サイトの場合は、テンプレートの修正が必要になりますので、慎重にアップデートください。

SNSログイン・SNS会員登録、Google Map以外の外部サービス連携機能を廃止

SNSログイン・SNS会員登録、Google Map以外の外部サービス連携機能が廃止になりました。廃止になった機能は以下になります。

  • Google Analyticsランキング(Api_GoogleAnalytics_Ranking)拡張アプリに移行
  • Twitterホームタイムライン(Api_Twitter_Statuses_HomeTimeline)
  • Twitterユーザータイムライン(Api_Twitter_Statuses_UserTimeline)
  • Twitterサーチ(Api_Twitter_Search)
  • Twitterリストタイムライン(Api_Twitter_List_Statuses)
  • Twitterリストメンバーズ(Api_Twitter_List_Members)
  • Bingウェブ検索(Api_Bing_WebSearch)
  • Bingイメージ検索(Api_Bing_ImageSearch)

Ver. 3.0.12 - 2022/06/17

  • 8.1.x 対応

Ver. 3.0.10

  • CMS-5891 各システムメールをHTMLメールに対応

コンフィグ > メール設定 の本文テンプレートの項目でプレーンテキストとHTML形式のどちらもテンプレートのパスを設定している場合は、HTML形式が優先される仕様になっております。さらにHTML形式の本文テンプレートの設定はconfig.system.default.yaml に記載されており、CMSをアップデートした際に自動的にコンフィグに保存されます。アップデート前に、プレーンテキスト形式のメールテンプレートをカスタマイズして利用していた場合、バージョンアップした際にHTML形式のメールが送信されてしまうといった問題が発生する可能性があります。

対策として、バージョンアップ後はコンフィグ > メール設定 の本文テンプレートの項目で HTMLメールの設定を空にして保存し直す必要があります。

Ver. 3.0.0 - 2021/12/24

Ver. 2.11.29 - 2021/03/03

  • jQuery のバージョンが 3.5.1 に変更しています。

Ver. 2.11.25 - 2020/11/24

Ver. 2.11.15 - 2020/07/13

  • PHP 7.4 対応

Ver. 2.11.5 - 2020/02/05

  • メディアダウンロードリンクが /media-download/xxx/ から /media-download/xxx/hash値/ のように変更になりました。テンプレートは関係ありませんが、テキストリンクで手動で /media-download/xxx/ へのリンクを書いているような時には注意が必要です。

    config.system.yaml の設定

    media_download_link: v1 # v1: media-download/xxx/ v2: media-download/xxx/hash値/
    ※ この設定で元の仕様に戻すことが可能です。

Ver. 2.11.0 - 2019/12/17

  • ライセンスのアップデートが有償になりました。
  • カスタマイズの際に、脆弱性を作り込んでしまう問題を減らすために、校正オプションの仕様変更しています。文章中のタグがそのまま表示されてしまう可能性があります。

    参考記事 - Ver.2.11 から校正オプションの仕様が変更になります

  • 読者登録・パスワードリセット時に、パスワードを自分で指定できるように変更

    読者登録・パスワードリセット時に、パスワードを自身で指定できるようになりました。以前はパスワード再発行メールにシステム側で発行した新しいパスワードを記載しておりましたが、再発行時にユーザーが任意のパスワードを指定する仕様へ変更になりました。そのため、パスワードリセット用のテンプレートを追加する必要があります。また、パスワード再発行メールで使用できる {resetPass} 変数は削除されました。

    パスワードリセット用のテンプレートは system テーマ内、 /_layouts/login.html の <!-- BEGIN reset --> から <!-- END reset --> までを参考にしてください。

Ver. 2.10.8 - 2019/04/15

  • PHP 7.3 対応

Ver. 2.10.0 - 2019/02/28

Ver. 2.8.0 - 2018/03/26

  • PHP 7.2 対応

Ver. 2.7.0 - 2017/03/30

Ver. 2.5.0 - 2015/04/23

  • a-blog cms で読み込みが必須の JavaScript のファイル名が index.js から acms.js に変更されました。
  • acms.css から管理系の CSS を別にして利用できるようにした acms-admin.css が必須になりました。
  • acms.js の前に jQuery の読み込みが必須になり、jQuery が同期的に読まれるように対策が必要になりました。

    参考記事 - Ver.2.5以上 へのアップデート

Ver. 2.0.0 - 2013/12/18

  • config.system.yaml が config.system.default.yaml と config.system.yaml に分かれました。 1.x で利用していた config.system.yaml を利用することで、2.0 以前の設定を引き継ぎます。
  • file_icon の場所が images/fileicon から themes/system/images/fileicon に変更になりました。
  • Entry_Body の中でインクルードされている /include/column.html が /include/unit.html に変更になりました。
  • Column_List モジュールの名前が Unit_List に変更になりました。

    参考記事 - Ver. 1.7 から 2.0 のアップデート

UTSUWAテーマの使い方

UTSUWA は写真やコンテンツを入力すればそのまま企業サイトとして成り立つ構成を備えた、実用的でモダンなテーマです。また、CSS変数でカラーを変更するだけで手軽にサイト全体の雰囲気を変えることができます。こうした特長から、Web の初学者の方、a-blog cms の初心者の方にとっても即戦力となるテーマなので、ぜひ広く使っていただきたいと考えています。このエントリーでは、そういった初学者、初級者の方を対象としながら、中級者、上級者の方にもご紹介したい UTSUWA テーマの豊富なユニット類についても解説していきます。

UTSUWAテーマサンプル を確認しながら読み進めてください。

CSS 変数で色を変更する

/include/head/css-variables.css で CSS 変数を変更することによって簡単にサイト全体のカラーリングを変更することができます。

主な変数

変数名初期状態で使用されている箇所
--color-primaryトップページ見出し、ボタン背景、見出し下のボーダー、ワンポイント、テキストユニット「強調」文字色など
--color-secondary「詳しく知る」やシリアルナビゲーションのリンクアイコン背景色、目次やリスト系ユニットの数字やビュレット
--color-tertiaryテキストユニット「強調」下線ドット
--color-tertiary-lightテキストユニット「重要」下線
--color-linkテキストリンク色
--color-requiredフォームの「必須」ラベル背景色
--color-errorフォームのエラーメッセージ文字色、テキストユニット「本文(注意文)」文字色
  • 同じ色を使いたい場合 CSS ファイル内では var(--color-primary)のように指定できます。
  • Sass では、/src/scss/global/_variables.scss で CSS 変数をいったん Sass の変数に渡しています。

カラー変更のコツ

  • 初期設定の色と明度があまり変わらない色を指定するとコントラストを維持できます。
  • --color-white、--color-black、--color-grayxx といった無彩色の指定をニュアンスを持った色に変更するのもお勧めです。

テンプレートが分かりやすく、コンテンツの編集も簡単

UTSUWA は全体的にワンカラムのレイアウトで、すべて /_layouts/base.html を ベースにしているのでテンプレートもシンプルで分かりやすくなっています。

たとえば /_top.html でも、パーツ毎に @include 文とコメントがあるので、不要なパーツをコメントアウトしたり、順番を入れ替えたりするのも簡単です。トップページのそれぞれのパーツのコンテンツは表示画面側からも編集、設定しやすくなっています。

エントリーコードが空のエントリーではエントリータイトルが表示されない

デモデータの企業情報、お問い合わせ、採用情報カテゴリーのようにエントリーコード(ファイル名)が空のエントリーではエントリータイトルが表示されなくなっています。カテゴリートップをエントリー扱いにする場合にはカテゴリー名とエントリータイトルを揃えておくと管理画面においても分かりやすくなります。

エントリーサマリーのスタイルの種類

UTSUWAではエントリーサマリーにさまざまなスタイルがあります。すべてのエントリーサマリーでhover時にサムネイルが拡大されます。

事業紹介(/include/module/template/Entry_Summary/thumbnail.html)


事業紹介(service)カテゴリーインデックスのエントリーサマリーはサムネイルを大きくとったスタイルです。このスタイルはモジュールユニットにおいても thumbnail.html を選択すればそのまま使用できます。

お知らせ(/include/entry/summary.html)


画像がないエントリーも多いことが想定されるお知らせ(news)カテゴリーのインデックスでは、サムネイルがあってもなくても美しくレイアウトされるように工夫されています。CSS Grid が使用されています。

スタッフブログ(/include/entry/summary-blog.html)


スタッフブログ(blog)カテゴリーのインデックスはオーソドックスなカードスタイルでPC時4カラムです。

お問い合わせ


お問い合わせ(contact)カテゴリーには「お問い合わせ」「お問い合わせ完了ページ」の2件のエントリーがあり、それぞれ赤枠で囲った箇所がエントリーのユニットとして編集可能です。

フッター上CTAについて

CTA 関連のエリアが、どのように表示されているかを見ていきます。

グローバルな フッター上 CTA

/_layouts/base.html からインクルードされているグローバルな CTA のモジュールIDは MF_cta_visual_global(主要なCTA) です。サイト内のほとんどのエントリーテンプレート、インデックステンプレートでは footer-cta セクションを上書きしていないのでこの CTA がフッター上に表示されています。


トップページの CTA

トップページでは footer-cta セクションは上書きされ、テンプレートはグローバルなものと同じですがモジュールIDは MF_cta_visual_top で設定されています。グローバルな CTA より余白のサイズがゆったりめにとられ、吹き出しがない代わりにリード文や概要文、ボタンの文言がより詳細になっています。確認してみてください。

お問い合わせ、採用情報、事業紹介エントリーの CTA

お問い合わせ(contact)カテゴリーのエントリーテンプレートでは、footer-cta セクションは上書きによって空になっています。お問い合わせフォームでは実際の案件でもこのようにユーザーが入力に集中できるようになっていることが多いでしょう。

採用情報事業紹介エントリーの CTA は上書きされて、グローバルな CTA ではなく、 /include/parts/cta.html をインクルードしてエントリーフィールドやカテゴリーフィールドを表示しています。

独自に書き換えられているテキストユニットについて

UTSUWA テーマでは、ユニットの表示側のテンプレートが /include/unit.html で独自に書き換えられています。ここでは特に使用頻度が高く、影響が大きいテキストユニットの書き換えについて解説します。

テキストユニットは全て

 <div class="entry-text-unit is-xx"></div>

で囲われます。

  • div で囲うことによって不要な回り込みを防いでいます。
  • .entry-text-unit クラス内の要素にスタイルを適用することによって、エントリー内のテキストユニット以外のカスタムユニットなどの要素にスタイルがあたってしまうことを防いでいます。
  • .is-xx の部分には .is-p などテキストタグセレクトの内容が入り、 /src/scss/_entry.scss においてスタイルの調整に使用されています。

カスタムユニットの種類について

UTSUWA に用意されているカスタムユニットは次の 5種類です。

メッセージ

デモデータでの使用箇所は 採用情報トップ です。


余白

デモデータではユニットによる要素の掲載例の画像間に使われています。


罫線

デモデータではユニットによる要素の掲載例のリストの間に使われています。


価格表

デモデータではユニットによる要素の掲載例のエントリー末尾近くに使われています。


目次

デモデータではユニットによる要素の掲載例の冒頭に使われています。 目次ユニットは a-blog cms の組み込みJSのひとつで、エントリー内の見出し要素に自動でアンカーリンクを生成、表示します。


ユニットグループの種類

ユニットグループも豊富に用意されています。デモデータではたとえばユニットによる要素の掲載例の価格表には「背景色:グレイ(全幅)」が使われています。


まとめ

UTSUWA はそのままで企業サイトとして使える工夫が随所にあり、その分初心者にとっても使いやすく、中級者、上級者にとってはカスタマイズのベースとしたり、他のテーマを使うときにもカスタマイズのヒントが得たりすることができるテーマです。ぜひご活用ください。

公式テーマの webpack ビルド環境の使い方

Beginnerテーマ以外の公式テーマには、 webpack のビルド環境が用意されています。このエントリーでは、webpack に馴染みがない方を対象に、導入の手順を解説します。

導入する前にはとっつきにくい印象のある webpack ですが、いったん慣れてしまうと意外に簡単でとても便利です。特に a-blog cms の公式テーマに同梱されているビルド環境はすべて設定済みであとは「使うだけ」なので最初の一歩として最適です。

(このエントリーの末尾で webpack を使用しない場合の注意点 についても触れています。)

webpack 導入のメリット

  • 文法チェックやプロパティ順の整理を自動でやってくれるのでコードが読みやすく、メンテナンスしやすくなる
  • スタイルや機能のモジュール化をしやすいので他案件への転用が簡単になる
  • 使用しているエディタやツールに依存しないのでチームでの開発環境を揃えることができる
  • LiveReload ( npm run start )を使うとファイルを保存すればブラウザが自動でリロードされるので開発効率が上がる
  • CSSは /dest/bundle.min.css、JavaScript は /dest/bundle.js にまとめられ、パフォーマンスが向上する
  • 慣れてくると外部のライブラリを読み込んで利用することも簡単にできるようになる

webpack 導入の手順

node.js をまだインストールしていない場合は .node-version でバージョンを確認し、node.js をインストールする

2022年8月現在、UTSUWA同梱のビルド環境の .node-version ファイルを開くと v14.16.0 になっています。

公式サイトのインストーラを使ってインストールする場合は、バージョン一覧から該当のバージョンを選んでください。コマンドでの操作に慣れている場合は、nodenv (Mac)、fnm (Windows) などの node バージョン管理ツールを使用するのがお勧めです。

インストールした後、ターミナルやコマンドプロンプトで

$ node -v ( または node --version )

と打って該当のバージョン番号が表示されればオーケーです。

package.json でローカル環境のアドレスとテーマ名を設定する

LiveReload ( npm run start ) を使う場合に基準となる設定です。LiveReload を使わない場合はこの手順は飛ばしてかまいません。

"config": {
  "local": "acms.lab", ( http:// や https:// は不要です )
  "theme": "テーマ名" ( テーマ名を utsuwa 以外にする場合は変更します )
},

cd コマンドで themes/テーマ名 に移動して npm を使ってパッケージをインストールする

cd は change directory の略です。今いる場所が分からない場合は pwd ( present working directory ) コマンドで確認できます。

$ cd www/themes/テーマ名 ( パスはローカル環境のフォルダ構成や現在地によって異なります )
$ npm i( または npm install )

必要なパッケージがインストールされると themes/テーマ名/node_modules というフォルダができて中にたくさんのファイルがダウンロードされます。ダウンロードが終わったらメッセージを見て、必要そうであれば

$ npm audit fix

しておきましょう。

※ 子テーマを使用する場合でも、ビルド環境は親テーマだけでまとめておきましょう。

ファイルを watch してコンパイルする

 $ npm run dev

あるいは

 $ npm run start

で src フォルダ内のファイルを watch して dest フォルダにコンパイルし始めます。npm run start は LiveReload の機能を含んでいるので、src フォルダ内のファイルを変更して保存するたびに自動的にブラウザがリロードされます。LiveReload 使用時にはブラウザのURL欄には「localhost::3000」が表示されます。これらのコマンドを止めるには「Ctrl + C」を押します。

ファイルを build する

納品時やリモートへの反映時などには

 $ npm run build

でファイルを build することによって、最適化されたコンパイルになります。このコマンドは実行に少しだけ時間がかかり、終わったら自動的に止まります。

JavaScript について

/src/js/index.js からさまざまなファイルを読み込んで /dest/bundle.js にコンパイルされています。その内容については各テーマフォルダに同梱されている README.md をご確認ください。

エラーが出たら

コマンドが問題なく実行されているときにはターミナルの画面に実行結果がスラスラと表示され続けていますが、赤字でエラーが表示された場合は、エラーメッセージを読んで対処しましょう。

Sass のルールは .stylelintrc、 JavaScript のルールは .eslintrcrules のブロックに追記することでそれぞれ個別にオンオフすることができます。.stylelintrc では true / null で、.eslintrc では 0 / 1(警告を出す) / 2(エラーを出す)という値で設定します。たとえば、.stylelintrc の rules ブロックに

 "block-no-empty": null,

と追記すると、Sass ファイルに空のブロックがあってもエラーがでなくなります。

より高度な内容について

これだけで一通りのビルドはできますが、全CSSのインライン化や組み込みJSの整理、各ファイルの役割など、より高度な内容についてはこちらもご確認ください。

webpack を使用しない場合の注意点

補足として、webpack を使用しない場合に抑えておいたほうが良い点について説明します。

独自カスタマイズ用の CSS と JavaScript

/include/head/link.html において

<link rel="stylesheet" href="/dest/bundle.min.css">
<link rel="stylesheet" href="/css/style.css">

/include/head/js.html において

<script src="/dest/bundle.js" defer></script>
<script src="/js/script.js" defer></script>

のように独自カスタマイズ用の CSS ファイル、JS ファイルへのパスを追記して、追加した CSS ファイルでスタイルを上書き、追加していきます。script タグでは JSファイルの実行順を担保するため、async属性ではなく、defer属性を使います。

不要なファイルを削除する

不要なファイルはそのままにしておいても問題はありませんが、削除するとファイル構成が分かりやすくなります。コンパイルによる予期せぬ先祖がえりを防ぐためにも削除しておくことをお勧めします。

utsuwa/ 直下の不要なファイル

  • .eslintrc
  • .node-version
  • .stylelintrc
  • babel.config.js
  • package-lock.json
  • package.json
  • webpack.analyze.js
  • webpack.common.js
  • webpack.dev.js
  • webpack.prod.js
  • webpack.uncompress.js

/src/ フォルダ

Sassを使用しない場合はフォルダごと削除してください。Sassを使用する場合は /src/scss を残して、お使いのコンパイルツールにあった設定にしてください。