MODxのモジュール版のサイトエクスポート機能をそれとなく公開してみました。
以前、公開したのはプラグイン版のExportEXプラグインで、これはMODxの元々のエクスポート機能を利用してプラグインを追加することによりBASEタグや内部リンクなどに利用するホスト名を任意のものにしちゃうプラグインでした。
今回の機能も実は目的は同じですが、MODxの本来のエクスポート機能を使うのではなくてそれ自体をモジュールとして提供するものです。
なので、今回はEXぢゃなくてデラックスのDXです。
実際には、モジュールとプラグインの2つが入ってます。
さて、特徴ですが、今回は基本的な仕様はMODx本体のエクスポートとほぼ同じです。
画面周りもまったく同じロジックを利用しています。
但し、1点違うのはオリジナルではfopenでエクスポートするページを開いているのですが、これだとallow_url_fopenがFalseになっている環境ではエクスポートできません。(実際に、エクスポートを使う場合は内部利用が前提になるとすれば許可してもいい環境の方が多いかもですが)
そこで、MODxの配布物の中にはソケットを利用したHTTPクライアントライブラリであるSnoopyがあるのでこれを利用する方式に変更しました。
ということで、今回のポイントとなる機能はfopenに制限があってもエクスポートできちゃうぞ っていう部分だけです。
当面、大規模なエクスポートだと最大エクスポート時間を0(無制限)に指定すれば可能ですが、Safe ModeがOnの場合には、この最大エクスポート時間を利用できませんので多くのページがある場合には途中で中断される場合があります。
今後、このモジュールをベースに機能を拡張していく予定です。
エクスポートのロジックそのものの検討から大規模対応、FTPで実際のホストへの静的HTMLのアップまでやっちゃうなど頭の中では色々と考えては居るんですが、、、実現性や掛かる時間まではまったく未検討だったりするのでどうなっていくは分かりませんが、とりあえず最初の取っ掛かりのバージョンを公開しておきます。
さて、インストールから実行までを軽く画面キャプチャと合せて紹介してみます。
A.アーカイブをこちらから適当に探してダウンロードしてください。
B.それを解凍するとモジュールとプラグインの2つのPHPファイルがあるので、まずはモジュールから作りましょう。
C.MODxの管理画面からモジュールをクリックして、モジュール管理→モジュール作成をクリックします。
D.以下のような画面が出てくるはずなので、モジュールコードにモジュールのPHPの中身をコピペします。
モジュール名は、ExportDXを入れましょう。(まあ、実際はなんでもOKです)
E.次にメインタブの横の設定タブをクリックしてみてください。
そうすると、下のような画面が出てるはずなのでモジュールの設定っていう欄に画面と同じような文字列を入力して横の・・・ボタンを押してみて。
赤枠の部分に相当するところがボタンを押すことで出てくるはず。
出てきたら実際のホスト名を入力して保存をすればモジュールの設定は終了です。
ちなみに、モジュール設定の欄には、&hostname=エクスポートホスト名;string; と入力しておいてください。
あ、モジュールのPHPファイルの先頭にも同じものが書いてあるのでコピペして使ってください。
F.次はプラグインを作ります、リソースメニューからプラグインを作成するまでやっちゃってください、
G.新規にプラグインを作るので、プラグイン名は適当にExportDXといれて、プラグインのPHPソースをプラグインコードの部分にコピペしてください。
H.次システムイベントをクリックして、OnWebPageInitにチェックを入れます。
これで準備完了
I.さて、後は実行するだけなんですけど、ここで1つお願いが。
実際には、このままでも動作はするんですが、念のためのおまじないの修正をしてください。
モジュール及びプラグインのソースにそれぞれ同じDefineっていう行があると思います。
この行の部分のEXPORTDX-ZEROっていう文字列、これをあなた独自のキーワード(英数字でOKです)に書き換えてください。
もちろん、モジュールとプラグインには同じキーワードを設定しないと駄目ですよ。これが念のためのおまじないです。
J.では、実行してみましょう。 モジュールのExportDXを右クリックして実行を選択するか、一度管理画面に入り直すと分かると思いますが、モジュールのサブメニューにモジュール名が出てくるはずなのでExportDXをクリックすれば即実行となります。
見た目は、MODXのオリジナルのエクスポートそのままですが次回以降は若干変わるかもです(^^;;
なお、モジュール版ではキャッシュを一旦自動的にクリアしてから各ページを再生成させて、エクスポート終了後にまたキャッシュをクリアしています。
これは、ホスト名が変わることによりキャッシュをクリアしないと意図したホスト名のHTMLにならないからです。
ということで、まずはお試し頂いてMODxの機能拡張の花をさかせましょう♪


CMS

2010/01/04 16時05分32秒
MODxを始めたばかりで、静的なサイトを作れないかと思い、検索でここにたどり着きました。
ExportDX素晴らしいです!
まさに求めていたもので、早速、使わせていただきました。
そこでちょっとわからないことがありまして、大変恐縮ですが
質問させてください。
1、エクスポート先のフォルダの中にもともとあるファイルが消えてしまいます。
これを消さないようにする設定はありますか?
(CSSやJSは、別にアップロードしたいと思っています)
2、親ドキュメントがフォルダになってしまいます。(それはそれで必要なのですが)
フォルダを作った上で、その中にindex.htmlとしてファイルを作成することはできますか?
この2点が解決できるとうれしいのですが、可能でしょうか?
突然の質問で申し訳ありませんがよろしくお願い致します。
2010/01/05 00時05分19秒
こんにちは、ご利用ありがとうございます。
できれば,WEB制作会社の方とちゃんとしたものに仕上げらればとか思ったりもしてるんですが・・。
とかいう話を以前にはじめてのmodx勉強会の場でしゃべっちゃってたりしますが・・w
さて,質問の件ですが1は確か,エクスポートディレクトリ配下のディレクトリがあるとその中身を全部消すようになっています。
この仕組みはmodx本体のエクスポート処理もそのようだと思われるので,いわゆる仕様といえますが,モジュールのソースからRemoveDirctoryAll($filename);をコメントアウトすれば,削除されなくなります。
2については,親ドキュメントがフォルダになる件ですが階層構造(エイリアスパスの指定)の場合はそのようになりますので,modxの設定の問題だと思います。
ということで,2についてはエリアスパスあたりの設定を変えてみるとよいかもです。
2010/01/05 08時37分58秒
早速、回答いただきありがとうございます!
1、removeDirectoryAll($file);をコメントアウトすることで、対応できました。
助かりました!
2、フォルダ構成は維持したかったので、エイリアスパスは使用したまま、index.htmlのドキュメントを新たに作ることで対応しました。(親ドキュメントと同内容のもの)
※一覧に表示されないようにDittoのfilterで対応
本当に助かりました。ありがとうございました。
2010/01/11 17時41分58秒
度々、失礼致します。satoです。
先日は、早速のご回答ありがとうございました。
件の問題は解決したのですが、新たな問題が発生してしまい
どうしても解決できず、また質問させていただけたらと思います。
エクスポート先をドメインのルートにすると
「ターゲットディレクトリ内に書き込みができません。ディレクトリが書き込み可能であるか確認して、再度処理を行ってください。」
というエラーになってしまいます。
前回は、テストのためフォルダを作って、その中にエクスポートして成功していました。
つまり今回は、http://○○○.com/ にエクスポートできないということです。
(http://○○○.com/test/ には可能)
ちなみに初期フォルダのパーミッションの設定は707で
簡単なPHPプログラムでは、ルートにファイルの作成はできました。
何か制限がかかっているのでしょうか?
度々、申し訳ありません。
よろしくお願い致します。
2010/01/11 23時27分43秒
ここのフォーラムの方に返信してみました。
2010/02/15 22時18分08秒
こんにちは。
Windows系(XAMPP)でExportEXを使用すると、「ターゲットディレクトリ内に書き込みができません。ディレクトリが書き込み可能であるか確認して、再度処理を行ってください。」となり、処理を完了できませんでした。
原因を探ってみたところ、255行目の”realpath”の部分で”/”が”\”に変換されている為、262行目の処理がTRUEになり、処理が終了しているみたいです。
なので、以下のように再変換するようにしてはいかがでしょうか。
(他に影響出るかもしれませんが…)
$export_path = realpath($_POST['export_path']);
↓
$export_path = str_replace('\\', '/', realpath($_POST['export_path']));
以上、ご報告まで。^^
2010/02/15 23時14分37秒
trickstarさん、こんにちは。
Windows系はまったくチェックしてませんでした(^^;
ありがとうございます、次期(っていつだ?)バージョンには頂いたものを反映させて頂きます。
一応、Windowsならとかも盛り込んでおきましょうかね。
みなさんおおかげでだいぶ使えるものになりつつな・・・まとめたバージョンを出さなきゃ今年度中には(^^;
2010/02/16 10時40分57秒
ZeRoさん
次期バージョン期待しています^^
また、なにかありましたら、ご報告させてもらいます。