PowerCMS™
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[新着情報] 多要素認証設定画面の QR コードが表示されない問題への対策ファイル を追加しました。
[新着情報] PowerCMSクラウド 月額費用の価格改定に関する追加情報を公開します を追加しました。
[よくあるご質問] サポートサイトへ登録しているアカウントの情報を変更することはできますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > テンプレート作成Tips > 日付のテンプレートタグから元号を取得する

2019年12月26日

日付のテンプレートタグから元号を取得する

令和元年も8か月経ち残り数日です。令和ネタも気温も冷え込んだこの期に及んで、テンプレートで日時の情報から元号を得ることについて書きます。

まず、基本に忠実に、このような課題を解決するには、テンプレートでごちゃごちゃせずに、プラグインを書けということになります。 スタティックパブリッシングのみ対応ですが、日付に関するテンプレートタグの format モディファイアで、和暦表示を可能にする「JPEraFormats プラグイン」があります。

テンプレート

テンプレートならこのような解が考えられます。

<$MTSetVar name="undef(_japanese_eras)"$>
<$MTVar name="_japanese_eras" key="明治" value="18681023"$>
<$MTVar name="_japanese_eras" key="大正" value="19120731"$>
<$MTVar name="_japanese_eras" key="昭和" value="19261226"$>
<$MTVar name="_japanese_eras" key="平成" value="19890108"$>
<$MTVar name="_japanese_eras" key="令和" value="20190501"$>
<MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}"
  ><$MTVar name="_result" value=""
  $><MTIf name="_with_year"
    ><$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy"
  $></MTIf
  ><MTLoop name="_japanese_eras" sort_by="value numeric reverse"
    ><MTUnless name="_result"
      ><MTIf name="_yyyymmdd" ge="$__value__"
        ><MTSetVarBlock name="_result"
          ><$MTVar name="__key__"
          $><MTIf name="_with_year"
            ><$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val"
            $><$MTSetVar name="_yyyy" op="-" value="$_val"
            $><MTIf name="_yyyy"
              ><$MTSetVar name="_yyyy" op="++"
            $><MTElse
              ><$MTVar name="_yyyy" value="元"
            $></MTIf
          ><$MTVar name="_yyyy"$>年</MTIf
        ></MTSetVarBlock
      ></MTIf
    ></MTUnless
  ></MTLoop
  ><$MTVar name="_result"
$></MTSetVarTemplate>

出力結果から空白文字をなくすため、行頭が「>」で始まる変則的なテンプレートにしています。社内から「わかりにくい、誤解を招く」といった意見がありましたので、別版も後述します。

使い方

  1. まずは元号を得たい箇所でこのテンプレートを書くか、このテンプレートをテンプレートモジュール化して MTInclude タグで読み込むなどしておきます。
  2. 次に「<$MTDate format="%Y%m%d"$>」や「<$MTEntryDate format="%Y%m%d"$>」で、「20191226」のような8桁の日付情報を得ます。
  3. そして、
    • 8桁の日付をテンプレート変数「_yyyymmdd」に代入し、テンプレート変数「_tmpl」のキー「yyyymmdd_to_japanese_era」(_tmpl{yyyymmdd_to_japanese_era}) でテンプレート片を呼び出します。
    • あるいは呼び出すときに、「<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="20181226"$>」や「<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="$foo"$>」のようにして日付を渡します。
  4. モディファイア「_with_year」で、「平成31年」や「令和元年」のように年も取得できます。

記述例です。

<$MTDate format="%Y%m%d" setvar="_yyyymmdd"$>
<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$>
<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$>

出力結果です。

令和
令和元年

テスト

