1

我按照这个食谱禁用了 Dancer 的“布局”并重新启用了 TT 的“WRAPPER”:

如何在 Dancer 模板中制作特定于页面的标题?

这似乎是在路由级别更改布局/包装器中的令牌所必需的。简而言之,链接配方需要在 config.yml 文件中指定单个布局/包装器。

该配方在使用一种布局/包装器时效果很好,但是我如何在路由级别更改(或禁用)模板布局/包装器?

由于 Dancer 的原生布局被禁用,这不起作用:

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

另外,我尝试在渲染模板之前更改配置,但这似乎也不起作用:

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

而且我也尝试使用舞者套装/设置,但也不好:

 # 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. 使该布局为:

    打印 $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 回答
0

两个令人难以置信的笨拙的解决方法(请不要恨我):

Kludgy 解决方法 #1

set template => 'simple';
my $html = template('mytemplate', {}, { layout => 'some_other_layout' });
set template => 'template_toolkit';
return $html;

基本上,我们暂时为 Dancer 的“简单”模板渲染器切换了 template_toolkit。

Kludgy 解决方法 #2

放弃并保留 WRAPPER,但要添加条件,以便它自己摆脱困境,如本文所述:

如何在 Template Toolkit 模板文件中覆盖 WRAPPER?

于 2013-08-27T20:55:36.867 回答