a-blog cmsで、独自タグの内容を置換する「校正オプション」の具体的な使い方


この記事は、a-blog cms Advent Calendar 2017の10日目の記事です。
すみませんリマインダの日付間違えてて一日遅れました。

先日、12月9日のCMSMix Sapporo Vol.4のハンズオンでご紹介した、「校正オプション」の具体的な使い方です。

校正オプションとは

a-blog cmsでは、テンプレート内の変数の直後に、半角角カッコ([])で「表示内容を置換するルール」を指定することができます。これが「校正オプション」で、ほぼすべての変数に対して使用できます。
使用できるオプションの一覧は、下記を参照ください。

最もよく使われるのが、他のCMSでもよくある日付変換です。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「event_date」を、ゼロを付けない日付に置換して表示しています。

acms_corrector_date.html
{event_date}[date('Y年n月j日')] -> 2017-01-01 -> 2018年1月1日

a-blog cms独自の校正オプション

a-blog cmsでは、国産ならではの、日付を和暦に変換する校正オプションもあります。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「my_birth」を、和暦で表示しています。
以下は私のお誕生日です。なにかください。

acms_corrector_wareki.html
{my_birth}[wareki('年n月j日')] -> 1975-03-26 -> 昭和50年3月26日

校正オプションを自作する

自作オプションが必要となる例

これは、CMSMix Sapporo Vol.4のハンズオンのスクリーンショットです。
日本将棋連盟のプロ棋士のデータをa-blog cmsで表示したものです。

一般に日本の芸道は、漢数字の「段」でランク分けされ、サイトによっては「段位が高い順」での表示を求められます。漢数字でもソートは可能ですが、半角数字にしておいたほうが無難です。
このサンプルでは、「kanjinum」校正オプションを自作し、数字を漢数字に変換しています。

作り方

a-blog cms内の以下のファイルをエディタで開き、「ACMS_User_Corrector」クラスにpublic関数を追加します。

php/ACMS/User/Corrector.php

実際のファイルは既にサンプルコードが入っていますが、アウトラインは以下の通りです。

acms_corrector_outline.php
<?php
class ACMS_User_Corrector
{

    public static function sample($txt, $args = array())
    {
        // 校正オプション[sample]の処理
        // 変数「$txt」に直前のa-blog cmsの変数の値が入る
        // 第二引数にarrayを定義すると、文字列で補助値を渡すことができる
    }

    public static function kanjinum($txt)
    {
        // 校正オプション[kanjinum]の処理
        // 第二引数はないので、補助値を渡さないで使う前提
    }


}

処理の流れ

  • 校正オプションと同じ名前の関数が呼び出される
  • 変数「\$txt」に、直前のa-blog cmsの変数の値が送られる
  • 関数から「return」で返された値を、本来の変数の値に変わって表示する

最も単純な構造だとこうなります。変数の内容が何であっても「_:(´ཀ`」∠):_」にして返します。

acms_corrector_simple.php
    public static function simple($txt)
    {
       return '_:(´ཀ`」∠):_';
    }
}

漢数字変換のサンプル

こちらで公開されている関数をそのまま流用できます。変数「\$outstr」に、変数「\$txt」を処理した内容を入れて返します。

PHPで半角数字を漢数字にする | ぱふぅ家のホームページ
https://www.pahoo.org/e-soul/webtech/php03/php03-05-01.shtm

acms_corrector_kanjinum.php
    public static function kanjinum($txt)
    {
        // 例 {var}[kanjinum]
        // {var}の中は整数でなければならない

        static $kantbl1 = array(0=>'', 1=>'一', 2=>'二', 3=>'三', 4=>'四', 5=>'五', 6=>'六', 7=>'七', 8=>'八', 9=>'九', '.'=>'.', '-'=>'-');
        static $kantbl2 = array(0=>'', 1=>'十', 2=>'百', 3=>'千');
        static $kantbl3 = array(0=>'', 1=>'万', 2=>'億', 3=>'兆', 4=>'京');

        $outstr = '';
        $len = strlen($txt);
        $m = (int)($len / 4);

        //一、万、億、兆‥‥の繰り返し
        for ($i = 0; $i <= $m; $i++) {

            $s2 = '';

            //一、十、百、千の繰り返し
            for ($j = 0; $j < 4; $j++) {

                $pos = $len - $i * 4 - $j - 1;

                if ($pos >= 0) {
                    $ch  = substr($txt, $pos, 1);
                    if ($ch == ',')    continue;        //カンマは無視

                    $ch1 = isset($kantbl1[$ch]) ? $kantbl1[$ch] : '';
                    $ch2 = isset($kantbl2[$j])  ? $kantbl2[$j]  : '';

                    //冒頭が「一」の場合の処理
                    if ($ch1 != '') {
                        if ($ch1 == '一' && $ch2 != '')  $s2 = $ch2 . $s2;
                        else                             $s2 = $ch1 . $ch2 . $s2;
                    }
                }
            }

            if ($s2 != '')  $outstr = $s2 . $kantbl3[$i] . $outstr;

        }
        return $outstr;
    }
}

実際に利用する

以下のように書くだけです。

acms_corrector_kanjinum_tmpl.html
{player_lank}[kanjinum]段

その他の校正オプションの自作例

サイトによっては、以下のようなものを作ると便利かもしれません。

  • 商品番号を別途サーバーに置いている商品情報APIに渡し、取得した情報を返す
  • 変数が空のときのデフォルト値を、表示しているコンテンツによって変更する
  • 正規表現検索を行い、特定のキーワードが入っていればマークアップする