HTML :: FormHandler子类字段

时间:2013-02-03 00:03:42

标签: perl subclass catalyst

我正在使用HTML::FormHandler,并且为了不重复代码,我想利用它的子类化功能。目前我有两种形式:

myapp::Form::Account::Base
myapp::Form::Account::Register

myapp::Form::Account::Register继承自myapp::Form::Account::Basemyapp::Form::Account::Base有一个电子邮件字段,定义如下:

has_field 'email' => (
    label            => 'Email',
    type             => 'Text',
    apply            => [ Email ],
    element_class    => [qw/email/],
    required         => 1,
    unique           => 1,
    element_attr => {autocomplete=>"off"}, #for register page
);

myapp::Form::Account::Register中,我希望拥有完全相同的已定义电子邮件字段,但我想将“uniqueemail”类添加到其中。但是,每当我这样做时:

has_field 'email' => (
    element_class    => [qw/uniqueemail/],
);

myapp::Form::Account::Register中,它只是完全覆盖了父表单对电子邮件字段的定义,并创建了一个新表单。无论如何只是将父类的表单字段子类化或添加到它,或者我是否只需要再次重新定义电子邮件字段以获得我想要的更改?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以通过在字段名称前使用“+”来提供覆盖父定义的字段定义:

has_field '+email' => (
    element_class    => [qw/uniqueemail/],
);

答案 1 :(得分:1)

您可以创建自定义字段类型。查看HTML :: FormHandler :: Field :: Text或HTML :: FormHandler :: Field :: Email的定义:

然后使用您想要的默认值输入您的电子邮件类型。然后在myapp :: Form :: Account :: Base中,您的电子邮件字段将如下所示:

has_field 'email' => (
    type             => '+myapp::Form::Account::CustomEmail'
);

然后在myapp :: Form :: Account :: Register:

has_field 'email' => (
    type             => '+myapp::Form::Account::CustomEmail',
    element_class    => [qw/uniqueemail/],
);