TTSiteの中でベースURLが出ない問題
これはよくPOD読めばすぐにわかった問題だった悔しい。
CatalystでViewにTTSite使ってて、cssがheader内に展開されるのが個人的に嫌だったので外部から参照するようにしようとしていた。
が、ベースURLが取れなかったので、苦労したのでメモ。
まずは全体のレイアウトをこんな感じにしていた。
$ cat root/lib/site/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>[% template.title or site.title %]</title> <link rel="stylesheet" href="[% site.url.base %]src/ttsite.css?001" type="text/css"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> [%- content %] </body> </html>
余談だけど、cssに?でクエリっぽくブラウザに読み込ませると、?以降の数字を変えるだけで、css変更時のブラウザキャッシュに悩まされない。
次、テンプレート用メインコンフィグ。
$ cat root/lib/config/main [% IF Catalyst.debug; # define a debug() macro directed to Catalyst's log MACRO debug(message) CALL Catalyst.log.debug(message); END; # define a data structure to hold sitewide data site = { title => 'Catalyst::View::TTSite Example Page', copyright => '2010 Your Name Here', }; # load up any other configuration items PROCESS config/col + config/url; # set defaults for variables, etc. DEFAULT message = 'There is no message'; -%]
テンプレート用URLコンフィグ。
$ cat root/lib/config/url [% base = Catalyst.req.base; site.url = { base = base home = "${base}welcome" message = "${base}message" } -%]
で、だ。
コンテキストオブジェクトのbaseには、ベースURLが入っている。
TTSiteのTemplate使って表示させると、root/lib/config/url で、
base = Catalyst.req.base;
しているので、全体レイアウトの[% site.url.base %]としてるところに、$c->req->baseと同じ文字がはいるかと思いきや、実際にやってみたら空白だった。
ののわーと苛立ちつつ、URL用コンフィグのbaseを違う値にしたら、空白ではなくその文字になったので、値がコンフィグファイルから取れていないのではなくて、Catalystフレームワークから取れていないようだった。
じゃあどうやったら入んねん、と「catalyst.req.base」で検索した結果、「Catalyst::View::TT - search.cpan.org」を見つけた。
どうやらViewクラスで「CATALYST_VAR => 'Catalyst'」を設定したら、いけるみたい。
ということで、やってみた。
package PerlB::Web::View::TTSite; use strict; use base 'Catalyst::View::TT'; __PACKAGE__->config({ # del INCLUDE_PATH => [ # del PerlB::Web->path_to( 'root', 'src' ), # del PerlB::Web->path_to( 'root', 'lib' ) # del ], INCLUDE_PATH => PerlB::Web->config->{INCLUDE_PATH}, # add PRE_PROCESS => 'config/main', WRAPPER => 'site/wrapper', ERROR => 'error.tt2', TIMER => 0, TEMPLATE_EXTENSION => '.tt2', # add CATALYST_VAR => 'Catalyst', # add });
実際に必要なのは一番下の設定。
これで、Viewクラスもコンテキストオブジェクトを扱えるようになり、URL用コンフィグに反映され、メインコンフィグに読み込まれ、全体レイアウトの中で利用できる。
疲れた。