Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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用コンフィグに反映され、メインコンフィグに読み込まれ、全体レイアウトの中で利用できる。
疲れた。