2013-05-15 34 views
1

我正在構建一個Catalyst應用程序,我想使用Template Toolkit作爲我的模板系統。但是,我的應用程序將響應許多域,並根據域,它將顯示不同的內容與不同的Template Toolkit配置。基本上,如果我有domain.com和domain2.com,我希望每個人都有自己的配置。有沒有人知道一個優雅的方式來做到這一點,同時仍然能夠使用Catalyst的視圖功能?謝謝!催化劑應用程序模板工具包每個域的不同配置

UPDATE

通過把這根控制器,我已經想通了,我可以在配置來回Template Toolkit對象更改網站包裝。然而,它似乎只使用位於lib/myapp/View/HTML.pm的初始包裝器(我猜是因爲它只是使用它初始化的包裝器)。無論如何要讓它認識到我改變了這個請求的包裝?

sub begin :Private { 
    my ($self, $c) = @_; 

    $c->view('HTML')->config->{WRAPPER} = $c->req->uri->host . '/site/wrapper'; 
} 

回答

1

我傾向於在每一個主模板聲明WRAPPER直接,而不是全球這樣。

[%- WRAPPER c.req.uri.host _ '/site/wrapper.tt'; -%] 

...因爲我發現它允許更多的靈活性。


但是......

,我曾與使用自定義模板路徑巨大成功的另一種選擇,所以可以通過騎違約,可能存在的您的模板,領域特定版本。這爲您提供了巨大的靈活性,可根據需要注入代碼的變體。

=== MyApp的::閱讀:: TT.pm ===

sub process { 
    my ($self, $c) = @_; 

    # capture original path, identify host 
    my @orig_include_path = @{$self->include_path}; 
    my $domain = $c->req->uri->host; 

    # augment every path with domain/path 
    @{$self->include_path} = map { ("$domain/$_", $_) } @orig_include_path; 

    $self->SUPER::process($c); 

    # revert path 
    @{$self->include_path} = @orig_include_path; 
} 

最終結果是是,每個呼叫的WRAPPER,一個PROCESSINCLUDE將檢查域特定版本或生產仿製藥,即

[%- WRAPPER wrapper.tt -%] 

會發現$domain/wrapper.tt或回落到wrapper.tt如果沒有這樣的文件。這將自動延伸到:

  • 富/酒吧/ baz.tt
  • 域1 /富/酒吧/ baz.tt
  • 域2 /富/酒吧/ baz.tt

希望這有用。

+0

偉大的答案!謝謝! – srchulo