エントリ一覧をページリロードなしで表示する

次のページをその場で表示する

a-blog cmsにはポストインクルードというAJAXを簡単に扱う為の仕組みがあります。 その仕組みを使ってページリロードなしにどんどんエントリーを表示してみます。

まずは、Entry_Bodyを使いボタンを押す事により次のページを引っ張ってきます。

実装方法

ビルトインモジュール


基本的に「モジュール」と言う場合、多くは ビルトインモジュール を指します。
ビルトインモジュールは、主にエントリー系の情報を表示するために利用され、カテゴリー、ナビゲーション、バナー、トピックパスなど、サイト制作に欠かせない要素を構成するのに役立ちます。

ビルドインモジュールには従来からある標準モジュールと、Ver. 3.2 から追加された、V2モジュールがあります。V2モジュールは、twigテンプレートでのみ使用できる新しいモジュールになります。

標準モジュール

従来からある標準ビルトインモジュールは、次のようにHTMLコメントタグで囲んで記述します。

<!-- BEGIN_MODULE Entry_List -->
<div>
<!--#include file="/admin/module/setting.html"-->
<ul>
  <!-- BEGIN entry:loop -->
  <li><a href="{url}">{title}</a></li>
  <!-- END entry:loop -->
</ul>
</div>
<!-- END_MODULE Entry_List -->

<!-- BEGIN_MODULE モジュール名 —> から <!-- END_MODULE モジュール名 —> を1つのモジュールとして動作します。モジュールの中にモジュールを書く事もでき、モジュールの実行順としては、内側のモジュールが実行され、その後に外側のモジュールが動作するようになっています。

V2モジュール

Ver 3.2 で追加された、twigテンプレートで利用できるモジュールがV2モジュールになります。V2モジュールは、twigテンプレートでのみ呼び出すことができるモジュールです。

{% set entrySummary = module('V2_Entry_Summary') %}

<div>
  {{ include('/admin/module/setting.twig', { moduleInfo: entrySummary.moduleInfo }) }}
  <ul>
    {% for entry in entrySummary.items %}
    <li>
      <p><a href="{{ entry.url }}">{{ entry.title }}</a></p>
    </li>
    {% endfor %}
  </ul>
</div>

module(‘モジュール名’) 関数を使用して、モジュールの変数を読み込んで、twigテンプレートで呼び出した変数を利用して、組み立てます。

各種ビルトインモジュールの機能や変数表・スニペットについてはリファレンス内のビルトインモジュールのページをご覧ください。

グローバル変数、校正オプション、バリデータを作ってみよう


このハンズオンでは、標準で用意されているグローバル変数、校正オプション、バリデータで要件を満たせない場合に、自作する方法について取り扱っていきます。

グローバル変数の作成

Hook 機能を利用します。そのためには設定変更をする必要があります。config.server.php の HOOK_ENABLE を1にします。
作業ファイル:/config.server.php

define('HOOK_ENABLE', 1);

グローバル変数を作成するには extendsGlobalVars() 内に、記述を追加します。
下記の記述をしてある場合、%{key}とテンプレートに記述すると、var と表示されます。
作業ファイル:/php/ACMS/User/Hook.php

public function extendsGlobalVars(&$globalVars)
{
$globalVars->set('key', 'var');
}

課題

1時間前の年月日 %{UCHINA_DATE} と、1時間前の時分秒 %{UCHINA_TIME} を表示するグローバル変数を作成する。1時間前の年月日時分秒は下記のプログラムコードで生成できます。
参考:phpマニュアル date関数

date('Y-m-d H:i:s', strtotime('-1 hour'))

テンプレートに %{UCHINA_DATE} と %{UCHINA_TIME} を記載し、ブラウザで表示を確認します
次に、トップページで表示している新着情報では最新の5件を表示していますが、追加で終了日時(end)を1時間前までとします。登録したての最新の記事は表示されず、1時間後に表示されるようになります。

校正オプションの作成

校正オプションを作成するには、class ACMS_User_Corrector を編集します。既に開催されている[sample]の校正オプションを参考にします。
作業ファイル:/php/ACMS/User/Corrector.php

課題

テキスト内の特定の文字を太字にします

{title}[wordstrong] とする場合、ACMS_User_Corrector に次のようなfunction を用意します。
下記コードをコピペするか、sampleを複製して、function 名を変更する方法でも問題ありません。

public static function wordstrong($txt, $args = array())
{
 $before = array("テーマ", "Cookie");
 $after   = array("<strong>テーマ</strong>", "<strong>Cookie</strong>");
 return str_replace($before, $after, $txt);
}

校正オプションを適応する文字は $txt にあります。この $txt に特定の文字が含まれているかを検索して置換をします。

次に、トップページの新着情報タイトルに先ほど作成した校正オプションを追加します。この時、必ずescapeの校正オプションも併記します。
作業ファイル:/themes/simple2016/include/entry/topHeadline.html

{title}[escape|wordstrong]

バリデータの作成

フォームの入力値チェックであるバリデータを作成するには、ACMS_User_Validator を編集します。既に用意されているsampleのバリデータを参考にします。
作業ファイル:/php/ACMS/User/Validator.php
作業ファイル:/themes/simple2016/contact/form/input.html

課題

電話番号の入力値チェックとして、0から始まる場合はOKとし、それ以外はエラーとするバリデータを作成します。
sample を参考に下記のようなチェックプログラムを使用します。
参考:PHPのマニュアル strpos

