2009-08-16 2 views
4

Template Toolkit .tt 파일에서 외부 Perl 모듈을 호출하려고합니다. 내가 사용하고자하는 모듈은 Util이며, Util::prettify_date으로 전화하기를 원합니다. Template Toolkit의 플러그인 인터페이스를 사용하여이 모듈을 포함시킬 수있었습니다 :로드, 새 기능 및 오류 함수 (여기에 설명 된대로 : http://template-toolkit.org/docs/modules/Template/Plugin.html)를 설정하고 [% USE Util %]을 사용하여 포함합니다.플러그인이없는 템플릿 툴킷에서 모듈 외부에서 호출 하시겠습니까?

잘 작동하지만, 템플릿 툴킷에있는 USE Perl 모듈을 플러그인 할 필요가 없는지 궁금합니다. 플러그인을 만들 때 가장 중요한 문제는 객체 지향 (즉, $ self를 첫 번째 인수로 받아들임)의 모든 함수를 만들어야한다는 것입니다. 실제로 의미가 없습니다.

답변

6

[% PERL %] 블록에 use 모듈을 보내 봤습니까?

이제 개인적으로 첫 번째 인수를 제거한 후 MyOrg::Plugin::Util->prettify_dateUtil::prettify_date에 중계하는 플러그인을 작성했습니다. 당신은뿐만 아니라 이러한 방법의 생성을 자동화 할 수 있습니다 :

my @to_proxy = qw(prettify_date); 

sub new { 
    my $class = shift; 

    { 
     no strict 'refs'; 
     for my $sub (@to_proxy) { 
      *{"${class}::${sub}"} = sub { 
       my $self = shift; 
       return "My::Util::$sub"->(@_); 
      } 
     } 
    } 
    bless {} => $class; 
} 
14

또한이 같은 템플릿 기능 (. 즉, 서브 루틴)을 전달할 수 있습니다

use strict; 
use warnings; 
use List::Util(); 
use Template; 

my $tt = Template->new({ 
    INCLUDE_PATH => '.', 
}); 

$tt->process('not_plugin.tt', { 
    divider => sub { '=' x $_[0]   }, 
    capitalize => sub { ucfirst $_[0]   }, 
    sum  => sub { List::Util::sum(@_) }, 
}); 


not_plugin.tt
 
[% divider(40) %] 
Hello my name is [% capitalize('barry') %], how are u today? 
The ultimate answer to life is [% sum(10, 30, 2) %] 
[% divider(40) %] 


제작 예정 예 :

 
======================================== 
Hello my name is Barry, how are u today? 
The ultimate answer to life is 42 
========================================