PHP
ablogcms

a-blog cmsのエントリー位置リストの距離表示を最適化する校正オプション

a-blog cmsには、各エントリーに登録した位置情報に基づいて、近い距離順でエントリーの一覧を表示する、「エントリー位置リスト(Entry_GeoList)」モジュールがあります。

acms_corrector.jpg

このモジュールでは、現在地からの距離を表示する変数「{geo_distance}」が使用できますが、バージョン2.8の時点では、表示はメートル単位での半角数字となるため、長距離の場合は距離感がわかりづらくなります。

一般にはJavaScriptを使用して動的に整形することが多いのですが、PHPで文字列を整形する「校正オプション」を自作して、以下のルールで自動表示する校正オプションを作ってみました。

  • 1,000m未満では、そのまま「m」で表示
  • 1,000m以上では、小数点第一位に変換して「km」で表示

校正オプションを作る

以下のパスに格納されている、追加校正オプションの定義ファイルをテキストエディタで開きます。

2.8系以降
(a-blog cmsを設置したパス)/extension/acms/Corrector.php

2.8系以前
(a-blog cmsを設置したパス)/php/ACMS/User/Corrector.php

Corrector.phpでは、「ACMS_User_Corrector」クラス内に文字列を加工する処理を書きます。

class ACMS_User_Corrector
{
// ここに校正オプションを書くと追加される
}

距離変換を行う処理は以下の通りです。

校正オプションと同じ名前の関数を作成し、第一引数に「$txt」を指定すると、そこに対象となる文字列が入るので、加工してreturnで返すだけです。

引数を指定する校正オプションを作成する場合は、「未指定の場合の初期値」を設けてやると親切です。

acms_corrector.php
class ACMS_User_Corrector
{

    /**
     * distance
     * 数値を距離に変換する
     *
     * @param  string $txt  - 校正オプションが適用されている文字列
     * @return string       - 校正後の文字列
     */
    public static function distance($txt, $args = array())
    {
        // 例 {var}[distance(2)]
        // {var}は強制的に数値に変換される
        // 1000未満の場合は単位がm
        // 1000以上の場合は単位がkm
        // 引数: 丸める小数点の位、指定なしの場合は1

        $round = isset($args[0]) ? (int)$args[0] : (int)1;

        if ( (float)$txt >= 1000 ) {
            return round( ( (float)$txt / 1000 ) , $round ) . 'km';
        } else {
            return $txt . 'm';
        }

    }

}

テーマ側に校正オプションを反映する

校正オプションができたら、{geo_distance}の後ろに校正オプションを追加します。

{geo_distance}[distance]

冒頭の画像のように距離が表示されていれば問題ありません。


a-blog cmsはデフォルトの段階で多彩な校正オプションが実装されているため、自作する機会はあまり多くありませんが、コンテンツによって柔軟な出力を行いたいときに、自作をするといろいろ捗ります。

https://developer.a-blogcms.jp/document/reference/proofreading.html