エントリー系モジュールで複数ID設定する

モジュルIDの仕様変更

ここ最近コア部分の仕様にいろいろ手をいれていっています。ということで今回はモジュールIDになります。(執筆時最新 1.7.0)

a-blog cmsには表示するパーツとしてモジュールというものがあり、モジュールIDをつけることによってモジュール毎に設定できるようになります。モジュールの設定ではこのカテゴリーを表示する。この日付の範囲で表示するなどURLコンテキストで指定できる値を設定できます。しかし基本的に設定できる値が各項目に対して一つしか設定できませんでした。

そこで、Entry_BodyとSummary系モジュールでブログID、ユーザID、カテゴリID、エントリIDの4つを複数指定できるようにしました。

指定の仕方

以下の画像のように値をカンマで区切って入力して頂ければOKです。

2.0系のRSSモジュールで不具合が見つかりました。

2.0系の一部モジュールに不具合が見つかりました。

バージョン2.0.0、2.0.0.1, 2.0.0.2のRSSで本文が表示されない不具合が 発見されました。2.0.0.3にアップデート、または2.0.0.3の特定のファイルを差し替えて 対応をお願いいたします。

対応方法

以下のダウンロードページよりv2.0.0.3をダウンロード。

http://www.a-blogcms.jp/download/

v2.0.0.3にアップデート。または、/themes/system/rss2.xml をv2.0.0.3のものに置き換える。

この度は大変ご迷惑をお掛けしてしまい申し訳ございません。

今後ともa-blog cmsをよろしくお願い致します。

ナビゲーションを編集する

目標


「スタッフ紹介」というコンテンツをグローバルナビゲーションに表示しましょう。


解説使用テーマbeginner

Before

After

目次

  1. モジュールについて
  2. グローバルナビゲーションの表示設定を変更する
  3. クイックサーチを活用しよう

モジュールについて


モジュール
ブラウザ上から更新できる部分には、「モジュール」と呼ばれるパーツが表示用テンプレートのHTMLファイルに貼り付けられています。モジュールを使うことで a-blog cms に登録した様々なデータを処理/表示することができ、基本的にモジュールを使い動的なサイトを制作していきます。例えばテーマ「site」のトップページでは、「ナビゲーションモジュール」「エントリーヘッドラインモジュール」「エントリーサマリーモジュール」などが使われています。


サイトを制作する際は、既にa-blog cmsが用意しているモジュールの中から最適なものを組み合わせ、HTMLやCSSで独自にスタイルを調整していきます。


他にもモジュールには様々な種類があり、それぞれのモジュールはその役割ごとにグループ分けされています。一番大きな括りは、テンプレートを組み立てるためのGETモジュール、サーバーにデータを送信するためのPOSTモジュールです。


GETモジュール ビルトインモジュール
フィールドモジュール
タッチモジュール
POSTモジュール POST_2GETモジュール
ダウンロードモジュール

さらにGETモジュールは、ビルトインモジュール・フィールドモジュール・タッチモジュールの3種類に、POSTモジュールはPOST_2GETモジュール・ダウンロードモジュールの2種類に分けられます。


今回のハンズオンで作業していくナビゲーションモジュールはビルトインモジュールの1つです。これらのモジュールの区分は少々発展的な内容になるため、詳しくは以下の関連記事をご覧ください。なお、今回のチュートリアルについてはこれらの区分を理解していなくても進められるようになっています。



グローバルナビゲーションの表示設定を変更する


それでは、グローバルナビゲーションに「スタッフ紹介」というコンテンツを追加していきましょう。以下の手順でモジュールの表示設定画面へ移動します。


  1. ログインした状態でグローバルナビゲーションモジュールをマウスオーバーする
  2. 右上に表示される [モジュール] というボタンをクリックする


モジュールの表示設定画面が表示されました。続けて「採用情報」の右側にある [追加] ボタンをクリックし、新しく設定された入力欄にスタッフ紹介のラベルとURLの情報を入力していきます。


ラベルスタッフ紹介
URL%{HOME_URL}staff/


URL欄は、a-blog cmsのグローバル変数を使った方法で記述しています。


グローバル変数
a-blog cms側で特定の情報に変換できる文字列をグローバル変数といいます。%{変数}の形式で書かれ、例えば「%{HOME_URL}staff/」の文字列は、a-blog cmsによって「https://example.com/staff/」と解釈されます。
URLなどをグローバル変数で指定することのメリットは、ドメインを変更した時などに内部リンクが自動修正されることです。そのため、a-blog cms内でリンクのパスなどを記述する際は、一般的にグローバル変数を使うことが推奨されています。

以上でグローバルナビゲーションの表示設定が変更できました。画面の右上にある、青い「保存」ボタンを押して設定を保存します。トップページで表示を確認すると、「スタッフ紹介」のコンテンツが追加されているのがわかります。



以上でチュートリアルの目標は達成です。


