MODX Evolution 1.0.14J-r9 をリリースしました

2015年3月19日 13時00分 shortlink:http://modx.jp/?id=1021

MODX Evolution 1.0.14J-r9をリリースしました。不具合修正と表示速度向上に重点を置いた長期安定版です。

※3月23日追記 細かい不具合が複数見つかったため、修正のうえパッケージを差し替えました。23日以前に当バージョンを導入済みの場合は、managerフォルダを上書きしてください。

ダウンロード

https://modx.jp/download/download_evo.html
上記からダウンロードしてください。

アップデートの手順

https://modx.jp/docs/update.html

上記を参照してください。

変更内容

不具合修正

仕様変更

新しいAPI

※API関数は体系的な整理がまだよく練られていないため今後多少の調整が続く可能性があります。

改善

トピックス

パーサの基本処理を大幅に改善

スニペットコールや各種の変数タグを展開するパーサの処理を大幅に改善。より精密な処理とページ表示の高速化を実現しました。

内蔵PHxの処理を改善

内蔵PHxの処理を改善しました。複数のモディファイアを数珠つなぎにしても正確に動作します。

内蔵PHxの記法を改善

複数のモディファイアを数珠つなぎ(フィルターチェーン)にした時に分かりやすいように、記法を改善しました。

[*pagetitle:find=`new`:then=`新製品情報`:else=`通常ニュース`*]
[*longtitle:ifempty=`[*pagetitle*]`:sprintf=`<h3>%s</h3>`*]

従来の記法

[*pagetitle:FIND(new):THEN(新製品情報):ELSE(通常ニュース)*]
[*longtitle:ifempty([*pagetitle*]):sprintf(<h3>%s</h3>)*]

新しい記法。モディファイアは大文字小文字を区別しなくなったので、場合によっては上記のように大文字で書くと分かりやすくなります。

[*longtitle:ifempty([*pagetitle*]):sprintf('<h3>%s(製品情報)</h3>')*]

オプションに半角カッコを含める場合はクォートで囲みます。ダブルクォート・バッククォートも使えます。

従来の記法も使えます。好みに応じて使い分けてください。

内蔵PHxのモディファイアを充実

MovableTypeのグローバル・モディファイアを移植しました。

_default - このモディファイアを付与した変数の値が空の場合に出力する値を設定します。既存のifemptyモディファイアの別名として動作します。
capitalize - 最初の文字を大文字にします。変数の値が複数の単語が含まれている場合、それぞれの単語に対して処理します。
cat - 任意の文字列を末尾に追加します。たとえば変数に人名が入力されている時に「様」「さん」などを追加したい場合などに使えます。既存の「. 」モディファイアの別名として動作します。
count_characters - 文字数 (空白を含む) を出力します。既存のstrlen・len・lengthモディファイアの別名として動作します。
count_paragraphs - 段落数(空白行を含まない行数)を出力します。
count_words - 変数の値に含まれる単語 (半角の空白文字で区切られた文字の塊) の数を出力します。
decode_html - 変数の値に含まれるすべての HTML エンティティをデコードします。アメブロのRSSフィードのように、エンティティ化されたコンテンツを扱う場合の前処理に用いるとよいでしょう。
decode_xml - 具体的な挙動が不明なため移植予定なし
dirify - 移植予定なし
encode_html - 変数の値をHTML エンコードします。PHP関数htmlspecialchars()を実行します。
encode_js - javascript の文字列の値として使えるようにエンコードします。$modx->db->escape()を実行します。
encode_php - 移植予定なし
encode_sha1 - 変数の値をsha1形式に変換して出力します。別名sha1モディファイアとしても利用できます。
encode_url - ブラウザのアドレスバーで利用できるURL文字列形式にエンコードします。既存のurlencodeモディファイアの別名として動作します。
encode_xml - 移植予定なし
escape - 移植予定なし
filters - 移植予定なし
indent - 移植検討中
lower_case - 変数の値を小文字 (abc...) に変換します。既存のstrtolowerモディファイア・lcaseモディファイアの別名として動作します。
ltrim - 文字列先頭の複数の空白/スペースを全て削除します。
mteval - 移植を検討する意味はありますが、CMSとしての考え方が異なるため当面は移植予定なし。
nl2br - 改行を <br />タグに変換します。
nofollowfy - 移植予定なし
numify - 移植予定なし
regex_replace - 正規表現による文字列置換を行ないます。別名preg_replaceモディファイアとしても利用できます。
remove_html - HTML タグを除去します。除去ないタグをオプションで複数指定できます。strip_tagsモディファイア・notagsモディファイアの別名として動作します。
replace - 任意の文字列を置換できます。たとえば[*content:replace(MODx,MODX)*]と書くと、文中の「MODx」を「MODX」に統一できます。別名str_replaceモディファイアとしても利用できます。
rtrim - 文字列末尾の複数の空白/スペースを全て削除します。
sanitize - 移植を検討中です。
setvar - 受け取った変数の値は出力せず、オプションで指定した名前のプレースホルダに格納します。つまりプレースホルダを新規作成するモディファイアとして動作します。工夫次第で様々な応用が可能です。
smart_dashes - 移植予定なし
smart_ellipses - 移植予定なし
smart_quotes - 移植予定なし
smarty_pants - 移植予定なし
space_pad - 移植検討中
spacify - 移植検討中
spam_protect - メールアドレス文字列を、SPAMボットに拾わにくい文字列に変換します。
sprintf - 変数の内容を printfフォーマットで変換します。使用例:[*longtitle:sprintf(<h2>%s</h2>)*]
string_format - sprintfモディファイアと同じ
strip - 半角空白文字や改行・タブを任意の文字列に変換します。
strip_linefeeds - 改行コードを削除します。
strip_tags - remove_htmlモディファイアと同じ
trim - 文字列先頭と末尾の複数の空白/スペースを全て削除します。
trim_to - 最初の N 文字を取り出します。
upper_case - タグの値を大文字 (ABC...) にします。既存モディファイアstrtoupper・ucaseの別名として動作します。
wrap_text - 指定した文字数ごとに改行します。禁則処理を行なわないため日本語の文章を処理する場合は句読点の扱いなどに注意が必要です。
zero_pad - 移植を検討中です。

