MODxのDocumentParserクラス(API)の注意点

MODxのDocumentParserクラスをちょこちょこ読んでいるのですが、いくつか気になる点があったのでまとめておきます。

MODxには開発を便利にするためのAPIがいくつか用意されており、その一つがDocumentParserクラスです。DocumentParserクラスはMODxのAPIの核となるクラスで、スニペットやプラグイン、モジュールなどを制作する場合には必ずといっていいほど必要なものです。このDocumentParserクラスのファイルは/manager/includes/document.parser.class.inc.phpにあります。

現在、読んでいるバージョンは0.9.6.1p2ですが、リポジトリにあるバージョンは確認していないので、ひょっとしたら修正されているかもしれません。また、まだ全てを読み終わったわけでも、完全に理解したわけでもないので間違っている点があるかもしれません。

checkPreview()メソッド

ドキュメントのプレビュー時には、「z=manprev」というクエリ文字列が追加されますが、「manprev=z」と記述されている箇所がいくつかあります。プレビュー状態にあるかどうかをチェックするためのcheckPreview()メソッドでは「z=manprev」でチェックしているので、「manprev=z」となっている部分が間違っているようです。

使用頻度の低そうなメソッドですし、実害はあまりないと思いますが使用する場合には注意が必要です。

getFormVars()メソッド

getFormVars()メソッドは、GET/POSTメソッドで渡されたパラメータを取得するためのメソッドです。引数としてGETメソッドなのかPOSTメソッドなのかを指定しますが、省略した場合には$REQUEST_METHODが使われます。

この$REQUEST_METHODはサーバの環境変数を参照しようとしていますが、PHPの設定でregister_globalsがOnになっていることが前提のようです。引数を省略しなければ問題ありませんが、省略してgetFormVars()メソッドを呼び出す場合には注意が必要です。

勘違いでした。$REQUEST_METHODは、単に$_GETや$_POSTの代わりに使う連想配列を指定するためのものです。

getIntTable***()/getExtTable***()メソッド

getIntTable***()/getExtTable***()メソッドはデータベースにアクセスするためのメソッドです。Internal、Externalの略(と思われる)で、MODxのデータベース、または外部のデータベースに対して操作を行います。

データベースの操作にはDBAPIクラスというAPIが用意されているため、おそらくこれらは古いメソッドなのではないかと思いますが、DBAPIクラスを全て読んでいるわけではないのでよくわかりません。その他にも、データベースに関係する古いメソッドのエイリアスが多く残っていますが、DBAPIクラスでできることはDBAPIクラスを使うと良いでしょう。

getParent()メソッド

ドキュメント情報の取得に関するメソッドには「getDocument***」という名前が付いていますが、親ドキュメントの情報を取得するgetParent()メソッドだけは異なります。子ドキュメントの情報を取得するためのメソッドは「getDocumentChild***」となっているので、getParent()メソッドも将来的にはgetDocumentParent()メソッドになるのかもしれません。

getPageInfo()メソッド

getPageInfo()メソッドはドキュメントの情報を取得するためのメソッドですが、引数(pageid)のデフォルト値を利用する場合の処理が抜けているので注意が必要です。getPageInfo()メソッドは他のメソッドからも呼び出されていますが、同じようなメソッドとしてgetDocument()メソッドがあるため、将来的にはgetDocument()メソッドに統一されるのかもしれません。

ドキュメントの情報を取得するには、getDocument()メソッドを使うようにしておいた方が良さそうです。

その他、似たようなメソッドでも細かい処理が異なっているものが結構あります。また、引数の型や戻り値の返し方にはあまり統一性がありません。変数の初期値や戻り値が明示されていない箇所も何カ所かあり、それが原因で確実な結果を期待できない可能性がある部分もあります。似たようなメソッドでも、ソースを読んで確認しておいた方が良いでしょう。

この辺はオープンソースウェアの宿命とも言えますが、これらが整備されるには、まだまだかなりの時間がかかりそうです。しかし、ソースを読んでみると、今はまだ実装されていない機能でも将来的に実装されるであろう機能の片鱗が見てとれて、さらに期待が高まりました(使いこなせるかは別です :p)。

ところで、MODxにはテンプレート変数の出力を整えるためのウィジェットというものがあるのですが、未だに必要性がわからずにいます。ウィジェットのメリットとしては、データとしてのテンプレート変数と出力としてのフォーマットとを分離できる点(だと思う)ですが、搭載されているウィジェットが微妙すぎるのと、スニペットで全て事足りてしまう気がしています。

ウィジェットはテンプレート変数と密接に関係しているので、余計な事を考えなくていいというメリット(とテンプレートごとにしか設定を変えられないというデメリット)がありますが、スニペットでもテンプレートなどに記述しておけばそれほど面倒ではありませんね。うまく活用されている方がいましたら教えてください :)

コメント (4)

  • MEGU
  • 2008-03-29 11:52

お願いがあるのですが(笑)。。
この内容を、あのMLに投稿するか、フォーラムに
投稿するか、していただけるととてもうれしいです。
これは本家にフィードバックしたい内容です。

そうしさんたちも調べてくださっているのですけど、
なにしろ手薄で。。私は役に立ちませんし。。ここを
こうしてくれ!という要望が固まったら、本家に、
ポストするのは私でも出来る?かなぁと思うのですが。。

あ、もしかして、Phizeさんが直接、バグトラックに
上げてくださるともっと嬉しい。^^。

ウィジェットですが、ちょっと中途半端な感じの
実装ですよね。方向性としては、すばらしいものを
感じるんですけど。。細かいところにこだわろうとすると
やはり、phpを追わないとならなくなるみたい。。
097 では、そのあたりも変わるかもしれないので、
期待したいです。^^。

あ、一応、バグ管理システムには登録はしておきましたよ :)

明らかにバグと思われるものと、可読性とかミス防止の観点からいくつかです。
後者の細かい部分は、今は開発者が注意しておけばすむ範囲なので、ちょっと余計だったかなあと思って途中で止めました(書いてから消せないことに気づいた XO)。

代わりに、PHPのソースで重複しているもの、古いもの、今後拡張の予定があるものは、ちょっとだけでもコメントをいれてもらえるとうれしい、みたいなことを登録しときました。

ウィジェットは、使ってみようと思ったんですけど、最初から入ってるものはちょっと微妙ですよね(笑
他の人に使ってもらう場合にはスニペットよりいいのかなあと思いました。

  • MEGU
  • 2008-03-29 23:18

どうもありがとうございました。
細かいことはわからないのですが、やっばり、よけいだったり、足りなかったりすると、プログラムしづらいんですよね…??

私はわからないのですが、同じ処理を2度繰り返していたり、無駄なことをしている部分もあるらしいのです(ほんとに無駄らしい)。そういうのが、なくなった方が、たぶん、開発もしやすいんですよね。。

重複しているものは過去の互換性のためだと思いますけど、コメントが入ってないので確信が持てないというか…(笑

似たようなものでも一方はきっちり、一方は微妙にいい加減な感じになっていたりするので、API利用者の混乱と凡ミスを招きそうに思いました。ちゃんとしている部分もあるので、ちゃんとしている方に合わせて修正されていくといいなあ、みたいな感じです。

まだ、ver.1.0にも満たないので、細かい部分はまだまだこれからでしょうね :)

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/101/trackback/
この記事のURI
http://dxd8.com/archives/101/