« HTML::Prototypeを使ったauto complete field | メイン | Regexp::Trieにさわってみた »

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」で書けます。

このメソッドは一般化が難しいかなぁと思うのでプラグインとしては作成してなかったりします。

トラックバック

この一覧は、次のエントリーを参照しています: PATH_INFOと相対パス(リンク):

» [Perl]CGI::Application::Plugin::Redirectのredirect()メソッドを改造してみた from 刺身☆ブーメラン(金子健介)のはてなダイアリー
[http://norainu.net/mt/archives/2005/09/cgiapplicationd_1.html:title=おまえのログ/CGI::Application::Dispatch勉強中その2]をうけた[https://blog.nomadscafe.jp/archives/000463.html:title=blog.nomadscafe.jp/PATH_INFOと相対パス(リンク)]でのredirect_dispatc... [詳しくはこちら]

» [Perl]CGI::Application::Plugin::Redirectのredirect()メソッドを改造してみた from 刺身☆ブーメラン(金子健介)のはてなダイアリー
[http://norainu.net/mt/archives/2005/09/cgiapplicationd_1.html:title=おまえのログ/CGI::Application::Dispatch勉強中その2]をうけた[https://blog.nomadscafe.jp/archives/000463.html:title=blog.nomadscafe.jp/PATH_INFOと相対パス(リンク)]でのredirect_dispatc... [詳しくはこちら]

» 絶対パスと相対パス from ネットビジネス用CGI Perl HTML Javascriptの情報サイト

  CGIファイルを設定するとき意外でも、普通にHTMLでホームページを作成するときなどにも登場するのが、絶対パスと相対パスという用語です。

... [詳しくはこちら]

コメント

おお!このディレクトリ構成+リダイレクト対応なら相対パスでも迷わずスムーズですね!!参考にさせていただきます。

コメントを投稿