MODX Evolution 1.0.5J-r7をリリースしました
2011年9月26日 12時00分 shortlink:http://modx.jp/?id=728
スニペットコールのパース処理を改善しました。MODX Revolutionと同じように、正規表現を用いずにスニペットコールを展開します。
正規表現によるパターン検出では、多様な記述への対応に限界がありました。今回の改善では、デリミタ文字を順序に従ってトレースすることにより、精密且つ負荷も抑えた処理を実現しています。
※リッチテキストエディタが有効な領域内では複数行記述はできません(<p>・<br />タグや などのHTMLエンティティがスニペットコール内に混入するため)。一行でつなげて記述する必要があります。
■MODX Evolution 1.0.5J Revision7 ダウンロード
http://code.google.com/p/modx-ja/downloads/detail?name=modx-1.0.5J-r7.zip
注意事項
【重要】TinyMCEプラグインのパスオプションの構成変更について
TinyMCEプラグインオプションの設定について、重要な変更があります。必須ではありませんが、オプション設定を更新する場合は、通常のアップデート手順だけではなく手作業による対応が必要です。
(※アップデートしたままでも既存の設定を引き継いで動作しますが、設定の変更はできません)
解説
- siteconfig
- rootrelative
- docrelative
- fullpathurl
従来は上記の4つの項目から設定を選択できるようになっています。href要素またはsrc要素に入力されたパス情報をTinyMCE側で判定して、記事内のパス表現を揃える設定です。
これを今回、
- Site config(デフォルト)
- Absolute path
- Root relative(推奨)
- URL
- No change
このように変更しました。「docrelative」を「Absolute path」という表現に改めた点が特に重要です。MODXはドキュメント(ページ)基準の相対パスをコントロールする仕組みを持っていません。また、「rootrelative」という表現も実際の動作とは異なり、絶対パスに変換していました。
新規に追加した「No change」オプションで、パスの自動変換を無効にできます。パスの出力をスニペットやチャンク・ウェブリンクで制御したい場合は、この設定を用いる必要があります。
オプション名は変わっていないため、項目構成の変更はアップデート作業では反映されません。古い設定値のままでも引き継いで動くようにしてありますが、気になる場合はプロパティコードを手作業で貼り付け直して更新してください。この場合、その他の設定値も初期化されるためご注意ください。
手順
&customparams=Custom Parameters;textarea;valid_elements : "*[*]", &mce_formats=Block Formats;text;p,h1,h2,h3,h4,h5,h6,div,blockquote,code,pre &entity_encoding=Entity Encoding;list;named,numeric,raw;named &entities=Entities;text; &mce_path_options=Path Options;list;Site config,Absolute path,Root relative,URL;Site config &mce_resizing=Advanced Resizing;list;true,false;true &disabledButtons=Disabled Buttons;text; &link_list=Link List;list;enabled,disabled;enabled &webtheme=Web Theme;list;simple,editor,creative,custom;simple &webPlugins=Web Plugins;text;style,advimage,advlink,searchreplace,contextmenu,paste,fullscreen,xhtmlxtras,media &webButtons1=Web Buttons 1;text;undo,redo,selectall,|,pastetext,pasteword,|,search,replace,|,hr,charmap,|,image,link,unlink,anchor,media,|,cleanup,removeformat,|,fullscreen,code,help &webButtons2=Web Buttons 2;text;bold,italic,underline,strikethrough,sub,sup,|,|,blockquote,bullist,numlist,outdent,indent,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,|,styleprops &webButtons3=Web Buttons 3;text; &webButtons4=Web Buttons 4;text; &webAlign=Web Toolbar Alignment;list;ltr,rtl;ltr &width=Width;text;100% &height=Height;text;400
プロパティコードは上記のとおりです。全て一行で書かれており、これをTinyMCEプラグイン設定画面の「プラグイン設定」に貼り付けると、プロパティを更新できます。
変更内容
不具合修正
- $modx->rewriteUrlsが正しく判定できないことがあるため修正
- $ditto_baseを絶対パスで指定すると不要なスラッシュがつくため修正
改善
- 管理画面イベントログの並び順を日付順ではなくイベントID順へ変更
- インポート機能 - トップページのmenuindexを0に
- TinyMCEプラグインのパスオプションに「No change」を追加
- スニペットコール内でのコメント記述対応
- xrayテンプレートをhtml5対応
- リソース移動時にメニューオーダーを移動先に合わせて更新するように改善
- リソース複製時にメニューオーダーを複写元の状態に合わせて更新するように改善
- スニペットコールのパラメータ値をシングルクォートで囲めば変数タグをそのまま文字列として対象スニペットに渡すよう改善 (従来の挙動との互換)
- [hq] Removed unused "weblink_message" language variable. (github:c72c41f)
- [[Wayfinder? &startId=`[*parent*]`]] のような書き方ができない問題を改善
- Ditto同梱PHx 不要なスペースを削除
- イベントログ・管理操作ログの蓄積上限を2000件に変更
- スニペットコールのパラメータの囲み文字(デリミタ)として使える文字にシングルクォート・ダブルクォートを追加
- ContactForm(サンプルコンテンツ用チャンク)を調整
- eformで@CODEと@FILEを使えるように改善
- [#610] $modx->removeEventListener()に機能追加
- スニペットコールで「?」を書き忘れても動くように改善 ([[name¶m=value]]など)
- $modx->evalSnippets()の処理を正規表現判定を用いない方法に変更
- [Wayfinder] breadcrumb.config.php内の関数が二重定義されることがあるためclass化
- スニペットコールのパラメータの値の中で「 & 」を使えるように改善
- [Wayfinder] breadcrumb.config.phpを@CODE記述で上書きできるように修正
- Ditto内蔵のPHxを2.1.4へアップデート(構造的な違いは特になく、扱えるモディファイアが増えた・カスタムモディファイアをファイルで追加できるようになったなどの違い)
- [Ditto] mb_strftime関数の処理をMODX本体APIメソッドを利用するように変更
- Wayfinder - @bindings指定でコロンを書かなくても解釈できるようにする
- TinyMCE - パスオプションのrootrelative・docrelativeなどのパラメータ名が実際と合ってないため修正
- [#607] TinyMCEのプラグイン設定「Path Options」のデフォルトをsiteconfigに
- document_data.static.phpのリソース一覧の並び順をIDの新しい順にする
- Dittoのconfigの読み込みを改善
- Wayfinderのconfigの読み込みを改善
- jqueryアップデート(1.6.4)
- テンプレート変数の設定項目に"<"や">"等を入力した際、<,>等に変換されないように&の取り扱いを調整。
- リンクタグの不要なパースを抑制
- .htaccessのコメント文を改善
- プラグイン設定のプロパティコードに入力した「=」「&」が「%3D」「%26」に変換されて出力されるため改善
- $modx->parseProperties() コード整理
- プラグイン・スニペット・モジュールのプロパティコードに「=」「&」を用いることができないため改善
- [QuickManager] カスタムボタンが出力するリンクに含まれるMODXタグをパース
- TinyMCEアップデート(3.4.5)
不具合報告・改善要望について
アップデートの手順
https://modx.jp/docs/update.html
上記を参照してください。
主な改善内容
パーサを改善
スニペットコールの展開処理を大幅に改善しました。基本的に上位互換性を持つため、使い方を変更する必要はありません。スニペットコールの書き方で今まで戸惑った経験がある人は、下記の改善ポイントをお読みください。
※スニペットコールのパラメータ内に[*変数名*]タグを記述する場合は、従来と挙動が変わるためご注意ください。通常のノウハウに沿ってWayfinderやDittoなど一般的なスニペットを利用する場合は、ほぼ問題ありません。
従来は、正規表現による処理のため、スニペットコールは一行でつなげて書かないと不安定という印象があったと思いますが、新しいパーサでは逆にパラメータごとに行を分けて書くほうが確実です。「&」を書き忘れたりしても、改行で区切られていれば認識することができます。
1. スニペットコールのパラメータ値で「?」「&」「=」が利用可能に
従来のパーサではスニペットコールのパラメータ値として「?」「&」「=」を用いることができなかったため、スニペットごとに独自のアプローチをとっていました。
たとえば|xq|・|xa|・|xe|に置き換えて書く方法がよく用いられていますが、
[[スニペット名? ¶m=`http://example.com|xq|mode|xe|rss|xa|display|xe|10`]]
上記のように、見た目によく分かりません。
[[スニペット名? ¶m=`http://example.com?mode=rss&display=10`]]
新しいパーサでは上記のように記述できます。必ずクォート文字で囲む必要があります。
[[Ditto?
&parents=0
&display=10
&dateFormat = %Y年%m月%d日
&tpl=`@CODE:
<tr>
<td>[+date+]</td>
<td><a href="[+url+]">[+title+]</a></td>
</tr>`
]]
上記のように、WayfinderやDittoのテンプレートコードをインラインで記述することも可能です。従来は、「 = 」を含むテンプレートコードを書くことができなかったため、@CODEバインディング記述の便利さを生かすことができませんでした。
2. 入れ子記述のスニペットコールの処理を改善
[[wayfinder? &startId=`[[UltimateParent]]`]]
従来のパーサでは上記のようにスニペットコールをネストさせて記述すると、
[[wayfinder? &startId=`[[UltimateParent]]`]] ← 末尾に注意
内部的には上記のように認識します。「[[ 」と「 ]] 」にはさまれた部分を一本のスニペットコールとして認識するため、入れ子になっていることを理解できず、末尾の「 `]] 」をとりこぼしています。
[!wayfinder? &startId=`[[UltimateParent]]`!]
そのため、上記のように外側をキャッシュオフ形式とする必要がありました。こうすれば、「内側のスニペットコールを処理した値」を含んだスニペットコールをページキャッシュに格納できるからです。この方法では、せっかくのキャッシュ処理が使えないため、動作が重いスニペットを用いるページは不利です。
1. [[wayfinder? &startId=`[[UltimateParent]]`]]
2. [[wayfinder? &startId=`処理済みの結果`]]
新設計のパーサでは、上記のように内側から順番に処理します。キャッシュオフ形式で書く必要はありません。
3. スニペットコールのパラメータ値にリソース変数を利用できるように改善
多くのスニペットにおいて、パラメータの値にリソース変数やテンプレート変数を用いることができますが、これはMODX本体がそのような使い方をサポートしているわけではなく、パラメータを受け取ったスニペットが自前で処理しているためです。
[[Wayfinder? &startId=`[*parent*]`]]
Wayfinderはそのような使い方を想定していないため、上記のようなスニペットコールを記述すると期待どおりに処理することができません。
[!Wayfinder? &startId=`[*parent*]`!]
上記のように、外側をキャッシュオフ形式で記述すると、入れ子のスニペットコールと同様に、あらかじめ[*parent*]が展開された状態でスニペットコールがキャッシュに格納されるため、結果的には期待どおりに処理できますが、設計方針としてはイレギュラーな使い方になります。これで解決できる理由がよく分からないまま使っているユーザも多いと思います。
これを改善し、MODX本体側で[*変数*]を展開してからスニペットに処理を渡すようにしました。
[[Wayfinder? &startId=`[*parent*]`]]
上記のように記述できます。ページ数が非常に多いサイトではWayfinderの処理はキャッシュを使わないと重く感じることがありますが、これで解消できます。
4. パラメータの囲み文字(デリミタ)を用いた時の挙動の改善
[[スニペット名? ¶m= value ]]
[[スニペット名? ¶m=` value `]]
従来のパーサでは、上記のどちらの書き方でも、処理のためにスニペットが受け取る値は一律にtrimしていたため、どちらも同じでした。これを改善し、バッククォート( ` )で値を囲んだ場合は、囲んだ中身をそのままスニペットに渡すようにしました。半角スペースやタブ、改行などが値の前後についている場合も、削除せずそのまま処理に渡すことができます。
このため、DittoやWayfinderのテンプレートコードをインラインに記述する場合などに、インデントや改行タイミングなど出力にこだわることができます。
5. スニペット名末尾の「?」を不要に
スニペット名末尾の「?」が不要になりました。
[[スニペット名¶m1=`値1`¶m2=`値2`]]
上記のように記述できます。
スニペット名に「&」を含めたい時は、これまでと同じようにスニペット名の末尾に「?」をつけてください。
Revolutionでは現在のところ「?」が必要なので、載せ替える可能性がある場合は「?」を書くことに慣れておくとよいかもしれません。
※10月3日追記
PHxのmathモディファイアで「?」を用いる場合は正しく処理できないため、次回修正します。
6. パラメータ区切り文字としてダブルクォートやシングルクォートが利用可能
従来はパラメータの値を囲む場合は「 ` 」(バッククォート) を使うことになっていましたが、ダブルクォートやシングルクォートも使えるようになりました。
- `バッククォート`で囲む・・・[*変数名*]が記述されている場合は、これを展開してからスニペットに渡します。
- "ダブルクォート"で囲む・・・バッククォートと同じ。
- 'シングルクォート'で囲む・・・基本的にはバッククォートと同じです。[*変数名*]タグが記述されている場合は、そのまま[*変数名*]を文字列としてスニペットに渡します。この書き方が必要なケースはほとんどありません。
従来と同様、現在のところスニペットコール・コンフィグ変数・チャンクコールは展開しますので、ご注意ください。可能であれば、PHxプラグインをインストールし、スニペットをPHxモディファイアに置き換えるとよいでしょう。 - 囲まない・・・値の前後のスペース文字(半角スペース・タブ文字・改行など)を削除してからスニペットに渡します。値に「?」「=」「&」を含むと処理を正しく行なえないのは従来と同じです。できるだけクォートで囲むことをおすすめします。
<table>
[[Ditto
&dateFormat = `%Y年%-m月%-d日`
&tpl = '@CODE:
<tr>
<td class="date">[+date+]</td>
<td class="member">[+editedby:userinfo=`fullname`+]</td>
<td class="title"><a href="[+url+]">[+title+]</a></td>
</tr>
' // 表示パターン
]]
</table>
区切り文字を変更できるので、上記のようにインラインテンプレート内にオプション付きのPHxモディファイアを記述することができます。
7. コメントの記述を可能に
パラメータを持つスニペットコールを複数行で記述する場合、クォートで囲んだパラメータの右側に、半角スラッシュ2つで始まるコメントを記述できます。コメントは行の終端までが有効です。
上記のような記述が可能です。
一時的に無効にしておきたいパラメータをコメントアウトできます。
その他、動作保証はしませんが、パラメータ名先頭の「&」を省略しても動作します。この場合はパラメータセットを一行ずつ書く必要があります。パラメータの区切り文字も必要です。パラメータ値は複数行に渡って記述できます。
Ditto内蔵PHxをアップデート
Ditto内蔵のPHxを2.1.2から2.1.4へアップデートしました。扱えるモディファイアが増えたことと、カスタムモディファイアをファイルで追加できるようになったことが主な違いです。
/assets/plugins/phx/modifiers/モディファイア名.phx.php
ファイルで追加する場合は、上記のロケーションに配置します。
次回リリースについて
現在のところ来月はリリースを行なう予定はありません。Github移行や1.0.6リリースに向けた本家開発チームとの調整を優先します。
以上、ご意見ありましたらフォーラムまたは問い合わせフォームからフィードバックをお願いします。