この記事は、a-blog cms Advent Calendar 2017の10日目の記事です。
すみませんリマインダの日付間違えてて一日遅れました。
先日、12月9日のCMSMix Sapporo Vol.4のハンズオンでご紹介した、「校正オプション」の具体的な使い方です。
校正オプションとは
a-blog cmsでは、テンプレート内の変数の直後に、半角角カッコ([])で「表示内容を置換するルール」を指定することができます。これが「校正オプション」で、ほぼすべての変数に対して使用できます。
使用できるオプションの一覧は、下記を参照ください。
最もよく使われるのが、他のCMSでもよくある日付変換です。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「event_date」を、ゼロを付けない日付に置換して表示しています。
{event_date}[date('Y年n月j日')] -> 2017-01-01 -> 2018年1月1日
a-blog cms独自の校正オプション
a-blog cmsでは、国産ならではの、日付を和暦に変換する校正オプションもあります。下記のサンプルでは、YY-mm-dd形式で入力されたカスタムフィールド「my_birth」を、和暦で表示しています。
以下は私のお誕生日です。なにかください。
{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
実際のファイルは既にサンプルコードが入っていますが、アウトラインは以下の通りです。
<?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」で返された値を、本来の変数の値に変わって表示する
最も単純な構造だとこうなります。変数の内容が何であっても「_:(´ཀ`」∠):_」にして返します。
public static function simple($txt)
{
return '_:(´ཀ`」∠):_';
}
}
漢数字変換のサンプル
こちらで公開されている関数をそのまま流用できます。変数「$outstr」に、変数「$txt」を処理した内容を入れて返します。
PHPで半角数字を漢数字にする | ぱふぅ家のホームページ
https://www.pahoo.org/e-soul/webtech/php03/php03-05-01.shtm
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;
}
}
実際に利用する
以下のように書くだけです。
{player_lank}[kanjinum]段
その他の校正オプションの自作例
サイトによっては、以下のようなものを作ると便利かもしれません。
- 商品番号を別途サーバーに置いている商品情報APIに渡し、取得した情報を返す
- 変数が空のときのデフォルト値を、表示しているコンテンツによって変更する
- 正規表現検索を行い、特定のキーワードが入っていればマークアップする