複数のモディファイアを数珠つなぎにできるため、組み合わせ次第で複雑な処理が可能ですが、あまり複雑になると分かりにくくなるため、場合によっては一連の処理をまとめてスニペット化するなど検討してください。

その他の新規PHxモディファイア

addBreakモディファイア - 改行を<br />タグに変換します。nl2brモディファイアと違い、<table>タグや<div>などブロック要素に対しては処理を行ないません。

<table><br />
    <tr><td><br />
        あいうえお<br />
        かきくけこ<br />
    </td></tr><br />
</table><br />

nl2brモディファイアの場合。無条件で<br />タグを追加します。

<table>
    <tr><td>
        あいうえお<br />
        かきくけこ<br />
    </td></tr>
</table>

addBreakモディファイアの場合。ブロック要素で閉じられた行には<br />タグを追加しません。

dataGridモディファイア - CSVデータまたはTSVデータ(タブ区切り)をtableタグによる表組みに変換します。エクセルからコピー・ペーストで貼り付けたデータはタブで区切られており、そのまま表組みを再現できます。

summaryモディファイア(別名smart_desc) - 文章の一部を切り出します。指定された文字数ちょうどで切り出すlimitモディファイアと違い、句点(。)を考慮した自然な切り出しを行ないます。

<!--@IF:[*description*]-->
<meta name="description" content="[*description*]">
<@ELSE>
<meta name="description" content="[*content:summary*]">
<@ENDIF-->

利用例

http://chibinowa.net/modx/features/modifier.html
その他、既存のモディファイアの使い方については上記サイトをご覧ください。

スニペットに対してmathモディファイアを使えるように改善

MODXは誕生してから19年が経過しました。

という文章を簡単なスニペットとmathモディファイアを使ってシンプルに自動生成したい場合。

return time();

UNIXタイムスタンプを返す上記のような簡単なスニペットを「Now」という名前で作ります。

[[Now:dateFormat(Y):math(?-2005):hanzen]]

上記のように記述すると、mathモディファイアのプレースホルダ文字である「?」のためにスニペットが意図どおりに動作しません。(※後日コアを改善する予定です)

[[Now:dateFormat(Y):math(%s-2005):hanzen]]

プレースホルダとして「%s」を使えるようにしました。

MODXは誕生してから[[Now:dateFormat(Y):math(%s-2005):hanzen]]年が経過しました。

PHxのフィルター処理を任意の文字列に対して直接適用できるようにしました

[+@test@example.com:spam_protect+]

上記のように記述すると、

<script>document.write('test&#64;example&#46;com');</script>

メールアドレス文字列をスパムロボットに検出されにくい書式に変換します。

