PowerCMS Xでこれやるときどうしたらいいのメモ

PowerCMS Xで主にビュー(テンプレート)を書くときの社内向けTips集です。公式のドキュメントになくて調べたり、メーカーに確認した内容などを掲載します。
この記事は2020年5月の執筆ですが、製品自体の更新頻度が非常に高く、鮮度がすぐ落ちる可能性があります。賞味期限にはご注意ください。
属性・モディファイア
replaceでhtmlタグを変換したい
View
<mt:setvarblock name="br"><br></mt:setvarblock>
<mt:EntryTitle replace="'$br',' '">
属性値にそのまま< >を入れるとパースエラーになるため、一旦変数に格納します。PHPのstr_replaceは複数の値を置換可能なので一度試してみましたが、これはNGでした。
ステータスが○○のオブジェクトを表示/非表示にしたい
View
<mt:entries include_draft> // 下書きを含む
<mt:entries status="0"> // 下書きのみ
<mt:entries status_not="0"> // 下書きを除く
<mt:entries status_lt="3"> // レビュー以下のみ
有効期限対応のモデルかどうかで「公開」の値が2だったり4だったり変わるので注意が必要です。
文字数を取得したい、けどcount_charactersがない?
View
<mt:var name="foo" count_characters> // NG
<mt:var name="foo" count_chars> // OK
ドキュメントを見てもあのモディファイアがないんだけど…と思ったらlib/class.paml.phpを探すとあることもあるかもしれません。
if文
複数の値のいずれかと同値の場合の分岐を作りたい
View
<mt:if name="foo" like="bar|baz">...</mt:if> // NG
<mt:if name="foo" match="bar|baz">...</mt:if> // OK
likeはMTのような正規表現マッチングではなくstrposらしいので。
elseifで同じ変数に対して比較する分岐を作りたい
View
<mt:if name="foo" eq="bar">
...
<mt:elseif eq="baz"> // NG
...
<mt:elseif name="foo" eq="baz"> // OK
...
MT、PowerCMSではname属性の省略ができるけど、PowerCMS Xではできないよという話です。
変数操作
配列の値を$で展開したい
View
<mt:Entries keyword="$request.keyword">... // NG
<mt:var name="request.keyword" setvar="keyword">
<mt:Entries keyword="$keyword">... // OK
直接はできないので一旦別名の変数に格納します。
変数名を変数で指定したい
View
<mt:setvar name="foo" value="bar">
<mt:setvar name="baz" value="foo">
<mt:var name="$baz"> // bar
いわゆる可変変数が使用可能です。多用するとプログラムチックなソースになってcmsのテンプレートとしては取り回しが悪くなるので注意。
+1したい
View
<mt:var name="foo" increment setvar="foo"> // +1
<mt:var name="foo" increment="2" setvar="foo"> // +2
<mt:var name="foo" decrement setvar="foo"> // -1
ドキュメントにはmathを使った四則演算が記載されていますが、単純な加算、減算はモディファイアが用意されています。インクリメントというと1ずつ増やすイメージですが、+2もできます。
変数の値を初期化したい
View
<mt:setvar name="foo"> // NG
<mt:setvar name="foo" value=""> // OK
valueの省略ではなく、空文字を指定します。配列の初期化もこれでOK。
このページのURLを出力したい
View
<mt:CanonicalURL> // NG
<mt:var name="current_archive_url"> // OK
class.Prototype.phpを覗くとドキュメントに記載されていない予約変数がいろいろ(公式にサポートされているかはともかく)あります。実際に使うのはWebsite(デフォルト)テーマで利用例がわかるものだけにしておいた方がいいかもしれません。
タグの出力値を一度変数に格納して…というのが面倒
View
<mt:Entries>
<mt:var name="id"> // <mt:entryid>と同値
</mt:Entries>
ダイナミックタグ内ではカラム名がそのまま予約変数となるようです。逆にこれを知らないと外側のスコープで同名の変数使ってしまって上書きしてしまうことも。オブジェクトのコンテキストでは一般的な変数名に注意が必要です。
URLマップ
年別アーカイブ・月別アーカイブを作りたい
アーカイブ種別:インデックス
コンテナ:対象のモデル
再構築トリガー:設定不要 // コンテナ指定すると更新したオブジェクトの関係する年だけ更新する
日付ベース:年別
種別がインデックスなのがポイントです。インデックスなのに複数ページ生成されるのがMT/PowerCMS経験者だと違和感あると思いますが、これはこういうものらしい。
特定のカラムの値に応じて詳細ページを出力するかどうか制御したい
<mt:if tag="entryflag"><mt:entrybasename>.html</mt:if>
MT/PowerCMSでは非推奨でしたが、PowerCMS XではOKとのこと。
その他
あるカラムの値が「空かどうか」を条件に抽出したい
View
<mt:Entries cols="id,keywords">
<mt:if tag="entrykeywords">
<mt:entryid setvar="entry_id">
<mt:setvar name="entry_ids" value="$entry_id" function=" push">
</mt:if>
</mt:Entries>
<mt:Entries ids="$entry_ids">
</mt:Entries>
colsは抽出対象のカラムを制限します。特にカラム数が多い場合に有効です。
ただPowerCMS Xではカラムのデータ型を真偽値とした場合、必ず0か1が入るようなので、テキストが設定されているかどうかよりもフラグ用のカラムを作った方が効率いいと思います。その場合は<mt:Entries flag="0">といった書き方が可能です。
バッチで全体の再構築をしたい
cd path/to/powercmsx; sudo -u apache php ./tools/rebuildFiles.php archive
全ワークスペースに対して実行します。特定箇所だけ再構築したい場合はPHPを書く必要あり。