1

このレシピに従って、Dancer の「レイアウト」を無効にし、TT の「WRAPPER」を再度有効にしました。

Dancer テンプレートでページ固有のタイトルを作成するには?

これは、ルート レベルでレイアウト/ラッパー内のトークンを変更するために必要なようです。簡単に言うと、リンクされたレシピでは、config.yml ファイルで単一のレイアウト/ラッパーを指定する必要があります。

レシピは 1 つのレイアウト/ラッパーを使用する場合にうまく機能しますが、ルート レベルでテンプレート レイアウト/ラッパーを変更 (または無効化) するにはどうすればよいですか?

Dancer のネイティブ レイアウトが無効になっているため、これは機能しません。

 template('mytemplate', { ... }, { layout => 'some_other_layout' });   # NO GOOD

また、テンプレートをレンダリングする前に構成を変更しようとしましたが、それも機能していないようです:

 # ALSO NO GOOD
 config->{'engines'}->{'template_toolkit'}->{'WRAPPER'} = 'some_other_layout';
 return template('mytemplate', { ... });

また、Dancer セット/設定も使用してみましたが、うまくいきません:

 # ALSO NO GOOD
 my $engines = setting('engines');
 $engines->{'template_toolkit'}->{'WRAPPER'} = 'some_other_layout';
 set engines => $engines;

何か案は?

4

3 に答える 3

3

私はそれを理解したと思います。Yanick と、私の他の回答 (Kludgy Workaround #2) で参照されているリンクに感謝します。レシピは次のとおりです。

  1. プロジェクト全体で使用する単一のラッパー ファイルを作成し、次のようにします。

    <% IF layout %>
    <% INCLUDE "$layout" %>
    <% ELSE %>
    <% content %>
    <% END %>
    
  2. ルート内:

    return template('mytemplate', {
      layout => 'layouts/some_layout.tt',
      param1 => data1,
      param2 => data2,
      ...
      });
    

そしてビンゴ、あなたは終わりです。レイアウト パラメータを省略すると、レイアウトがまったく取得されません。

于 2013-08-31T23:13:51.303 に答える
1

私は TT の専門家ではありませんが、一度 TemplateToolkit オブジェクトに WRAPPER を設定すると、それを変更することはできないようです。

その場合、少しずさんな回避策があります。

  1. レイアウトを「base.tt」のように設定します。

  2. そのレイアウトを次のようにします。

    print $context->process( $stash->get('wrapper'), { content => $context->process( $stash->get( 'template.name' ) ) });
  3. そしてあなたのルートで:

    get '/' => sub { template 'index', { wrapper => 'layouts/main.tt' }; };

タダー!

そうは言っても、Dancer のネイティブ レイアウトを使用している場合は、渡すトークンがラッパー コードに到達するtemplate 必要があります。

于 2013-08-31T18:01:02.293 に答える