JavaScript、Ajax、HTML5(API)、Ruby…Web及び関連技術の実験&情報公開&制作物紹介。

ダイナミック・パブリッシング対応プラグインの MT4 における仕様変更について

| コメント(1)

MT4ベータが発表・公開されて、拙作のプラグインの動作確認をしていたのですが、一つ大きな問題を発見してしまいました。
ダイナミック・パブリッシング対応のPHP版プラグインにおいて、以下のような問題が発生したのです。

ウチでは問題なく動くのに、ほかの環境ではまったく動作しない!

この現象について、原因と対処法が判明しましたので報告します。

一言で言えば、『テンプレート・タグが大文字小文字を区別しなくなったことによる弊害』。

MT4におけるテンプレートタグの仕様変更

MT4では、テンプレートタグの記述に、大きくて小さな(?)仕様変更があります。
それは、大まかに言うと以下の2点。

  • 大文字・小文字を区別しなくなった
  • <mt:hogehoge> のようなxmlのネームスペースに倣った記述方法がサポートされた

前者は、たとえば <$MTEntryID$> を <$MTEntryId$> 等、今まで大文字小文字を間違えて記述した場合に、エラーもしくは何も表示されない等正常な動作をしなかったものが、これからは問題がなくなる、ということです。
<MTENTRYID> とか <mteNTRYiD> のように大文字小文字をむちゃくちゃにしても、綴りさえあっていれば問題なく動作します。
後者は、これに加えて <mt:entryid> のような記述方法も許される、ということです。ただしこれは、 <mtentryid> と ":" を記述しない場合とまったく同じ意味になります。また ":" は "mt" の後のみ許されます。

テンプレート・タグを提供するプラグインの記述方法

では、プラグインの記述方法に変更が加わるのか、というと。
スタティック環境に関する限り、変更は不要です。
MT4のFAQにも、「ユーザ・インタフェースを表示変更するようないくつかのプラグインを除けば、ほとんどのプラグインは後方互換性がある」とあります。(参照:http://www.movabletype.com/mt4/mt4_answers.html#backwards-compat
さらに、今までのプラグインとは別の「機能追加」の方法(snipetts)もあるようです。けれどもそれはまた別の話、いつかまた別のときに。
とにかく実際、「ユーザ・インタフェースの変更を伴わない(=BigPAPIやTransformer機能を利用していない)プラグイン」は、基本的には一切記述を修正することなく今までどおり動作するようになっている模様です。

ですが。
これはあくまでスタティックの話。
ダイナミック・パブリッシングにおいては、プラグインの記述に若干の手直しが必要になります。
具体的には、以下のような手直しが必要です:

  • ファイル名をすべて小文字にする(*1)
  • オリジナル・タグの機能を記述した関数名もすべて小文字にする
  • その他、プリセット、オリジナル問わずテンプレート・タグ名を記述している箇所があればすべて小文字にする

(*1)オリジナル・タグを提供するファイル(block.mtxxxx.php もしくは function.mtxxxx.php)のみ対象。

これは、MT4でタグ名の大文字・小文字を区別しなくなった代わりに、ダイナミック・パブリッシング環境では内部的にはテンプレートタグをすべて小文字で管理しているためです。
従来は、たとえば <$MTIncrementVar$> というタグを定義するために、 function.MTIncrementVar.php ファイルに function smarty_function_MTIncrementVar($args, &$ctx) という関数を定義する、みたいに大文字小文字の区別に合わせてそのとおりに記述する必要がありました。それを今度は、すべて小文字にしなければならない(function.mtincrementvar.php ファイルに function smarty_function_mtincrementvar($args, &$ctx) )、というわけです。
プラグイン作成側としては、ちょっとだけ面倒です。

それでも一部の環境で問題なく動いてしまう理由

しかしながら、冒頭に述べたように、私のテスト環境では、上記の修正を施すことなくPHP版のプラグインも正常に動作していました。
これは、以下の2つの要因が重なって引き起こされていました。

  • サーバのファイルシステムが大文字・小文字を区別しないものであった
  • PHPの関数名はそもそも大文字・小文字が区別されない(*2)

(*2)少なくとも私のテストした環境のPHP(ver 4.4.1, 5.0.5)においては。

前者の「ファイルシステムが大文字・小文字を区別しない」というのは、簡単に言えば
「ABC.txt というファイルが存在するときに、"abc.txt" というファイルを開こうとすると、そのファイルが存在しなくてもエラーにならず、ABC.txt が開けてしまう」
という現象が起きる、ということ。
Windowsで使用されている FAT32 や NTFS(*3)、Mac OS の標準ファイルシステムである HFS や HFS+ がこれにあたります。Mac OS X でも UFS というファイルシステムを採用したり、また Linux でよく使用される ext3 や、その他のUnix系OSで使用される各種ファイルシステムでは、大文字と小文字は厳密に区別されます。

私のテスト環境は Mac OS X で、ファイルシステムが HFS+ だったので、この「ファイルシステムが大文字・小文字を区別しない」に該当したのです。

(*3)NTFS自体は大文字・小文字を区別するが、同じディレクトリ(フォルダ)にファイル名の大文字・小文字が違うだけのファイルを作成できない。また上に述べた「"abc.txt"というファイルを開こうとすると ABC.txt が開かれる」という現象は発生する。

またPHPは、関数名およびクラス名において、大文字・小文字は区別されないようです。
ドキュメントには「識別子は大文字・小文字が区別される」とありますが、それが適用されるのは変数名や定数名だけのようです(定数名はオプションで大文字・小文字を区別しないようにもできるそうです)。
よって、関数名に大文字が混じっていても、すべて小文字の関数名で呼び出せばきちんと呼び出せてしまう、というわけです。

これらの原因により、正常に読み込まれるはずのないプラグイン記述ファイルがきちんと読み込まれ、テンプレートタグがきちんと登録されて、結果としてきちんと動作してしまった、というわけです。

仕様変更だからです。←結論

(↑タイトルに深い意味はありません(汗))
PHP版プラグインを作成する際は、MT3以前用の「ファイル名・関数名の(タグ名にあたる部分を)大文字・小文字をそろえたファイル」と、MT4以降用の「ファイル名・関数名をすべて小文字にしたファイル」の2種類を用意しなければダメなようです。
二度手間です。くぅ。
今までどおりが良いのです。←ワガママ?

コメント(1)

先日はお忙しい中、調べて下さってありがとうございました。
おかげ様でダイナミックプラグインもMT4で動くようになりました!

それにしても、そういうことだったのですね…よく分かりました。
思わぬところに影響が出てくるものなのですね。

カテゴリ

月別 アーカイブ

OpenID対応しています OpenIDについて

このブログ記事について

このページは、あんちもん2が2007年6月19日 19:41に書いたブログ記事です。

ひとつ前のブログ記事は「拙作プラグインの MovableType4β 対応状況」です。

次のブログ記事は「評価だけして中身を出力しない - MTVoid」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。