「今いるページ / 全ページ数」を表示させるページャーのカスタマイズ


標準のページャーの設定では、上記の画像のように 1 2 3 4 のように表示され、今いるページのスタイルが違うような表示になるようになっています。先日サポートで、これを 1 / 4 と表示させたいという相談があり、その対応が簡単に思いつかなかったのでブログに書き残しておきます。

Entry_Summary のコンフィグ 初期設定



利用できる変数を考える

表示させる 1 / 4 は「現在表示しているページ / 全ページ数」ということになります。

「現在表示しているページ」については、Entry_Summary の変数にはありませんが、グローバル変数に %{PAGE} というものが用意されていますので、これを利用ください。



問題は「全ページ数」です。Entry_Summary の変数表に以下のような {lastPage} という設定があります。これがページ数が少ない時に初期の設定では表示ができない仕様になっております。これを強制的に表示するための設定するための「前後に表示するページ数」に -1 を設定することで目的の動きになります。

カスタマイズ設定

Entry_Summary のコンフィグ設定



テンプレートへの記述

<p class="acms-text-center">%{PAGE} / {lastPage}</p>

これで当初の目的である 1 / 4 が表示可能になります。


GETモジュールのID化


独自に開発した GET モジュール及び、V2 GET モジュールも、標準のビルドインモジュールと同様にモジュールID化できます。ここでは、モジュールID化の仕方と、モジュールID化によってどのような動作になるかを説明します。

モジュールID化できるようにする

まずモジュールID化に対応するため、モジュールID作成時に独自モジュールを選択できるようにします。

ご利用のテーマに以下のファイルを作成し、セレクト要素を記述します。

ファイル: /themes/ご利用テーマ/admin/module/select.user.html

従来のGETモジュールの場合

