blogスタッフブログ
HOME > スタッフブログ > CMS >従来から少し変更が必要なPowerCMS Xのテンプレート記法の紹介

従来から少し変更が必要なPowerCMS Xのテンプレート記法の紹介

この春、PowerCMS Xを採用した案件のテンプレート制作に初めて携わりました。基本的にはPowerCMS 5(及びMovable Type)と同じテンプレート記法なのですが、実際に書いてみると「あれ? 意図した動きにならない...」という場面に遭遇しました。

そこで、今回はみなさまにスムーズにPowerCMS Xのテンプレートを書いて頂けるよう、私がつまづいた点などをご紹介したいと思います。

regex_replaceでの置換が上手くいかないケース

よく使うregex_replaceですが、PowerCMS 5といくつが違う点があります。

検索対象文字列・置換文字列の書き方

今まではregex_replace="検索対象文字列","置換文字列"という書き方でしたが、PowerCMS Xでは以下のように記述します。

regex_replace="'検索対象文字列','置換文字列'"

言葉で表現すると、「ダブルクォーテーションの中にシングルクォーテーションで検索対象文字列と置換文字列をくくり、検索対象文字列と置換文字列の間はカンマで区切る」です。ダブルクォーテーションの中がCSVになるイメージです。

これはテンプレートをDOMDocumentで解釈するようになったことに起因します。

検索対象文字列や置換文字列にHTMLのタグを書きたい時

例えば<mt:EntryBody regex_replace="'/</?p>/',''" />のようにして本文からp要素を削除しようとしても、テンプレートが正しく解釈されませんでした。このような時は検索対象文字列や置換対象文字列を一旦変数に入れて変数を渡すようにします。

<mt:SetVarBlock name="regexp">/<\/?p>/</mt:SetVarBlock>
<mt:EntryBody regex_replace="'$regexp',''" />

これもテンプレートをDOMDocumentで解釈するようになったことに起因します。

後方参照を使用したい時

置換文字列で後方参照を使用したのですが、意図した挙動になりませんでした。これは$1$2の記述がPowerCMS Xの変数として認識されてしまうことによるものです。後方参照を使用する場合は、\$1\$2のように記述をします。(Macだとバックスラッシュ、Windowsだと円マークです。)

ifのtest属性を使用する時

頻度としては少な目ですが、変数を2つ以上チェックする必要があり、かつifを入れ子にしたくない時、ifのtest属性を使用するかと思います。PowerCMS Xでは以下のように記述をします。

<mt:If test="($a === 1 && $b === 'foo')">

PowerCMS XはPHPベースなので、文字列の比較をする時はeqなどではなく===を使用します。また全体をかっこでくくります。

setvarにop属性はなくmathタグを使う

階層を持つモデル(例えばカテゴリ)で今何階層目かを判断するためにhierarchy_levelという変数を用意し、値を1足したり引いたりしようと計画したのですが、意図した挙動になりませんでした。setvarタグにop属性はないようです。

代わりにmathタグがありますのでこれを使用します。以下は計算式がx - 1xは変数hierarchy_level、計算結果を変数hierarchy_levelに格納する例です。つまり今までSetVarで変数hierarchy_levelop="--"したのと同じです。

<mt:math eq="x - 1" x="$hierarchy_level" setvar="hierarchy_level" />

何かと便利なifinArray

配列に目的の値が存在するか否かを確認したい場合に使用できるとても便利なタグです。例えばタグに@formが含まれているかをチェックしたい場合、以下のようなテンプレートになります。

<mt:PageTags include_private="1"><mt:SetVarBlock name="page__tags" function="push"><mt:TagName /></mt:SetVarBlock></mt:PageTags>
<mt:IfInArray name="page__tags" value="@form">
<mt:Include module="Form" />
<mt:Else>
<mt:Include module="Page Detail" />
</mt:IfInArray>

まとめ

まずはPHPベースになったこと、テンプレートがDOMDocumentで解釈されるようになったことの2点に気を付ければ良いのではと考えています。ドキュメントもありますし、PowerCMS Xをご契約頂いたお客さまにはサポートもあるそうですので、安心してPowerCMS Xのテンプレート設計に取り組んで頂けるのではないかと思います。