Catalyst::Manual::Tutorial::09_AdvancedCRUD::09_FormHandler
学习笔记(2010-8-30 星期一)
文章来源:
概述
......
sudo cpan HTML::FormHandler::Model::DBIC
|
Makefile.PL 中也需添加:
requires 'HTML::FormHandler::Model::DBIC';
|
在 controllers 中使用 FormHandler
FormHandler doen't have a Catalyst base controller, because interfacing to a form is only a couple of lines of code.
创建目录 lib/MyApp/Form
. 创建文件: lib/MyApp/Form/Book.pm
:
package MyApp::Form::Book;
use HTML::FormHandler::Moose; extends 'HTML::FormHandler::Model::DBIC'; use namespace::autoclean;
has '+item_class' => ( default =>'Books' ); has_field 'title'; has_field 'rating' => ( type => 'Integer' ); has_field 'authors' => ( type => 'Multiple', label_column => 'last_name' ); has_field 'submit' => ( type => 'Submit', value => 'Submit' );
__PACKAGE__->meta->make_immutable; 1;
|
文件 lib/MyApp/Controller/Books.pm
顶部添加:
添加方法:
sub create : Chained('base') PathPart('create') Args(0) { my ($self, $c ) = @_; my $book = $c->model('DB::Book')->new_result({}); return $self->form($c, $book); }
sub form { my ( $self, $c, $book ) = @_; my $form = MyApp::Form::Book->new; # Set the template $c->stash( template => 'books/form.tt2', form => $form ); $form->process( item => $book, params => $c->req->params ); return unless $form->validated; $c->flash( message => 'Book created' ); # Redirect the user back to the list page $c->response->redirect($c->uri_for($self->action_for('list'))); }
|
这两个方法其实可以合并,但我们后面编写 'edit' 的时候需要调用 'form',所以分离出来。
编辑 root/src/books/form.tt2
:
[% META title = 'Create/Update Book' %] [%# Render the HTML::FormHandler Form %] [% form.render %] <p><a href="[% c.uri_for(c.controller.action_for('list')) %]">Return to book list</a></p>
|
编辑 root/src/books/list.tt2 ,文件底部添加
:
... <p> HTML::FormHandler: <a href="[% c.uri_for(c.controller.action_for('create')) %]">Create</a> </p>
|
此链接用于指向 HTML::FormHandler-based 表单.
用 Ctrl-C
杀掉服务进程(如果服务进程在的话),重启服务:
以用户 test01
登录(密码: mypass). 进入图书列表页面,点击刚加的 HTML::Formhandler "Create" 链接,填入以下内容:
Title = "Internetworking with TCP/IP Vol. II" Rating = "4" Author = "Comer"
|
点击提交, 会看到"Book created" 信息。
注意: 'Author' 为选择列表输入,只有数据库中存在的 authors 才能输入。 'ratings' 域只能输入整数。
编辑 lib/MyApp/Form/Book.pm
。
限制 title 长度和设为必填:
has_field 'title' => ( minlength => 5, maxlength => 40, required => 1 );
|
设定 rating 的输入范围:
has_field 'rating' => ( type => 'Integer', range_start => 1, range_end => 5 );
|
'authors' 关系为 'many-to-many' ,所以这里我们设置为Multiple to,允许选择多个作者,同时设为必填:
has_field 'authors' => ( type => 'Multiple', label_column => 'last_name', required => 1 );
|
注意: FormHandler 会自动的去除输入域的首尾空字符。你想实现更多的功能,参考这里 。
以用户
test01登录,尝试下各种错误输入,比如:
标题小于5个字符,非数字的 rating ,rating 为0或6,等等。还可以试下选择一个,两个,或者没有作者。
编辑 lib/MyApp/Controller/Books.pm
添加方法:
sub edit : Chained('object') PathPart('edit') Args(0) { my ( $self, $c ) = @_; return $self->form($c, $c->stash->{object}); }
|
编辑 root/src/books/list.tt2
, 在 "Delete" 下添加 'edit' 链接:
<td> [% # Add a link to delete a book %] <a href="[% c.uri_for(c.controller.action_for('delete'), [book.id]) %]">Delete</a> [% # Add a link to edit a book %] <a href="[% c.uri_for(c.controller.action_for('edit'), [book.id]) %]">Edit</a> </td>
|
Try Out the Edit/Update Feature
以用户 test01登录,访问
. 点击 "Internetworking with TCP/IP Vol. II" 旁边的 "Edit" 链接,将 rating 改为 3,将标题的 "II" 改为 2,添加 Stevens 为第二作者 (通过点击选择添加), 然后提交。页面会返回到书目列表,能够看到提示信息"Book edited" 。你可以自行体验其他特性。
#formhandler on irc.perl.org mailing list: code:
|
本章结束
阅读(1109) | 评论(0) | 转发(2) |