【问题标题】:HTML::FormHandler subclass fieldsHTML::FormHandler 子类字段
【发布时间】:2013-02-06 01:19:32
【问题描述】:

我正在使用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中,它只是完全覆盖了父表单对电子邮件字段的定义,并创建了一个新的。无论如何,只是将父表单字段子类化或添加到它,还是我只需要再次重新定义电子邮件字段以获得我想要的更改?谢谢!

【问题讨论】:

    标签: perl subclass catalyst


    【解决方案1】:

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

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

    【讨论】:

    • 这将使电子邮件定义的所有其他部分(除了元素类)保持不变?
    • 是的。碰巧组合设置的哈希合并有点复杂。
    【解决方案2】:

    您可以创建自定义字段类型。看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/],
    );
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2014-02-24
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多