<$MTSetVar name="undef(test_dates)"$>
<$MTVar name="push(test_dates)" value="18681022"$>
<$MTVar name="push(test_dates)" value="18681023"$>
<$MTVar name="push(test_dates)" value="19120730"$>
<$MTVar name="push(test_dates)" value="19120731"$>
<$MTVar name="push(test_dates)" value="19261225"$>
<$MTVar name="push(test_dates)" value="19261226"$>
<$MTVar name="push(test_dates)" value="19700101"$>
<$MTVar name="push(test_dates)" value="19890107"$>
<$MTVar name="push(test_dates)" value="19890108"$>
<$MTVar name="push(test_dates)" value="20190430"$>
<$MTVar name="push(test_dates)" value="20190501"$>
<$MTVar name="push(test_dates)" value="20200101"$>
<$MTVar name="push(test_dates)" value="21171231"$>
<MTLoop name="test_dates"><MTIf __first__><ol></MTIf>
  <$MTVar name="__value__" cat="090000" setvar="ts"$>
  <$MTDate ts="$ts" format="%Y%m%d" setvar="_yyyymmdd"$>
<li><$MTDate ts="$ts" format_name="iso8601"$><ul>
<li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$><$MTDate ts="$ts" format="%b月%e" strip=""$>日
<li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$>時代です。
</ul>
<MTIf __last__></ol></MTIf></MTLoop>

テスト結果です。

  1. 1868-10-22T09:00:00+09:00
    • 10月22日
    • 時代です。
  2. 1868-10-23T09:00:00+09:00
    • 明治元年10月23日
    • 明治時代です。
  3. 1912-07-30T09:00:00+09:00
    • 明治45年7月30日
    • 明治時代です。
  4. 1912-07-31T09:00:00+09:00
    • 大正元年7月31日
    • 大正時代です。
  5. 1926-12-25T09:00:00+09:00
    • 大正15年12月25日
    • 大正時代です。
  6. 1926-12-26T09:00:00+09:00
    • 昭和元年12月26日
    • 昭和時代です。
  7. 1970-01-01T09:00:00+09:00
    • 昭和45年1月1日
    • 昭和時代です。
  8. 1989-01-07T09:00:00+09:00
    • 昭和64年1月7日
    • 昭和時代です。
  9. 1989-01-08T09:00:00+09:00
    • 平成元年1月8日
    • 平成時代です。
  10. 2019-04-30T09:00:00+09:00
    • 平成31年4月30日
    • 平成時代です。
  11. 2019-05-01T09:00:00+09:00
    • 令和元年5月1日
    • 令和時代です。
  12. 2020-01-01T09:00:00+09:00
    • 令和2年1月1日
    • 令和時代です。
  13. 2117-12-31T09:00:00+09:00
    • 令和99年12月31日
    • 令和時代です。

テンプレートの異版

<$MTSetVar name="undef(_japanese_eras)"$>
<$MTVar name="_japanese_eras" key="明治" value="18681023"$>
<$MTVar name="_japanese_eras" key="大正" value="19120731"$>
<$MTVar name="_japanese_eras" key="昭和" value="19261226"$>
<$MTVar name="_japanese_eras" key="平成" value="19890108"$>
<$MTVar name="_japanese_eras" key="令和" value="20190501"$>
<MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}"><MTFor strip="">
  <$MTVar name="_result" value=""$>
  <MTIf name="_with_year">
    <$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy"$>
  </MTIf>
  <MTLoop name="_japanese_eras" sort_by="value numeric reverse">
    <MTUnless name="_result">
      <MTIf name="_yyyymmdd" ge="$__value__">
        <$MTVar name="__key__" setvar="_result"$>
        <MTIf name="_with_year">
          <$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val"$>
          <$MTSetVar name="_yyyy" op="-" value="$_val"$>
          <MTIf name="_yyyy">
            <$MTSetVar name="_yyyy" op="++"$>
          <MTElse>
            <$MTVar name="_yyyy" value="元"$>
          </MTIf>
          <MTSetVarBlock name="_result" append="1"><$MTVar name="_yyyy"$>年</MTSetVarBlock>
        </MTIf>
      </MTIf>
    </MTUnless>
  </MTLoop>
  <$MTVar name="_result"$>
</MTFor></MTSetVarTemplate>

さあ帰ろう。


カテゴリー
PowerCMS 4
PowerCMS 5
テンプレート作成Tips

Recent Entries