1

Catalystアプリケーションを構築しており、テンプレート ツールキットをテンプレート システムとして使用したいと考えています。ただし、私のアプリケーションは多くのドメインに応答し、ドメインによっては、異なる構成で異なるコンテンツが表示されますTemplate Toolkit。基本的に、domain.com と domain2.com がある場合、それぞれに独自の構成を持たせたいと考えています。Catalystのビュー機能を使用しながら、これを行うエレガントな方法を知っている人はいますか? ありがとう!

アップデート

これをルートコントローラーに入れることで、Template Toolkitオブジェクトの構成でサイトラッパーを変更できることがわかりました。ただし、にある初期ラッパーを使用しているようlib/myapp/View/HTML.pmです(初期化されたラッパーを使用しているだけなので推測しています)。このリクエストのラッパーを変更したことを認識させる方法はありますか?

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

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

2 に答える 2

1

WRAPPER私は、そのようにグローバルに宣言するのではなく、各メイン テンプレートで直接宣言する傾向があります。

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

...私が見つけたように、はるかに柔軟です。


でも...

私が大きな成功を収めたもう 1 つのオプションは、カスタム テンプレート パスを使用することです。これにより、テンプレートのドメイン固有のバージョンが、存在するデフォルトを上書きできます。これにより、必要に応じてコードのバリエーションを挿入する柔軟性が大幅に向上します。

=== MyApp::View::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;
}

その最終的な結果は、 a WRAPPER、 aPROCESSまたは anのすべての呼び出しINCLUDEがドメイン固有のバージョンをチェックするか、汎用バージョンを生成することです。

[%- WRAPPER wrapper.tt -%]

そのようなファイルがない場合は、検索$domain/wrapper.ttまたはフォールバックします。wrapper.ttこれは自動的に次のように拡張されます。

  • フー/バー/baz.tt
  • domain1/foo/bar/baz.tt
  • domain2/foo/bar/baz.tt

それが役に立つことを願っています。

于 2013-05-16T02:30:20.920 に答える