return (strpos($val, '0') === 0);

テンプレート側でバリデータを使用するように追記します。

<input type="hidden" name="tel:v#phonenumber" value="">
<!-- BEGIN tel:validator#phonenumber -->
<p class="error-text"><span class="acms-icon acms-icon-attention"></span>電話番号を確認してください。</p>
<!-- END tel:validator#phonenumber -->

0で始まらない電話番号はエラーになりましたら成功です。
余力がある方は、電話番号は必須項目ではないので空の場合はエラーにならないようにします。

フィールドモジュール

登録したカスタムフィールドのデータを表示させるためのモジュールです。
カスタムフィールドは、基本的に対応するカスタムフィールドのモジュール内に記述する必要があります。

<!-- BEGIN_MODULE Category_Field -->
  <!-- BEGIN headimage:veil -->
  <img src="{headimage@path}" width="" height="" />
  <!-- END headimage:veil -->
<!-- END_MODULE Category_Field -->

例外として、ビルトインモジュール内で利用ができるカスタムフィールドもあります。

各種フィールドモジュールの機能や変数表・スニペットについてはリファレンス内のフィールドモジュールのページをご覧ください。

関連エントリーを表示してみよう

Ver. 2.6.0 から、エントリーごとに任意の「関連エントリー」を設定できるようになりました。今回は校正オプション「resizeImg」機能と合わせて、「お知らせ」カテゴリーの記事に最適サイズの画像が載っている「関連エントリー一覧」を作ります。



関連エントリー機能を使用可能にするために、[管理画面 > コンフィグ > 編集設定] より「関連エントリー」のチェックボックスにチェックを入れます。



エントリー編集画面で関連エントリーを選択



任意のエントリーを選び、エントリー編集画面を開きます。「関連エントリー設定」タブが表示されるので、入力欄にキーワードを入れて現在編集しているエントリーと関連付けたいエントリーのタイトルを選択してください。



登録した関連エントリーは、下記のピンクの線で囲まれたハンドルをドラッグアンドドロップすることで表示順を変更することができます。また、右の「確認」ボタンをクリックすることで、実際にそのエントリーのページに移動して内容を確認できます。

エントリー編集画面で設定した「関連エントリー」はEntry_Summaryモジュールで表示できます。ここでは、関連エントリーを表示するためのEntry_Summaryを作成します。


関連エントリーに対応したEntry_Summaryモジュール


管理ページ>モジュールIDに移動し、関連エントリーを表示するためのモジュールIDを作成します。以下の設定が必要です。モジュールIDは「summary_related」と命名します。


関連エントリーはサイト全体から選択できるので、階層の設定をしておきましょう


表示設定

モジュールIDの設定の「関連エントリー」にチェックをつける


以上で、関連エントリーの紐付けと表示のためのカスタマイズが完了しました。

1.で作成したモジュールID用のHTMLファイルを作成します。「simple2016」内の /include/entry/summary.html を複製し、「summaryRelated.html」にリネームしてください。

summaryRelated.html をテキストエディタで開き、1行目にモジュールID「summary_related」を記述します。

<!-- BEGIN_MODULE Entry_Summary id="summary_related" -->

/themes/simple2016/news/entry.html で本文を表示しているテンプレートは /themes/simple2016/include/entry/body.html です。body.html の 内に2.で作成したテンプレートファイルを読み込みます。

<!-- BEGIN_MODULE Entry_Body -->

(略)

<!-- 関連エントリー -->
<!-- #include file="/include/entry/summaryRelated.html" -->

<!-- END_MODULE Entry_Body -->

エントリー(詳細ページ)に関連エントリーが表示されていれば完了です。

従来のa-blog cmsでは、Entry_Summaryなどにメイン画像を表示させる場合、CSSを使ってサイズや縦横の比率を変更していました。Ver. 2.6.0 から実装された校正オプション「resizeImg」を使えば、画像そのもののトリミングやサイズ変更が可能になります。

参考:校正オプション | a-blog cms 制作者向け情報

校正オプション「resizeImg」はアップロードした画像を指定したサイズに自動でトリミング(切り抜き)・拡大をしてくれます。

例)横400px, 縦300pxにリサイズする

{image@path}[resizeImg(400,300)]

例)横400px でアスペクト比を維持してリサイズする

{image@path}[resizeImg(400)]

例)リサイズ後の余白の背景色を指定してリサイズする(JPEG形式のみ対応)

{image@path}[resizeImg(400, 300, 'ff0000')]

/themes/simple2016/include/entry/summaryRelated.html をテキストエディタで開きます。


(略)

<!-- BEGIN image:veil -->
    <img src="%{ROOT_DIR}{path}[resizeImg(120,120)]" width="120" height="120" alt=""><!-- END image:veil --><!-- BEGIN noimage -->
    <img src="/images/noImage.png" width="120" height="120" alt="" />
<!-- END noimage -->

(略)

[resizeImg(120,120)] の部分が校正オプションです。デフォルトでは120px四方の画像が生成されるようになっています。


初期状態では120px四方の画像が生成されます。


画像サイズを200px四方に変更しましょう。


<!-- BEGIN image:veil -->
<img src="%{ROOT_DIR}{path}[resizeImg(200,200)]" width="200" height="200" alt=""><!-- END image:veil --><!-- BEGIN noimage -->
<img src="/images/noImage.png" width="200" height="200" alt="" />
<!-- END noimage -->

ブラウザを再読み込みすれば、画像サイズが変更されます。