首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板工具包找不到模板文件

模板工具包找不到模板文件
EN

Stack Overflow用户
提问于 2014-10-09 14:00:20
回答 1查看 920关注 0票数 1

我有以下.htaccess文件:

代码语言:javascript
复制
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这样的请求转发给我的主控制器。我还可以访问模板文件;至少在浏览器中我可以打开该文件:

/视图/用户/add.html

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

下面是我尝试呈现模板的代码:

代码语言:javascript
复制
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,我可以使用Perl的打开函数对文件进行open,但是尝试处理该文件时仍然会出现错误

file error - header: not found

下面是我的代码的第二次迭代:

代码语言:javascript
复制
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

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-09 16:31:04

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

因此,我将将配置和进程指令更改为:

代码语言:javascript
复制
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中有它的目录。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26280435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档