クイックサーチを活用しよう


補足としてモジュールやグローバル変数への理解を深めるのに役立つ「クイックサーチ」という機能をご紹介します。


クイックサーチ
a-blog cmsが用意するモジュールのスニペットやグローバル変数を、管理ページを通さずに素早く検索することができる機能です。Macでは command+K 、Windowsでは Ctrl+k を押すことで、ログイン中であればどのページにいても起動することができます。


今回学習した「モジュール」や「グローバル変数」のパターンはそれぞれ数多く用意されています。目的に合ったものを効率よく探し出すために、是非クリックサーチを積極的に取り入れていきましょう。

ナビゲーションモジュールの中でテンプレートを呼び出す方法

ナビゲーションモジュールについては基本的には、管理画面から手動で自由にラベル・リンクを設定し、更新可能にするためのモジュールですが、例えば「採用情報」のコンテンツ以下のエントリーを追加した際に自動で増えるようなメニューに実装したいと思ったことはありませんでしょうか。

Navigation モジュールの設定



採用情報の公開のチェックを外し非表示にします。右側の(追加)ボタンをクリックし、ナビゲーションを 1行追加してください。

ここで、ラベルに acms://bid/1/cid/7/tpl/navi.html と記述します。 こうする事で、ラベルを編集する際に、acms:// で a-blog cms を再度実行し、bid=1 & cid=7の条件テンプレートnavi.html をラベルに編集することになります。

この機能は、1.x から実装されている機能ではありましたが、1回表示する際に a-blog cms をもう一度動作させて結果を取得する という事で、2倍の負荷になる事から、あまり推奨される記述ではありませんでした。推奨されない裏技として封印されてきていました。これを解決するために、テンプレートの部分的書き出し という機能で回避するという手段も用意されています。

しかし、Ver. 2.11.0 からモジュールID のキャッシュ機能ができた事から、本番環境では モジュールID キャッシュ を有効(0分 → 60分) にする事で、60分に1回しか2回動かさないことができるようになりました。

Navigationモジュール のテンプレートを修正

<!-- BEGIN_MODULE Navigation id="nav_global" -->
<nav class="navbar" aria-label="メインメニュー">
@include("/admin/module/setting.html")
<!-- BEGIN navigation:loop -->
	<!-- BEGIN ul#front --><ul><!-- END ul#front -->
		<!-- BEGIN li#front --><li {attr}><!-- END li#front -->
			<!-- BEGIN link#front --><!-- BEGIN_IF [{url}/nem] --><a href="{url}" {attr} target="{target}"><!-- END_IF --><!-- END link#front -->
			{label}[raw]
			<!-- BEGIN link#front --><!-- BEGIN_IF [{url}/nem] --></a><!-- END_IF --><!-- END link#front -->
			<!-- BEGIN li#rear --></li><!-- END li#rear -->
	<!-- BEGIN ul#rear --></ul><!-- END ul#rear -->
<!-- END navigation:loop -->
<a href="#top" class="acms-hide-tb acms-hide-pc">メニューを閉じる</a>
</nav>
<!-- END_MODULE Navigation -->

<!-- BEGIN link#front --> 〜 <!-- END link#front --> の中に IFブロックを書いて、{url} が無い時に <a> を消すように修正します。<!-- BEGIN link#end --> </a> <!-- END link#end --> のままでは IFブロックの変数 {url} が出せないので、link#end のブロックは link#front に変更しています。

これで、通常の動きと、acms:// を書いた時どちらでも大丈夫なります。

navi.html の作成

<!-- BEGIN_MODULE Entry_List id="recruit_navi" -->
<a href="%{HOME_URL}recruit/">採用情報</a>
  <ul>
    <!-- BEGIN entry:loop -->
    <li class="js-link_match_location"><a href="{url}">{title}</a></li>
    <!-- END entry:loop -->
  </ul>
<!-- END_MODULE Entry_List -->

acms:// で「モジュールID」も設定できるようにすることができると汎用的に使えるテンプレートになるのですが、{{module_id}} のような変数が使える前の時代に用意され、変わっていない機能なので、ここでは recruit_navi のモジュールID固定で用意することになります。



acms://bid/1/cid/7/tpl/navi.html と書いてたので、カテゴリーID にチェックをつけていますが、モジュールID でカテゴリーを指定してしまう書き方でも大丈夫です。

acms://bid/1/field/gnavi/on/tpl/navi.html

また、field/name/value を追加してカスタムフィールドにチェックがあるものだけをメニューに表示させるような書き方もできます。

config.system.yaml の修正

最近のバージョンでは、tpl の利用について制限が加えられていますので、特定のファイルのみを tpl 利用可能に設定する必要があります。

allow_tpl_path

allow_tpl_path: [navi.html]

forbid_tpl_inheritance_when_path_unresolved や forbid_tpl_url_context が on の場合、除外するパスを設定します。例: [news.html,hoge/custom.html] カンマ区切りで指定