[+@0123456789abcdefghijklmnopqrstuvwxyz:shuffle:limit(8)+]

パスワード候補などに使えるランダム文字列を生成します。

[+@'http://www.yahoo.co.jp':replace_to('<a href="{value}">{value}</a>')+]

コロン( : )を含む文字列の場合はクォート( ' " `)で囲みます。

<a href="http://www.yahoo.co.jp">http://www.yahoo.co.jp</a>

実際の出力

<table>
<tr><td>商品名</td><td>品番</td><td>備考</td></tr>
[+@商品A|aaa012345|あいうえお:replace(|,</td><td>):sprintf(<tr><td>%s</td></tr>)+]
[+@商品B|bbb012345|かきくけこ:replace(|,</td><td>):sprintf(<tr><td>%s</td></tr>)+]
[+@商品C|ccc012345|さしすせそ:replace(|,</td><td>):sprintf(<tr><td>%s</td></tr>)+]
</table>

<table>
<tr><td>商品名</td><td>品番</td><td>備考</td></tr>
<tr><td>商品A</td><td>aaa012345</td><td>あいうえお</td></tr>
<tr><td>商品B</td><td>bbb012345</td><td>かきくけこ</td></tr>
<tr><td>商品C</td><td>ccc012345</td><td>さしすせそ</td></tr>
</table>

実際の出力

従来は、PHxの機能自体を利用したい場合は、チャンクやテンプレート変数を作って、その中に値を保存する必要がありました。今回の改善により、PHxの機能を手軽に利用できるようになりました。

※ [+@文字列+]という書式は暫定的なものなので、将来変更する可能性があります。
※現在のところ文字列には : (コロン)を含むことができません。次バージョンで対応します。

[+@
いろはにほへと,ちりぬるを
わかよたれそ,つねならむ
うゐのおくやま,けふこえて
あさきゆめみし,ゑひもせす
:dataGrid+]

複数行記述にも対応します。

いろはにほへとちりぬるを
わかよたれそつねならむ
うゐのおくやまけふこえて
あさきゆめみしゑひもせす

このように表示されます。

@IF文の書式を改善

1.0.13Jより試験的に実装していた@IF記法を改善しました。

<!--@IF:[*isfolder*]-->
    [[Ditto?tpl=サブリソース一覧]]
<!--@ELSE-->
    [*content*]
<!--@ENDIF-->

上記の従来の記法では、@IF文が書かれたテンプレートをファイル化しブラウザで開いてプレビューすると、判定の結果表示されるHTMLブロックがそのまま表示され、@ELSE句が書かれていると両方表示されるため問題がありました。

<!--@IF:[*isfolder*]>
    [[Ditto?tpl=サブリソース一覧]]
<@ELSE>
    [*content*]
<@ENDIF-->

新しい記法は上記のとおり。

<!--@IF:[*isfolder*]>
    [[Ditto?tpl=サブリソース一覧]]
<@ELSE>
    [*content*]
<@ENDIF-->

今回の記法改善により@IFから@ENDIFまで全てをHTMLコメント化できますので、DreamweaverやTinyMCEなどで編集する際にMODX独自の記述として干渉しません。

内蔵PHxにおいてthen-elseモディファイアの記述を省略可能に

isモディファイアなど判定系のモディファイアを利用する場合に、then-elseモディファイアの記述を省略できるようにしました。省略した場合、1または0の値を返します。

<!--@IF:[*pagetitle:find(new):then(1):else(0)*]>
【新着情報!】[*pagetitle*]
<@ENDIF-->

たとえば上記のような場合、

<!--@IF:[*pagetitle:find(new)*]>
【新着情報!】[*pagetitle*]
<@ENDIF-->

このように記述することができます。

<!--@IF:[*template:is(3)*]>
<h2 class="blog">[*pagetitle*]</h2>
<@ELSE>
<h2>[*pagetitle*]</h2>
<@ENDIF-->

テンプレートごとの出し分けをシンプルに記述できます。

MODXの@IF文は値の有無しか判定できませんが、PHxフィルターを利用することで、複雑な判定を行なうことができます。今回の改善によりthen-elseモディファイアを省略できるようになったため、フィルター記述をシンプルにすることができます。

@IF文は値の有無を判定する構文なので、ifemptyモディファイアやifnotemptyモディファイアを使う場合も @IF文に書き換えることができます。

MODXタグ文字列を表示できるようにしました

[<!---->*pagetitle*<!---->]

こう記述すると、文字列として [*pagetitle*] を表示できます。従来もこの方法で表示できましたが、<!---->という文字列がHTMLソースとして含まれるため、TinyMCEが動作している投稿画面上にコピー・ペーストするとMODXタグとして機能しないという問題があり、これを解決しました。

任意のリソースのデータを表示する方法を追加しました

[*pagetitle@8*]

上記のように記述すると、ID8のリソースのpagetitleを表示します。この記法は本家版MODX EvolutionのフォークプロダクトであるClipperCMSの記法に倣いました。

[*pagetitle@parent*]

親リソースのpagetitleを表示します。

[*pagetitle@ultimateParent*]

現在のリソースを子孫?に持つ最上位のリソースのpagetitleを表示します。

[*pagetitle@3/ultimateParent*]

現在のリソースを子孫に持ち、ID3のリソース階層以下に属する最上位のリソースのpagetitleを表示します。

[*pagetitle@ultimateparent*]
[*pagetitle@ULTIMATEPARENT*]

大文字小文字の違いを区別しません。

[*pagetitle@p*]
[*pagetitle@up*]

略記できます。それぞれparent・ultimateParentです。

[*pagetitle@site_start*]

あまり用途はないかもしれませんが、トップページのpagetitleを表示できます。

[*pagetitle:8*]

1.0.14J-r8で利用可能になった上記の記法も使えますが、この記法は内蔵PHx機能のIDモディファイアの略記なので、処理内容は異なります。

注意点

テンプレート変数編集画面内でのスニペットコール記述

1.0.14J-r8からテンプレート変数編集画面内のオプション欄などでスニペットコールを記述できるようにしましたが、スニペットコール文字列自体をそのまま値として保存したい場合に問題があることが分かったため、仕様を改めました。

@PARSE:
[[スニペットコール]]

または

@MODX:
[[スニペットコール]]

このように記述してください。(どちらも同じです)

テンプレート変数編集画面のオプション欄で動作させるタイプのスニペットとしてはddTreeなどがあります。これらのスニペットを使うには、従来は@EVAL制御下で$modx->runSnippet()を通じて呼び出す必要がありましたが、今回の改善により、スニペットコールをそのまま記述することで動作させることができるようになります。

@EVAL:
return $modx->runSnippet('ddTree',array('doc'=>8));

従来はこう書く必要がありましたが

@PARSE:
[[ddTree?doc=8]]

このように書くことができます。

@IF文の記法を変更

<!--@IF:[*richtext*]-->
  [*content*]
<!--@ELSE-->
  [*content:trim:addBreak*]
<!--@ENDIF-->

従来はこのように記述していました。
このテンプレートをファイル化してブラウザで開くと、[*content*]と[*content:addBreak*]の両方が表示されてしまいます。

<!--@IF:[*isfolder*]>
  [*content*]
<@ELSE>
  [*content:trim:addBreak*]
<@ENDIF-->

従来の記述も使えますが、今回よりこのように記述することをおすすめします。
ブラウザでプレビューできるようにする場合は、@IGNORE文を使ってダミーテキストを埋めておくとよいでしょう。

$modx->toDateFormat()関数の返り値を調整

$modx->toDateFormat()関数に対して0(ゼロ)を渡すと従来は1970/01/01を返していましたが、0 を返すようにしました。そのため0が返ることを想定していないコードにおいて意図しない結果になることがあります。

PHxモディファイアと同名のスニペットに注意

Revolutionと同様に、PHxのプリセットモディファイアの機能を同名のスニペットで置き換えられるようにしています。そのため、特に意識せず同名のスニペットを運用している場合は、モディファイア記述において誤動作が起きることがあります。

たとえば「date」というスニペットが存在する場合は[*editedon:date(Y年m月d日)*]などの記述は意図しない出力になることがあります。特定のモディファイアのみ動作が怪しい場合は、同名のスニペットがないか確認してください。

次リリースの予定

次の1.0.15Jでは下記のような変更を予定しています。

その他

気付いた点があればフォーラムまたは問い合わせフォームからフィードバックをお願いします。開発に参加して自ら機能追加・改善などを行なってみたい方もお気軽にご連絡ください。

http://mblo.info/modifiers/
上記に内蔵フィルターのチートシートがあります。全て動作確認済みとのことです。

PR

  • KAGOYA
  • ASP at AKIHABARA Japan
  • CMS AWARDS 2007 Winner
ページトップへ