自定义错误symfony

时间:2010-01-18 14:11:16

标签: forms symfony1 customization

Symfony中有一些“最佳实践”来自定义表单错误? 例如,如果我需要在场地上显示“Campo obligatorio”。

1)我怎样才能以更好的方式做到并且独立于什么样的形式呢? 2)如何自定义消息'已存在具有相同“%namefield”的对象。 ?

由于

更新

抱歉,但是如果我试着'无效'你怎么说我......它给我打错了同样的错误

$this->setValidator('urlres', new sfValidatorString(array(
                          'min_length' => 6,
                        ), array(
                          'min_length' => 'URL must be longer',
                          'required'   => 'Required field',
                          'invalid' => 'URL exist'
                        )));
打印我:     *已存在具有相同“urlres”的对象。

更新 菲利克斯,你的解决方案很棒,但它给我打印这个错误: “urlres:那个网址已经存在”

有没有办法删除“field:”??

由于

3 个答案:

答案 0 :(得分:11)

也许this form post会帮助你:

放置代码

sfValidatorBase::setDefaultMessage('required', 'Field required');

在您的应用程序配置apps/youApp/config/yourAppConfiguration.class.php的“配置”中。

您应该能够以这种方式为每种错误消息类型设置默认值。


如果要为某些字段设置某些错误消息,请考虑创建一个定义所有这些字段的表单类,并让所有其他表单继承此字段。
然后,子类仅指定应显示哪些字段(可能还有自定义验证逻辑)。

您可以在symfony书的Admin Generator chapter中找到如何执行此操作的示例。

这是最尴尬的方法恕我直言。


修改

如果您希望将保留字段留空,则必须添加required => false选项:

  'email'   => new sfValidatorEmail(array('required' => false))

关于错误消息:这听起来像urlres在数据库表中被标记为唯一,并且该值已经存在。也许您应该检查数据库模式定义。


编辑2:

要测试长度和唯一性,您应该使用sfValidatorAndsfValidatorDoctrineUnique

$this->setValidator('urlres', new sfValidatorAnd(
                    array(
                      new sfValidatorString(
                            array( 'min_length' => 6, ), 
                            array( 'required' => 'Required field',
                                   'min_length' => 'URL must be at least %min_length% chars long.' )
                      ),
                      new sfValidatorDoctrineUnique(
                            array( 'model' => 'yourModel', 
                                   'column' => 'theColumn', 
                                   'primary_key' => 'thePrimaryKeyColumn',
                                   'throw_global_error' => false),
                            array('invalid' => "That URL already exists")
                      )
                    ));

此外,您在字符串验证程序中使用invalid错误代码也不正确。您将无效邮件设置为 URL exists ,但字符串验证程序如何知道此?它仅检查给定字符串是否符合min_lengthmax_length标准。

顺便说一下,我假设您使用了Doctrine,但我认为Propel可以使用相同的验证器。


编辑3:
设置选项'throw_global_error' => false。但我不确定这是否有效。

如果对source code有所帮助,您还可以查看{{3}}。

答案 1 :(得分:0)

让我试着帮助你。 您可以在表单类的configure方法中轻松自定义标准表单错误。这是一个例子: 1)

<?php
   class myForm extends BaseMyForm
      public function configure(){
         parent::configure();
         $this->setValidator(
            'my_field' => new sfValidatorString(
               array('min_length'=>3, 'max_length'=>32, 'required'=>true),
               array('required' => 'Hey, this field is required!')
            )
         );
      }

2)只需更改代码为“无效”的邮件。

您只需找到有效的消息代码即可自定义特定的默认消息。更多信息 - Symfony Forms in Action: Chapter 2 - Form Validation

<强>更新

如果您不想在所有表单类中自定义错误消息,只需创建自己的基本验证程序类:

abstract class myBaseValidator extends sfValidatorBase

并重新定义默认的“必填”和“无效”消息。

答案 2 :(得分:0)

  

有没有办法删除“字段:”   ??

是:throw_global_error => true