html_format_validate

html_format_validate: off

htmlフォーマットでない場合は404で返す設定になります。

この場合、include ディレクトリや admin のディレクトリにあるファイルなどがURLを指定すると表示できてしまう事になりますので、.htaccess などで表示できないように設定をするようにしてください。

Entry_BodyモジュールでRSSファイルを作成する

a-blog cms では、/themes/system/rss2.xml が用意されており、特に意識しなくてもルート直下にRSSファイルが生成されます。他のテンプレートファイルと同様、お使いのテーマに複製してカスタマイズすることも可能です。このファイルには Feed_Rss2モジュールが使用されています。しかし、Feed_Rss2モジュールでは変数等が限られています。このエントリーでは、Entry_Bodyモジュールを使用したよりきめ細かいRSSファイルの実装について説明します。

Entry_Bodyモジュールを使うとできるようになること

  • カスタムフィールドの値を出す
  • RSS にメイン画像のURLを出す
  • タグの値を出す
  • エントリー日時だけでなく、更新日時を出す
  • Entry_TagRelationalモジュールなどで関連エントリーを出す

例えば多言語サイトで言語ごとのタイトルをカスタムフィールドで作成している場合、各ニュースサイトに最適化したソースを出したい場合などに便利です。

ソースの例

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><!-- BEGIN_MODULE Entry_Body id="rss" -->
    <channel>
        <title>%{ROOT_BLOG_NAME}</title>
        <link>%{HOME_URL}</link>
        <description>%{META_DESCRIPTION}</description>
        <language>ja</language>
        <copyright>(C) %{ROOT_BLOG_NAME}</copyright>
        <lastBuildDate>%{r}</lastBuildDate><!-- BEGIN entry:loop -->
        <item>
            <title>{title}[raw|striptags]</title>
            <link>{permalink}</link>
            <guid isPermaLink="true">{permalink}</guid>
            <description>{summary}[raw|striptags]</description>
            <!-- BEGIN mainImage --><!-- BEGIN_IF [{path}/nem/] --><media:content url="<!-- BEGIN_IF [{image@type}/eq/media] -->%{HTTP_MEDIA_ARCHIVES_DIR}{path}<!-- ELSE -->%{HTTP_ARCHIVES_DIR}{path}<!-- END_IF -->" media="image" /><!-- END_IF --><!-- END mainImage -->
            <content:encoded>
            <![CDATA[
            @include("/include/unit.html")
            ]]>
            </content:encoded>
            <pubDate>{date#r}</pubDate>
            <lastPubDate>{udate#r}</lastPubDate>
            <!-- BEGIN tag:veil --><!-- BEGIN tag:loop --><tags>{name}[raw]></tags><!-- END tag:loop -->
            <!-- END tag:veil --><!-- BEGIN category:veil --><!-- BEGIN category:loop --><category>{name}[raw]></category><!-- END category:loop --><!-- END category:veil -->
        </item><!-- END entry:loop -->
    </channel><!-- END_MODULE Entry_Body -->
</rss>

ポイントは下記の通りです。

  • channelタグの外側を Entry_Bodyモジュールで囲い、モジュールIDを rss としています。
  • lastBuildDate にはグローバル変数 %{r} を使って RFC 5322 形式でフォーマットされた現在の日付を出しています。a-blog cms ではこのように、phpのdate関数フォーマットに指定出来る日付の書式がそのままグローバル変数として使えます。
  • itemタグの外側を entry:loop で囲っています。
  • description には summary を出しています。
  • content:encoded には unit.html をインクルードしています。調整が必要な場合は unit-rss.html 等のファイルを作成してインクルードしてください。
  • media:content にメイン画像のパスを出力しています。
  • content:encoded, media:content を扱う場合には rssタグにそれぞれ 名前空間の指定が必要になります。詳しくはフィードに関する技術的な要件を参考にしてください。

Entry_TagRelationalモジュールなどで関連エントリーを出す場合についてはここでは説明を省きますが、エスケープが必要になることに注意してください。

モジュールIDの設定例


表示設定

条件設定

モジュールIDの設定のポイントは、下記の通りです。

  • 表示設定ではカテゴリー表示順を「現在のカテゴリーのみ」としてカテゴリを1つだけ出すようにしています。ページャー等不要なもののチェックを外しています。
  • 条件設定ではお知らせカテゴリーに絞り込み、引数のフィールドに entry_meta_rss/em を設定して、「RSSに表示しない」にチェックの入っているエントリーを出力しないようにしています。

最後に

もちろん、これらのソースや設定は一例にすぎません。a-blog cms ではこのように、RSSファイルを生成するからといって、必ずFeed_Rss2モジュールを使用しなければならないということはありません。目的に沿ったソースを生成できるモジュールであれば、何を使ってもかまわないのです。実装の際に参考にしていただければ幸いです。