親、ルートテーマへのグローバル変数の実装について

https://appleple.backlog.jp/view/CMS-1690


a-blog cmsユーザーの方から、%{CURRENT_THEMES_DIR} :表示中ページで使用されているテーマのパスを表すグローバル変数、がありますが、これの親ブログ版、ルートブログ版が欲しいといった要望を頂いております。

URLコンテキストの基本

URLコンテキストによって表示ページの出力を制御

a-blog cmsでは、表示しているページがWebサイトの何処なのか、どのような状態であるかをURL上のパスとして表現しています。これを URLコンテキスト(URLによって表現されるページの文脈情報)と呼んでいます。個々のモジュールは、このURLコンテキストで表す条件を元に何を表示するかを決定する事になります。

カレンダー系のモジュールを使ったカスタマイズ

a-blog cms には、カレンダーを表示するためのモジュールがいくつか用意されています。本ハンズオンでは「Entry_Calendar」「Plugin_Schedule」「Entry_Summary」を使ったカレンダーを作りましょう。用途に合わせて使い分けてください。

イベント紹介ページなどに活用できる「Entry_Calendar」

Entry_Calendar はカレンダーの中にエントリーを表示するモジュールです。イベントやセミナーなどの詳細ページに誘導したい時に適しています。


サンプル:a-blog cms イベントスケジュール


Entry_Calendarの特徴はエントリーのカスタムフィールドを利用できることです。 たとえば、エントリーのカスタムフィールドに日付の情報を保存し、Google Calendarに登録するためのリンクを表示するといったカスタマイズができます。

11月のエントリーを Entry_Calendar で表示してみましょう。まずは11月を公開日時にしてエントリーを複数件登録してください。


作成されたエントリー


カスタマイズ方法

  1. モジュールIDを作成する
  2. 表示設定で「月表示」モードに変更する
  3. 表示用テンプレートを設置する
  4. 情報登録用テンプレートを設置する

1. モジュールIDを作成する


新規モジュール「Entry_Calendar」を選択


まずは Entry_Calendar 用のモジュールIDを作りましょう。今回の例では「demoEntryCalendar」というモジュールIDを作成します。 URLコンテキストがカレンダーに反映されるように「開始日時」にチェックを入れてください。


モジュールIDの設定画面


2. 表示設定を「月表示」モードに変更する


つぎに、Entry_Calendarモジュールの表示設定画面で、カレンダーの表示モードが「月表示」モードになっていることを確認しましょう。「週表示」モードだと1週間分のカレンダーが表示されます。


表示モードを「月表示」に設定


3. 表示用テンプレート(calendar.html)を設置する


ファイルを開く

エントリーカレンダーの表示用テンプレート


最後に作成したモジュールIDを使ったカレンダーを実際に表示してみましょう。ご利用のテーマに「calendar.html」を新たに作成し、上記のZipファイルを展開して添付されているHTMLを設置してみましょう。

4. 情報登録用テンプレート(field.html)を設置する


ファイルを開く

スケジュール登録用のカスタムフィールド


次にカレンダーに表示するための情報を登録できるようにエントリーにカスタムフィールドを設置しましょう。(ソースコードが少し長いので、上記ZIPファイルをご活用ください)

モジュールIDの設定で開始日時のチェックボックスにチェックが入っていると、10月や12月など他の月のカレンダーも閲覧が可能です。

シンプルなカレンダーなら「Plugin_Schedule」

Plugin_Schedule」はカレンダーに登録した情報を自由に表示できます。エントリーカレンダーと異なり、エントリーを作る必要がなく、管理画面ひとつで一ヶ月分の情報を制御できるので、休業日カレンダーなどに適しています。


「Plugin_Schedule」のサンプル


まずは管理画面のスケジュールよりスケジュールを作成します。今回は「demoSchedule」という名前でスケジュールを設定しています。


管理画面の左メニューから「スケジュール」を選択


