代码之家  ›  专栏  ›  技术社区  ›  cubabit

如何在Catalyst应用程序的模板tookit模板中定义常量?

  •  2
  • cubabit  · 技术社区  · 17 年前

    我想在我的TT模板中使用一个常量。在 HTML::Mason (我以前选择的模板引擎)我可以:

    <%once>
    use MyApp::Constants qw(CONSTANT);
    </%once>
    

    我怎么能在 Template Toolkit ?如标题所述,这是一个 Catalyst 应用程序所以我想我可以把常量放在藏匿处,但这看起来有点尴尬。

    --编辑

    抱歉-我应该提到我要使用自己的常量-从myapp::constants导出,没有重复。

    2 回复  |  直到 17 年前
        1
  •  4
  •   friedo    17 年前

    在TT配置中,可以使用 VARIABLES 选项传递值列表,这些值在处理模板时将传递给每个模板。使用一些符号表技巧,您可以将所有常量吸出到配置中:

    use MyApp::Constants;
    use Template;
    
    
    my $tt;     # template object
    { 
        no strict 'refs';
        $tt = Template->new( { 
            VARIABLES => { map { $_ => &{ 'MyApp::Constants::' . $_ } } 
                           grep { defined &{ 'MyApp::Constants::' . $_ } }
                           keys %MyApp::Constants::
                         }
            }
        )
    }
    

    这将查看包中的所有符号 MyApp::Constants ,检查它们是否定义为子例程(这是 constant.pm 在引擎盖下)然后使用 map 向TT提供它们的散列引用。

        2
  •  2
  •   heeen    17 年前

    几种可能性。 只需定义一些变量:

    [% users = {
         tom   => 'Thomas',
         dick  => 'Richard',
         larry => 'Lawrence',
       }
    %]
    
    [% FOREACH u IN users %]
       * [% u.key %] : [% u.value %]
    [% END %]
    

    使用全局变量:

    [% global.version=1.234 %]
    
    This is Version [% global.version %].
    

    meta指令允许 要在中定义的元数据项 模板。当 模板被解析,因此可能 仅包含简单值(例如 无法插入其他 变量值转换为元变量)。

    [% META
       title   = 'The Cat in the Hat'
       author  = 'Dr. Seuss'
       version = 1.23 
    %]
    

    正如您在问题正文中所提到的,这里还包括: http://template-toolkit.org/docs/manual/Variables.html#section_Compile_Time_Constant_Folding

    推荐文章