【问题标题】:More than one layout/wrapper with Dancer and Template::Toolkit带有 Dancer 和 Template::Toolkit 的多个布局/包装器
【发布时间】:2013-08-14 10:19:45
【问题描述】:

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

How to make a page-specific title in Dancer templates?

这似乎是在路由级别更改布局/包装器中的标记所必需的。简而言之,链接配方需要在 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;

有什么想法吗?

【问题讨论】:

    标签: perl template-toolkit dancer


    【解决方案1】:

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

    Kludgy 解决方法 #1

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

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

    Kludgy 解决方法 #2

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

    How can I override WRAPPER in a Template Toolkit template file?

    【讨论】:

      【解决方案2】:

      我不是 TT 专家,但似乎一旦为 TemplateToolkit 对象设置了 WRAPPER,就无法更改。

      如果是这种情况,这里有一个稍微有点曲折的解决方法。

      1. 将布局设置为“base.tt”。

      2. 使该布局成为:

        打印 $context->process($stash->get('wrapper'), { 内容 => $context->process($stash->get('template.name')) });
      3. 然后在你的路线中:

        得到'/' => sub { 模板'索引',{ 包装器 => '布局/main.tt' }; };

      泰达!

      话虽如此,如果您使用的是 Dancer 的原生布局,那么您传递给 template 的令牌应该 进入包装器代码。

      【讨论】:

      • 嗨,Yanick,第一,最重要的是,感谢您的狡猾:) 回答。我不清楚如何执行第 2 步;我是否要以某种方式将您建议的 perl 代码包含在 html'ish 布局中?另外我假设在第 1 步中我将 WRAPPER 设置为 'base.tt'?
      • 第 2 步中的代码是 base.tt 的内容,并被 [%PERL%] ... [%END%] 包围。但在精神上,这与您在下面写的公认解决方案是一回事。您的解决方案也更好一点,因为它保留在纯 TT 空间中,并且不诉诸 perl 代码。做得好。 :-)
      【解决方案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,
          ...
          });
        

      还有宾果游戏,大功告成。省略layout参数,就不会得到layout了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-27
        • 2017-06-02
        • 2018-11-29
        • 2018-12-08
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 2012-03-12
        相关资源
        最近更新 更多