【问题标题】:Template Toolkit cannot find template files模板工具包找不到模板文件
【发布时间】:2014-12-04 12:03:46
【问题描述】:

我有以下 .htaccess 文件:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/views/.*/.*\.html
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/(.*)$ index.pl?controller=$1&action=$2&id=$3

这允许我将 /Users/show/1 之类的请求转发到我的主控制器。我还可以访问模板文件;至少在我的浏览器中我可以打开文件:

/views/Users/add.html

但是,当我想渲染模板时尝试访问控制器中的文件时,找不到它(没有这样的文件或目录)

这是我尝试渲染模板的代码:

package UsersController;


use Moose;
use Controllers::ControllerRole;
use Template;
with 'ControllerRole';


has 'example' => (
    is => 'rw',
    isa => 'Str',
    default =>'test',
);

sub show {  
    my $self = shift;
    my $id = $self->{params}->{id};

     my $config = {
        INTERPOLATE  => 1,               # expand "$var" in plain text
        POST_CHOMP   => 1,               # cleanup whitespace
        PRE_PROCESS  => 'header',        # prefix each template
        EVAL_PERL    => 1,               # evaluate Perl code blocks
    };

    my $vars = {
        id => $id,
    };

    my $template = Template->new();
    $template->process('views/Users/add.html', $vars) || die "$!";


}

1;  

我也尝试过使用绝对或相对路径,但 apache 抱怨这是不允许的

查看我的项目的文件结构可能会有所帮助:

更新: 如果我使用chdir 我可以open 使用 Perl 的打开功能的文件,但尝试处理文件我仍然得到错误

file error - header: not found

这是我的代码的第二次迭代:

sub show {  
    my $self = shift;
    chdir '/srv/http/perlweb';
    my $id = $self->{params}->{id};

     my $config = {
        INTERPOLATE  => 1,               # expand "$var" in plain text
        POST_CHOMP   => 1,               # cleanup whitespace
        PRE_PROCESS  => 'header',        # prefix each template
        EVAL_PERL    => 1,               # evaluate Perl code blocks
        ABSOLUTE => 1,
        RELATIVE => 1,
    };

    my $vars = {
        id => $id,
        planet => 'earth',
        captain => 'kirk',
    };

    open my $fh, "views/Users/add.html" or die "$!"; #this works

    close $fh;

    my $tt = Template->new($config);
    $tt->process('views/Users/add.html', $vars) or die $tt->error(); # this does not work

}

【问题讨论】:

  • 再一次,你有没有尝试在任何地方设置INCLUDE_PATH
  • 你把它设置成什么?你仍然得到同样的错误吗?当您使用INCLUDE_PATH 时,您是否同时启用了ABSOLUTERELATIVE
  • 您在PRE_PROCESS 配置选项中包含的header 文件在哪里? AFAICS,这就是 TT 所抱怨的。
  • 我删除了 pre_process 选项并且它起作用了
  • 我认为这可能是问题所在。 Apache 设置并不真正相关——模板工具包适用于本地文件。

标签: apache perl mod-rewrite routing


【解决方案1】:

Template Toolkit 具有配置选项INCLUDE_PATH,允许您设置一个或多个目录,Template Toolkit 在其中查找模板文件。如果您设置 include_path 变量,而不是将路径放在 $tt->process() 指令中,则可以在全局配置中设置路径,而不是在每个 $tt->process() 指令中硬编码路径,或者必须使用 ABSOLUTE 或 @987654326 @ 选项。您可以在INCLUDE_PATH 中指定多个目录,并使用子例程生成包含路径,因此您不限于将所有模板保存在一个目录中。

因此,我会将配置和流程指令更改为以下内容:

my $config = {
    INTERPOLATE  => 1,               # expand "$var" in plain text
    POST_CHOMP   => 1,               # cleanup whitespace
    PRE_PROCESS  => 'header',        # prefix each template
    EVAL_PERL    => 1,               # evaluate Perl code blocks
    INCLUDE_PATH => [ "/srv/http/perlweb/views/Users/",
                      "/wherever/header/is",
                      \&my_cool_sub_to_generate_a_path_on_the_fly ]
};

my $tt = Template->new($config);
$tt->process('add.html', $vars) or die $tt->error();

INCLUDE_PATH 上的文档包含有关此设置选项的完整信息。

请注意,您收到的错误是关于自动包含在每个模板中的文件 header - 确保您的 INCLUDE_PATH 中有它的目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 2020-07-06
    • 2013-06-13
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多