つぎに「定休日」用のラベルを作成しましょう。Plugin_Scheduleでは、日にちごとにラベルをつけ、カレンダー上で異なる見た目にできます。


今回はラベル名を「定期休業」、クラス名を「regular_holiday」としています。


ラベルを用意できたら、管理画面>スケジュールの登録データの「表示」ボタンをクリックしてください。下の図のように、スケジュールのデータ詳細ページが表示されます。先ほど設定した「定期休業」のラベルを任意の日付に登録していきます。


プルダウンから「定期休業」を選択します。


カスタマイズ方法


  1. モジュールIDを作成する
  2. 参照先スケジュールを設定する
  3. 表示用テンプレート(plugin-schedule.html)を設置

1. モジュールIDを作成する

まずは「Plugin_Schedule」のモジュールIDを作りましょう。今回の例では demoPluginSchedule という名前でモジュールIDを作成しています。

2. 参照先スケジュールを設定する

モジュールIDの作成が完了したら、モジュールIDの表示設定に移動し、先ほど作成したスケジュール「demoSchedule」を参照先スケジュールとして登録してください。



3. 表示用テンプレート(plugin-schedule.html)を設置


ファイルを開く

スケジュール表示用のテンプレート


以下のような七曜表が表示されていれば、カスタマイズは完了です。ラベルのクラスにスタイルを当ててデザインを実装してください。



Entry_Summary で期間ごとのコンテンツを表示する


エントリーサマリー(Entry_Summary)とグローバル変数を組み合わせて、特定の期間を登録されているコンテンツを絞り込んで表示できます。


Entry_Summaryで期間ごとのコンテンツを出すサンプル


このハンズオンは「グローバル変数の作成」が含まれるので、難易度★★★★☆に相当します。余力のある方のみチャレンジしてみてください。


カスタマイズ


  1. グローバル変数の作成
  2. モジュールIDの設定
  3. 表示用テンプレートの作成

1. グローバル変数の作成

まずは、以下のグローバル変数を作成します。


%{EVENT_THIS_WEEK_FROM} 「今週の開始日」をあらわすグローバル変数
%{EVETN_THIS_WEEK_TO} 「今週の最終日」をあらわすグローバル変数
%{EVENT_NEXT_WEEK_FROM} 「来週の開始日」をあらわすグローバル変数
%{EVENT_NEXT_WEEK_TO} 「来週の最終日」をあらわすグローバル変数

グローバル変数をphpから作成するために、「config.server.php」の HOOK_ENABLE を 1 に設定してください。Hookが有効になります。

define('HOOK_ENABLE', 1);

つぎに、/php/ACMS/User/Hook.php のextendsGlobalVarsのfunction内に、以下のプログラムを追加してください。これで上記のグローバル変数がセットされます。

public function extendsGlobalVars(&$globalVars)
{
    if (date("D")=="Mon") {
        $globalVars->set('EVENT_THIS_WEEK_FROM', date("Y-m-d"));
    } else {
        $globalVars->set('EVENT_THIS_WEEK_FROM', date("Y-m-d", strtotime('last monday')));
    }
    if (date("D")=="Sun") {
        $globalVars->set('EVENT_THIS_WEEK_TO', date("Y-m-d"));
    } else {
        $globalVars->set('EVENT_THIS_WEEK_TO', date("Y-m-d", strtotime('next sunday')));
    }
    $globalVars->set('EVENT_NEXT_WEEK_TO', date("Y-m-d", strtotime('+2 sunday')));
    $globalVars->set('EVENT_NEXT_WEEK_FROM', date("Y-m-d", strtotime('next monday')));
}

グローバル変数のくわしい作成方法は開発ブログをご覧ください。

2. モジュールIDの設定

次に今週と来週のイベント情報を表示するために、Entry_SummaryのモジュールIDを作成しましょう。先ほど作ったグローバル変数を利用し、下記のような条件で2つのモジュールIDを作成します。


