第四章 掌握View 第三节 把TT作为View使用
时间:2007-04-18 来源:xiaoshengcaicai
要把TT作为View在Catalyst里面使用,只需要:
1. 建立一个X::View::MyView, 使之继承自Catalyst::View::TT.
2. 配置这个View.
现在继续拿出我们前面几章里面的示例项目: X, 键入命令:
perl script/x_create.pl View MyView TT
这条命令执行完, 会在lib/X/View/下面创建X::View::MyView.pm.
接下来我们进行配置.
假设我们现在要给这个View配置模板的默认扩展名为.tt.
对于Catalyst的组件, 配置主要有3种方法,
第一种是直接在组件内部配置, 也就是在Catalyst::View::MyView.pm里面写:
__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt');
第二种是在应用程序类内配置, 也就是在MyApp.pm里面, 在setup这行代码前写:
__PACKAGE__->conifg( 'View::MyView' => { TEMPLATE_EXTENSION => '.tt', } );
第三种是在x.yml里面配置,前提是项目使用了ConfigLoader这个插件. 在x.yml里面写:
View::MyView:
TEMPLATE_EXTENSION: .tt
第3种方法是比较推荐的做法, 整个项目的组件跟插件的配置,或者是其他的配置, 都可以写到x.yml里面.
关于这个View更详细的配置,请参看CPAN文档. 现在我们整个x.yml里面内容如下:
__HOME__是ConfigLoader支持的一个变量,它实际上指整个项目的home目录
这几行配置使到View::MyView在找模板的时候会去__HOME__/root/tt目录下找, 当我们没有指定模板名时,这个View会根据当前匹配的action名以及配置的扩展名.tt去找模板.
下面我们在root/tt/下面建立一个test.tt,内容如下:
在Root.pm里面修改action代码如下:
启动我们的x_server.pl,访问http://xxxx/t
你会看到页面:
当你访问http://xxxx/t时, t这个action匹配这个URL.
我们准备在这个action里面使用一个叫test.tt的模板, 所以我们先把模板名字存到stash里面, 待会View::MyView会把从stash里面得到这个模板名字,然后去磁盘读取这个模板.
我们还往stash里面放了一些变量: var1,var2,这些stash里面的变量, 待会View::MyView都会从stash里面把它们读出来,然后全部替换到模板里面.
在end这个action里面, 程序forward到View::MyView这个组件, 该组件的process方法会从stash读出template的名字, 然后从磁盘加载模板, 再把stash里面的变量都替换到模板里面, 最后把输出保存到$c->res->body里面.
然后你会发现,我们并没有往$c->stash里面放入一个名为c的变量,为什么模板里面却有这样的语句呢: [% c.config.name %], 那是因为, View::MyView会自动的把$c这个变量放到模板里面去替换变量c.所以我们可以在action里面省略这样的代码: $c->stash->{c} = $c;
1. 建立一个X::View::MyView, 使之继承自Catalyst::View::TT.
2. 配置这个View.
现在继续拿出我们前面几章里面的示例项目: X, 键入命令:
perl script/x_create.pl View MyView TT
这条命令执行完, 会在lib/X/View/下面创建X::View::MyView.pm.
接下来我们进行配置.
假设我们现在要给这个View配置模板的默认扩展名为.tt.
对于Catalyst的组件, 配置主要有3种方法,
第一种是直接在组件内部配置, 也就是在Catalyst::View::MyView.pm里面写:
__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt');
第二种是在应用程序类内配置, 也就是在MyApp.pm里面, 在setup这行代码前写:
__PACKAGE__->conifg( 'View::MyView' => { TEMPLATE_EXTENSION => '.tt', } );
第三种是在x.yml里面配置,前提是项目使用了ConfigLoader这个插件. 在x.yml里面写:
View::MyView:
TEMPLATE_EXTENSION: .tt
第3种方法是比较推荐的做法, 整个项目的组件跟插件的配置,或者是其他的配置, 都可以写到x.yml里面.
关于这个View更详细的配置,请参看CPAN文档. 现在我们整个x.yml里面内容如下:
---
View::MyView: |
__HOME__是ConfigLoader支持的一个变量,它实际上指整个项目的home目录
这几行配置使到View::MyView在找模板的时候会去__HOME__/root/tt目录下找, 当我们没有指定模板名时,这个View会根据当前匹配的action名以及配置的扩展名.tt去找模板.
下面我们在root/tt/下面建立一个test.tt,内容如下:
hello, this is only a test <br> [% var2 %] <br> our project name is :[% c.config.name %] |
在Root.pm里面修改action代码如下:
sub default : Private { my ( $self, $c ) = @_; $c->response->body( $c->welcome_message ); } sub t :Local { my ( $self, $c ) = @_; $c->stash->{template} = 'test.tt'; } sub end : Private { my ( $self, $c ) = @_; $c->forward('View::MyView') unless $c->res->body; } |
启动我们的x_server.pl,访问http://xxxx/t
你会看到页面:
hello, this is only a test this is var1 this is var2 our project name is :X |
当你访问http://xxxx/t时, t这个action匹配这个URL.
我们准备在这个action里面使用一个叫test.tt的模板, 所以我们先把模板名字存到stash里面, 待会View::MyView会把从stash里面得到这个模板名字,然后去磁盘读取这个模板.
我们还往stash里面放了一些变量: var1,var2,这些stash里面的变量, 待会View::MyView都会从stash里面把它们读出来,然后全部替换到模板里面.
在end这个action里面, 程序forward到View::MyView这个组件, 该组件的process方法会从stash读出template的名字, 然后从磁盘加载模板, 再把stash里面的变量都替换到模板里面, 最后把输出保存到$c->res->body里面.
然后你会发现,我们并没有往$c->stash里面放入一个名为c的变量,为什么模板里面却有这样的语句呢: [% c.config.name %], 那是因为, View::MyView会自动的把$c这个变量放到模板里面去替换变量c.所以我们可以在action里面省略这样的代码: $c->stash->{c} = $c;
相关阅读 更多 +