- 使用HTML::FormHandler生成表单
首先尝试创建一个用户登录表单
package Update; use Moose; use HTML::FormHandler::Moose; #使用has_fields等语法糖 extends {HTML::FormHandler} use namespace::autoclean; use Digest::MD5 qw/md5_hex/; has '+name' => (default => 'update'); #form的名字 has '+auto_fieldset' => (default => 0); #不在form内添加fieldset #创建表单元素的依赖关系 has '+dependency' => (default => sub{[[qw/password confirm/]]}); has_field 'name' => (type => 'Text', required => 1); has_field 'email' => (type => 'Email', required => 1); #使用apply transform加密密码 has_field 'password' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], ); has_field 'confirm' => (type => 'Password', required => 1, apply => [{ transform => sub{ md5_hex(shift)}}], ); sub validate { my ($self) = @_; if ($self->field('confirm')->value ne$self->field(‘password’)–>value) {
$self->field('password')->add_error("password not match"); } } package Main; my $form = update->new(); $form->process(params => {name => 'woosley'}); print $form->render; Name: Email: Email field is required Password: Please enter a password in this
field
Confirm: Please enter a password in this
field
这里定义了一个用户update的form, 表单名为update,由'+name'一行定义,'+‘在moose里面表示这个属性在父对象里面定义,在子对象中可以进行覆盖操作。form里面包含name,password,email,所有的元素都是必须的
使用这个表单只需要像Main包里面一样,调用$form->process(param => {postparams});即可,$form->render获得HTML代码。可以看到上面代码里面只传入了name,因此会得到一堆错误信息.一般来说如果表单验证提交出错,所有的错误信息都放在$form->errors里面,所以一个表单提交过程应该为
$form = Form->new(); unless($form->process(params => {})){ ##处理 $form->errors } ## 表单提交成功HTML::FormHandler根据params参数是否为空来确定是否为表单提交,如果params为空,process也会返回失败,从而跳过表单提交后续部分工作。
对于每一个field的验证,可用使用 sub validate_fieldname {} 或者添加在has_field里面添加apply来实现,并定义出错信息
has_field 'email' => ( unique => 1, apply => [ { check => qr/^\w+\.\w+\@gmail\.com$/, message => 'Invalid Email' } ]);还可以如上添加validate method在最后验证整个表单
如前一篇博文所述,FormHandler使用不同的模块控制如何生成表单HTML,上面例子给出的>是<div>形式,我们也可以使用table形式或者在每一个field外面什么都不加
has '+widget_wrapper' => (default => 'Table'); has '+widget_form' => (default => 'Table');
http://search.cpan.org/~gshank/HTML-FormHandler-0.34001/lib/HTML/FormHandler/... 详细介绍了如何render
to be continued….

没有评论:
发表评论