2014-10-09 75 views
1

我有以下.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 

這讓我像/用戶/顯示/ 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; 

我還使用絕對或相對路徑嘗試過,但阿帕奇抱怨說,這是不允許的

它可能以有益的,看看我的項目的文件結構:

enter image description here

更新: 如果我使用chdir我可以open與Perl的open函數的文件,而是試圖處理文件我仍然得到錯誤

file error - header: not found

這裏是一個第二iterati在我的代碼:

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 

} 
+0

同樣,你是否嘗試過在任何地方設置['INCLUDE_PATH'](https://metacpan.org/pod/Template#INCLUDE_PATH)? – ThisSuitIsBlackNot 2014-10-09 16:17:28

+0

是的,ID做到了這一點 – Luke 2014-10-09 16:18:05

+0

你設置了什麼?你仍然得到同樣的錯誤?當你使用'INCLUDE_PATH'時,你有'ABSOLUTE'和'RELATIVE'兩個選項嗎? – ThisSuitIsBlackNot 2014-10-09 16:21:06

回答

2

模板工具包具有配置選項INCLUDE_PATH,允許您設置一個或多個目錄中的模板工具包看起來找到模板文件。如果設置了include_path變量,而不是將路徑放入$tt->process()指令中,則可以在全局配置中設置路徑,而不是在每個$tt->process()指令中設置硬編碼路徑,或者必須使用ABSOLUTERELATIVE選項。您可以在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中。