PATH_INFOと相対パス(リンク)
おまえのブログさんのエントリーCGI::Application::Dispatch勉強中その2で
でも、CGI::Application::Dispatchを使う場合は、PATH_INFO形式を利用することが前提なうえ、URIが全部、
http://example.com/dispatch.cgi/モジュール名/Runモード
な感じになります。階層が全部一緒です。こうなると、今までの「URIの階層=ファイルのありか」という方法でテンプレートを並べて、リンクURIを相対パスで書く、というのが不便になりました。URIたびたび間違うし…。
これは僕も悩みました。あとでPATHが変更になりそうなときには絶対パス・リンクは使いづらいですし、Dreamweaverでも作成しにくい。なので最近作ったCGI::Application::Dispatchを利用したアプリではテンプレートの在処を以下のようにしてみました。
~/lib -- モジュール類 ~/html -- app.cgi |- tmpl -- app名 -- テンプレートファイル1 | |-テンプレートファイル2 |- css |- js |- img/画像など
テンプレートのファイルをapp.cgiから2つ階層を下に配置することでcssや画像などの素材へのリンクを「../../」(app.cgiの階層)と相対パス(リンク)で書けるようにしました。ローカルでも同じ環境にしておけばDreamweaver等のツールでも編集がスムーズに可能っす。
それと、アプリケーションで出力されたHTML内でのパスの問題は、
http://example.com/dispatch.cgi
http://example.com/dispatch.cgi/
http://example.com/dispatch.cgi/モジュール名
http://example.com/dispatch.cgi/モジュール名/
http://example.com/dispatch.cgi/モジュール名/Runモード
この5つのURLで出てくるページが同じだというところだと思う。出てきてしまうことが問題なら出てこないようにしてしまえば良いと思ってリダイレクトで対応。CGI::AppアプリケーションのBaseクラスにでも、
package MyApp; use strict; use base qw(CGI::Application); sub redirect_dispatch{ my ($self,$rmode,$query_string) = @_; my $q = $self->query; if($rmode !~ qr{^/}){ my $module = lc $self->param('CGIAPP_DISPATCH_PATH'); $rmode = "/$module/$rmode"; } my $baseurl = $q->url(); $baseurl .= $rmode; $baseurl .= '?' . $query_string if $query_string; $self->header_type('redirect'); $self->header_props(-url=>$baseurl); }
これを追加。
アプリケーションクラスで
package MyApp::App; use strict; use base qw(MyApp); sub setup{ my $self = shift; $self->start_mode('index'); } #本当のstart_modeへリダイレクト sub dispatch_index{ return shift->redirect_dispatch('start'); } sub dispatch_start{ #本当のstart_mode }
こんなようにしておけば相対パス・リンクで迷うことはないと思われ。
redirect_dispatchはこのPATH補正でけではなく別のrun_modeへの移動一般で使えます。
redirect_dispatch('Runモード');
これは同じモジュールのRunモードへリダイレクトします。
redirect_dispatch('/モジュール/Runモード');
頭に「/」をつけて書くと指定モジュールのRunモードへリダイレクト。2つ目の引数にはquery_stringへ入れる文字列が「param=value¶m=value」で書けます。
このメソッドは一般化が難しいかなぁと思うのでプラグインとしては作成してなかったりします。
コメント
おお!このディレクトリ構成+リダイレクト対応なら相対パスでも迷わずスムーズですね!!参考にさせていただきます。
投稿者: おまえ | 2005年09月09日 00:51