PHPでdispatchを実装したい。。。
現在、EzoGPのでopenBusinessSuiteというのを実装している。Myznalaをベースにしているのだが、我ながら「使いにくい」ので、Myznalaもなおしちゃおうと思っている(アルファとはいえ、リリースしたことを反省)。
Myznalaをやっていたときから気になっていたのが、dispatchをどうしようか、ということ。
元々がJava屋でStruts世代なので、DispatchActionなんかに慣れ親しんでいる身。Myznalaはフレームとかつかわないで、簡易に実装できる道具にしたい、というのもあって、あんまりツールとか使わないで書きたいな、と思っていた。
dispachingは、下の図のように、1つの画面から複数のターゲット(action)にsubmitしたい場合に行わなくちゃならないのだが、どうも納得したやり方が見つからない。
ボタンに応じた処理系はプログラムとして分けたかったので、Myznalaではdispatch用のPHPを用意してPOST、そして、押されたボタンに応じて、各々の処理系のPHPプログラムをincludeしていた。header("location:...")でリダイレクトすると、リクエストパラメータがなくなっちゃう。
だが、これだと、アドレスバーにdispatch用のPHPプログラムのURLが残ってしまう。そうすると、enterを押された場合に、振り分けできないという事態に陥ってしまう。
ということで悩みに悩んだ結果、古典的な方法を採用して、javascriptでsubmitすることにした(果たしてそれでいいんだろうか、という疑念はあるのだけど。。。)。
以下のコードは、YUI2.8.xを使って書いた。(dom-event)
まずは、部品としてで使えるように、オブジェクトを1つ。
var MySyncSubmit = function() { var Dom = YAHOO.util.Dom; var Event = YAHOO.util.Event; this.submit = function(_config) { var _submitForm = _config.submitForm; var _submitURL = _config.submitURL; var _method = _config.method; if(Dom.get(_submitForm) != null){ Dom.get(_submitForm).action = _submitURL; Dom.get(_submitForm).method = _method; Dom.get(_submitForm).submit(); } } return this; };
画面に2つボタン(「登録」と「一覧に戻る」)があるとして、以下は、上のオブジェクトを、ボタンのclickイベントのハンドラに割りつける部分。
// buttonのonclickにsubscribe. YAHOO.util.Event.onDOMReady( function(){ var sObj = new MySyncSubmit(); // 「登録ボタン」が押されたとき YAHOO.util.Event.on('egp-my-entry-button', 'click', function(){ var configObj ={ submitForm : "form1", submitURL : "shiiresakiEntry.php", method : "POST" }; sObj.submit(configObj); }, sObj); // 「一覧へ戻るボタン」が押されたとき YAHOO.util.Event.on('egp-my-back-button', 'click', function(){ var configObj ={ submitForm : "form1", submitURL : "shiiresakiList.php", method : "POST" }; sObj.submit(configObj); }, sObj); }, this, true );
これをしこめば、dispatchはいらなくなる。こんなやり方でいいのかな、という疑念は残るが、覚書ということで。