<optgroup label="独自モジュール">
    <option value="Sample"{name:selected#Sample}>独自モジュール(Sample)</option>
</optgroup>

V2 GETモジュールの場合

<optgroup label="独自モジュール">
    <option value="V2_Sample"{name:selected#V2_Sample}>独自モジュール(V2 Sample)</option>
</optgroup>

仕様(共通)

  • : テンプレートで呼び出すモジュール名と同じ値

  • 変数: {name:selected#セレクトの値}

この実装を行うことでモジュールIDの作成ができるようになります。

モジュールIDの作成

管理画面のモジュールID作成画面で、上記で追加した独自モジュールを選択し、識別子(identifier)を設定してモジュールIDを作成します。

従来のGETモジュールの呼び出し

標準テンプレートでは id 属性で識別子を指定します。

<!-- BEGIN_MODULE Sample id="sample" --><!-- END_MODULE Sample -->

V2 GETモジュールの呼び出し

Twig テンプレートでは module() の第2引数で識別子を指定します。

{% set result = module('V2_Sample', 'sample') %}

モジュールID化でのコンテキスト情報の取得

モジュールID化した時のコンテキスト情報の取得について解説します。従来のGETモジュールと V2 GET モジュールで、スコープの設定方法が異なりますが、引数・固定値によるコンテキストの取得ルールは共通です。

モジュールID化する前

モジュールIDを指定しない場合、スコープで global を設定していれば、$this->bid$this->cid$this->eid で表示ページの URL コンテキスト情報を取得できます。

従来のGETモジュール

public $_scope = [
    'bid' => 'global',
    'cid' => 'global',
    'eid' => 'global',
];

function get()
{
    return "BID = $this->bid, CID = $this->cid, EID = $this->eid";
}

V2 GETモジュール

protected $scopes = [
    'bid' => 'global',
    'cid' => 'global',
    'eid' => 'global',
];

public function get(): array
{
    return [
        'bid' => $this->bid,
        'cid' => $this->cid,
        'eid' => $this->eid,
    ];
}

モジュールID化した場合

モジュールIDを指定して呼び出した場合、そのままでは $this->cid$this->eid で表示ページのコンテキスト情報を取得できません。(bid だけはモジュールID化しても取得できます。)

URLコンテキスト情報を取得するには

モジュールID管理画面で、取得したい情報の引数項目にチェックを付けます。これにより URL コンテキストの情報を取得できるようになります。

固定値の設定

$this->cid$this->eid は通常 URL コンテキスト情報を取得しますが、モジュールID化すると、固定値を設定することで挙動が変わります。

モジュールID管理画面で固定値を設定した場合、表示している URL が別のカテゴリーや、トップページなどカテゴリー情報がない場合でも、常に $this->cid は固定値で設定したカテゴリーIDを返すようになります。

モジュールID化時のコンテキスト情報の取得まとめ(共通)

引数チェック

固定値

$this->cid などのプロパティ

あり

なし

URL の情報を取得

なし

あり

モジュールIDで設定した固定値を取得

あり

あり

URL に該当の情報があれば URL の情報を取得。ない場合は固定値を取得

表示ページのURLコンテキストを常に取得したい場合

モジュールIDの設定と関係なく表示ページの URL コンテキストを取得したい場合は、定数を利用します。

項目

定数

ブログID

BID

ユーザーID

UID

カテゴリーID

CID

エントリーID

EID

キーワード

KEYWORD

タグ

TAG

フィールド

FIELD

日時検索のスタート

START

日付検索のエンド

END

ページ番号

PAGE

並び順

ORDER

最大表示件数

LIMIT

// モジュールIDの設定に関係なく表示ページのカテゴリーIDを取得
$displayPageCid = CID;

従来のGETモジュールと V2 GETモジュールの違い(モジュールID化)

項目

従来のGETモジュール

V2 GETモジュール

スコープの設定

$_scope プロパティ

$scopes プロパティ

テンプレートでの呼び出し

<!-- BEGIN_MODULE Sample id="sample" -->

module('V2_Sample', 'sample')

戻り値

文字列

配列

カスタムフィールドメーカーを改良しました。

デベロッパーサイトのカスタムフィールドメーカーを改良しました。

従来のカスタムフィールドメーカーから生成されたソースコードだと、カスタムフィールドグループの際に、下の画像のように項目が横に積まれてしまい入力欄が狭くなってしまう問題がありました。



そこで今回は縦向きレイアウトに対応しました。縦向きレイアウトだと、下記の画像のように先ほどと同じ項目数ですが、入力欄が狭くなりません。



スイッチトグルで従来の横向きレイアウトか、新しい縦向きレイアウトか選択できるようにしています! ぜひご活用ください!


テンプレートエンジン - 3(render method)

ここまで、ブロックの制御の仕方や変数の追加の仕方などを説明してきましたが、Ver. 2.6.1で追加された render メソッドを利用するともっと簡単にテンプレートエンジンを扱うことができます。

まずは、今まで説明してきたやり方とrenderメソッドを使ったサンプルで同じものを出力してみて、どう違うか比較してみましょう。

出力するテンプレート(HTML)

<!-- BEGIN_MODULE Sample -->
<!-- BEGIN message -->
ブロックの表示
<!-- END message -->

<!-- BEGIN message2 -->
<p>{msg}</p>
<!-- END message2 -->  

<p>件数: {count}件</p>

<ul>
  <!-- BEGIN data:loop -->
  <li>{id}: {name}</li>
  <!-- END data:loop -->
</ul>
<!-- END_MODULE Sample -->

今までの方法

function get()
{
  $Tpl = new Template($this->tpl, new ACMS_Corrector());

  $data = [
    [
      'id' => 'aaa',
      'name' => '山田太郎',
    ],
    [
      'id' => 'bbb',
      'name' => '鈴木次郎',
    ],
    [
      'id' => 'ccc',
      'name' => '佐藤三郎',
    ],
  ];

  foreach ( $data as $i => $line ) {
    $line['data.i'] = ++$i;
    $Tpl->add('data:loop', $line);
  }

  $Tpl->add('message');
  $Tpl->add('message2', [
    'msg' => 'ブロック内の変数',
  ]);

  $Tpl->add(null, [
    'count' => count($data),
  ]);

  return $Tpl->get();
}

renderメソッドを使った方法

function get()
{
  $Tpl = new Template($this->tpl, new ACMS_Corrector());

  $data = [
    [
      'id' => 'aaa',
      'name' => '山田太郎',
    ],
    [
      'id' => 'bbb',
      'name' => '鈴木次郎',
    ],
    [
      'id' => 'ccc',
      'name' => '佐藤三郎',
    ],
  ];

  $obj = [
    'data' => $data,
    'count' => count($data),
    'message' => (object)[],
    'message2' => [
      'msg' => 'ブロック内の変数',
    ]
  ];

  return $Tpl->render($obj);
}

どうでしょうか? 今までのやり方は、その都度テンプレートを組み立てていくイメージですが、renderメソッドはデータの組み立てに集中し最後にrenderメソッドに渡すイメージです。

これにより、a-blog cms独特なテンプレートエンジンのルールを覚えなくても、データを連想配列または、オブジェクトで用意するだけで簡単に実装ができるようになります。

render 仕様

それでは render メソッドの詳しい仕様を見ていきましょう。

引数

まず、renderメソッドに渡す引数は、連想配列 もしくは オブジェクト に対応しています。

連想配列形式

$data = [
  'hoge1' => 'value1',
  'hoge2' => 'value2',
];

return $Tpl->render($data);

オブジェクト形式

$data = new stdClass();

$data->hoge1 = 'value1';
$data->hoge2 = 'value2';

return $Tpl->render($data);

変数

変数になるデータは連想配列の値、もしくはオブジェクトのプロパティの値が、配列、オブジェクトでないスカラー型の場合に変数になります。 注意点として、論理値(boolean)は 1 or 0 に変換されて表示されますのでお気をつけください。

変数になるデータ形式表示
論理値 (boolean)1 or 0
整数 (integer)そのまま
浮動小数点数 (float, double も同じ)そのまま
文字列 (string)そのまま

ブロック

ブロックは、連想配列の値、もしくはオブジェクトのプロパティの値が、連想配列またはオブジェクトの場合にブロックになります。

その値が空のオブジェクトや連想配列の場合は、ブロックのみの出力になり、データ(連想配列やプロパティ)がある場合は、そのブロック内で変数が利用できます。

<!-- 例1 変数をもったブロックの出力(連想配列の場合) -->
<!-- BEGIN hoge -->{val}<!-- END hoge -->
$data = [
  'hoge' => [
    'val' => 'value',
  ]
];

<!-- 例2 空のブロック出力(オブジェクトの場合)-->
<!-- BEGIN hoge -->hoge<!-- END hoge -->
$data = new stdClass();
$data->hoge = new stdClass();

ループブロック

ループブロックは、連想配列の値もしくはオブジェクトのプロパティの値が、配列の場合にループブロックになります。連想配列でない ところに注意してください。

また、ループブロック名は、 連想配列のkey名:loop になります。

$data = [
  [
    'id' => 'aaa',
    'name' => '山田太郎',
  ],
  [
    'id' => 'bbb',
    'name' => '鈴木次郎',
  ],
  [
    'id' => 'ccc',
    'name' => '佐藤三郎',
  ],
];

return $Tpl->render(['data' => $data]);

// html
<!-- BEGIN data:loop -->
<li>{id}: {name}</li>
<!-- END data:loop -->

上の例では配列の中身が連想配列だったので、そのまま連想配列が変数として利用できました。では、配列の中身がスカラー型だった場合はどうでしょうか。

$data = ['山田太郎', '鈴木次郎',  '佐藤三郎'];

return $Tpl->render(['data' => $data]);

// html
<!-- BEGIN data:loop -->
<li>{data}</li>
<!-- END data:loop -->

この場合は、上記のコードのように連想配列のkey名がそのままループ内の変数として利用できます。

特殊なブロック、変数

さらにループブロック内では、自動的に生成される特殊なブロックと変数を利用できます。

添字変数

ループ内で {連想配列のkey名.i} という変数が使えるようになります。これは、ループ回数を出力するものになります。

$data = ['山田太郎', '鈴木次郎',  '佐藤三郎'];

return $Tpl->render(['data' => $data]);

// html
<!-- BEGIN data:loop -->
<li>{data.i}:{data}</li>
<!-- END data:loop -->

// 結果
<li>1:山田太郎</li>
<li>2:鈴木次郎</li>
<li>3:佐藤三郎</li>
glueブロック

ループ回数 - 1回出力される glueブロックも出力されるようになります。ブロック名は 連想配列のkey名:glue です。使いどころとしては配列をカンマでつなげたい場合などに利用できます。

$data = ['山田太郎', '鈴木次郎',  '佐藤三郎'];

return $Tpl->render(['data' => $data]);

// html
<!-- BEGIN data:loop -->
  <!-- BEGIN data:glue -->, <!-- END data:glue -->{data}
<!-- END data:loop -->

// 結果
山田太郎, 鈴木次郎,  佐藤三郎

Ver. 2.6.1以上をご利用の場合は、renderメソッドで独自モジュールを作っていくほうが、簡潔に記述できますのでrederメソッドをお勧めします。