モジュールID フィールド(field)
event_this_week event_date/lte/event_date/lte/%{EVENT_THIS_WEEK_TO}/and/event_end_date/gte/%{EVENT_THIS_WEEK_FROM}
event_past event_date/lte/%{EVENT_NEXT_WEEK_TO}/and/event_end_date/gte/%{EVENT_NEXT_WEEK_FROM}

モジュールIDの引数には、グローバル変数を使えます


3. 表示用のテンプレートの作成

これで、期間ごとにコンテンツを絞り込んで表示できる Entry_Summary ができました。スタイルやカスタムフィールドを調整すれば、以下のようなテンプレートができます。


「今週のイベント」「来週のイベント」を2つのEntry_Summaryで表示


サンプルのソースコードを用意しましたのでダウンロード後、任意のディレクトリに設置し、ファイルをincludeして表示を確認してください。意図した期間でエントリーが表示されていればOKです。


ファイルを開く

イベント情報を表示するためのテンプレート

ページ(page)やキーワード(keyword)を指定しても表示が変わらない

説明

URLコンテキスト上で指定されたページやキーワードの指定を、各モジュールが反映するかどうかは、各モジュールの引数の設定によって変わります。

またデフォルトの設定値もモジュールによって異なります。たとえば、Entry_Bodyモジュールは、ページやキーワードを反映しますが、Entry_Summaryモジュールはそれらをデフォルトでは反映しません。

回答

ページやキーワードを反映させるには、モジュールIDを設定します。 モジュールIDの設定画面に「キーワード(keyword)」「タグ(tag)」「ページ(page)」などURLの値を参照するチェックボックスがあります。

http://ドメイン/page/2/

上記のようにa-blog cmsではURLの値を参照してモジュール側でpageの2ページのデータを表示してくれます。

3つの基本ページ

URLコンテキストを理解する上でa-blog cms の基本テンプレートの概念は欠かせません。 基本テンプレートには以下の3種類が存在します。

  • トップページ
  • 一覧ページ
  • 詳細ページ

ひとつずつ詳しく説明します。

トップページ

一般的な運用として Webサーバのドキュメントルートに a-blog cms が設置された場合には、「http://ドメイン/」というURLでトップページが表示されます。

また、トップページはブログごとに存在できるので、子ブログでもトップのテンプレートを表示可能です。

<!-- ルートブログのトップのテンプレートが表示される場合 -->
http://www.example.com/

<!-- 「recruit」という子ブログのトップのテンプレートが表示される場合 -->
http://www.example.com/recruit/ 

また、個別のディレクトリ内にa-blog cmsを設置することも可能です。その際には、設置先のディレクトリ(下記の例では、http://www.example.com/cms/)まで指定した状態がシステムとしてのトップページという扱いになります。

<!-- 「cms」というディレクトリ以下にa-blog cmsが設置されている場合。ルートブログのトップのテンプレートが表示される -->
http://www.example.com/cms/

一覧ページ

URLがスラッシュで終わっている状態のとき、トップページ以外の場合、一覧ページが表示されます。

<!-- 「news」がカテゴリーなら一覧のテンプレートが表示される -->
http://www.example.com/news/

<!-- 「/」で終わっているが「recruit」がブログの場合はトップのテンプレートが使用される -->
http://www.example.com/recruit/

一覧ページが表示されるパターンの例

  • カテゴリーの一覧
  • キーワード検索結果
  • カスタムフィールドの検索結果
  • タグの一覧
  • ページ(2ページ目、3ページ目)
  • 日付

など

注意点としては、URLコンテキストの特徴として、URLからはコンテンツがブログなのかカテゴリーなのか分からないことです。今適用されているテンプレートを知りたいときはテーマとテンプレートの構成の「表示テンプレートの確認」項目をご覧ください。

詳細ページ

URLが 「.html」 で終わる場合は、エントリーの詳細ページが表示されます。

http://www.example.com/news/entry-1.html