本文へジャンプ

PowerCMS Xで、JSONから配列を作る。

※これはPowerCMS X Advent Calendar 2024の19日目の記事です。

先日はMovable Typeでjson形式テキストから配列を作成してみました。
今回は同様のことをPowerCMS Xでやってみた場合をご紹介します。

連想配列・多重配列の場合

01:記事一覧の配列を作る

「SET_記事データ」という配列に、記事タイトルとURLを格納して、その配列を「ARY_記事一覧」の値とします。
※以下サンプルです。実際はもっとフィルタリングを用意すると思いますがサンプルなので簡易的にしてあります。

<mt:Entries lastn="10">
<mt:SetVarBlock name="SET_KEY"><$mt:EntryDate format="YmdHis"$>_<$mt:EntryID zero_pad="8"$></mt:SetVarBlock>

<$mt:Unset name="SET_記事データ"$>
<mt:SetHashVar name="SET_記事データ">
 <mt:SetVarBlock name="SET_タイトル"><$mt:EntryTitle remove_html$></mt:SetVarBlock>
 <mt:SetVarBlock name="SET_リンクURL"><$mt:EntryPermalink relative$></mt:SetVarBlock>
</mt:SetHashVar>
<$mt:SetVar name="ARY_記事一覧" key="$SET_KEY" value="$SET_記事データ"$>
</mt:Entries>

※ <$mt:Unset$>で、変数を初期化(未定義)しています。

【メモ】変数「ARY_記事一覧」に格納されている構造イメージ

├ SET_KEY
| ├  SET_タイトル
| └  SET_リンクURL
└ SET_KEY
  ├  SET_タイトル
  └  SET_リンクURL

※配列の中身は、<$mt:VarDump name="ARY_記事一覧"$> で確認することができます。

02:作成した配列を出力する

「ARY_記事一覧」をloopで回して、値(value)を出力します。
配列の中の配列を出力する場合は、Loopの入れ子でも可能です。
今回は、階層が深くないので「__value__」に「key」を添えて直接出力しています。

<mt:Loop name="ARY_記事一覧" limit="5" sort_by="key reverse">
<div>
 <a href="<$mt:Var name="__value__" key="SET_リンクURL"$>">
     <span><$mt:Var name="__value__" key="SET_タイトル"$></span>
 </a>
</div>
</mt:Loop>

※ <$mt:Var name="__value__" key="SET_リンクURL"$>は、<$mt:Var name="__value__[SET_リンクURL]"$>とも書けます。

json形式テキストの場合

01:「json形式のテキスト」を作る

変数「SET_記事一覧_base」に、json形式でソート用の番号、記事タイトルとURLを追記(append)していきます。

<mt:Entries lastn="10">
<mt:SetVarBlock name="SET_KEY"><$mt:EntryDate format="YmdHis"$>_<$mt:EntryID zero_pad="8"$></mt:SetVarBlock>

<mt:SetVarBlock name="SET_記事一覧_base" append>
<mt:Unless trim_space="3">
{
"SET_番号":"<$mt:Var name="SET_KEY"$>",
"SET_タイトル":"<$mt:EntryTitle remove_html encode_json$>",
"SET_リンクURL":"<$mt:EntryPermalink relative encode_json$>"
},
</mt:Unless>
</mt:SetVarBlock>
</mt:Entries>

※ <mt:Unless>は、<mt:Block>でも代用できます。
※ 「trim_space="3"」は、文字列の先頭および末尾にある空白と改行文字が削除されます。

02:「json形式のテキスト」を整形する

作成した「SET_記事一覧_base」を整形します。最初と最後に[]を追加します。 さらに、最後の項目のカンマ対策で、中身なしの{}を追加します。

<mt:SetVarBlock name="SET_記事一覧_json"> [ <$mt:GetVar name="SET_記事一覧_base" regex_replace="'/,$/',''"$> ] </mt:SetVarBlock>

※ グローバルモディファイア「regex_replace」:正規表現置換で末尾のカンマを削除しています。
※ 文字列型の値を呼び出す場合は <mt:Var>ではなく、<mt:GetVar> を使ったほうが処理が速くなります。

【メモ】「SET_記事一覧_json」の中身はこうなってる

[
 { "SET_番号":"20241025000000_00000000" , "SET_タイトル":"タイトル" , "SET_リンクURL":"http://www"},
 { "SET_番号":"20241025000000_00000000" , "SET_タイトル":"タイトル" , "SET_リンクURL":"http://www"},
 { "SET_番号":"20241025000000_00000000" , "SET_タイトル":"タイトル" , "SET_リンクURL":"http://www"}
]

03:作成した「json形式のテキスト」を「配列」に変換する

グローバルモディファイア「from_json」を使用して、作成したjson形式のテキストを配列に変換します。

<$mt:Var name="SET_記事一覧_json" from_json="ARY_記事一覧"$>

※ 逆に、配列をjson形式に変換するには、グローバルモディファイア「to_json」を使います。

04:作成した配列を出力する

03で配列に変換したので、通常の配列同様にLoopタグで出力します。

<mt:Loop name="ARY_記事一覧" sort_by="key">
<div>
 <a href="<$mt:Var name="SET_リンクURL"$>">
     <span><$mt:Var name="SET_タイトル"$></span>
 </a>
</div>
</mt:Loop>

まとめ

前回同様の感想になりますが、
json形式のテキストから配列に変換したほうが、途中の値のチェックがしやすいのでデバッグしやすいなと個人的には思いました。

そして、同じMTMLでもMovableType、PowerCMS、PowerCMS Xではタグや書き方が微妙に違うので、
その環境にあったベストなコードで構築していきましょう。

タグリファレンスを見ていると、使ったことのないタグがまだたくさん。。。。勉強します!

CMS構築ならMONSTER DIVEまでご相談を!

MONSTER DIVEでは、PowerCMSをはじめ、Movable TypeやWordPressなど、CMSを活用したWebサイト構築のご相談、承っています。
お気軽お問い合わせください。

Recent Entries
MD EVENT REPORT
What's Hot?