Forms 自定义错误symfony

Forms 自定义错误symfony,forms,symfony1,customization,Forms,Symfony1,Customization,Symfony中有一些自定义表单错误的“最佳实践”? 例如,如果我想在需要字段时显示“Campo obligatorio” 1) 我怎样才能更好地做到这一点,并且不受形式的影响? 2) 如何自定义消息“已存在具有相同“%namefield”的对象” 谢谢 已更新 对不起,但如果我试着像你说的那样做“无效”的话。。。它告诉我同样的错误 $this->setValidator('urlres', new sfValidatorString(array(

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”的对象

已更新 Felix,你的解决方案很棒,但它告诉我这个错误: “urlres:该url已存在”

是否有删除“字段:”的方法

谢谢,让我来帮你吧。 您可以在表单类的
configure
方法中轻松自定义标准表单错误。以下是一个例子: (一)

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

可能有助于您:

输入密码

sfValidatorBase::setDefaultMessage('required', 'Field required');
在应用程序配置的“配置”中
apps/youApp/config/yourAppConfiguration.class.php

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


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

您可以在symfony书的第页中找到一个如何执行此操作的示例

这是IMHO最干净的方法


编辑:

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

  'email'   => new sfValidatorEmail(array('required' => false))
关于错误消息:这听起来像是
urlres
在数据库表中被标记为唯一,并且该值已经存在。也许您应该检查数据库模式定义


编辑2:

要同时测试长度和唯一性,应使用和
sfValidatorDoctrineUnique

$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")
                      )
                    ));
此外,您在字符串验证程序中使用的
无效
错误代码也不正确。您将无效消息设置为

URL存在
,但是字符串验证程序如何知道这一点?它只检查给定字符串是否满足
minu_length
max_length
标准

顺便说一句,我假设您使用条令,但我认为相同的验证器可用于推进


编辑3:
设置选项
'throw\u global\u error'=>false
。但我不确定这是否有效

如果它对您有帮助,您还可以查看

是否有办法删除“字段:” ?


是:
throw\u global\u error=>true

DArmen,谢谢,但我想说的是。。。在一个项目中,可能有来自同一实体/对象的多个表单,也可能有来自所有实体/对象的多个表单,您希望显示消息“you must enter field”。是否可以只在一个位置写入“默认错误”?我将尝试“无效”错误,并希望它能起作用:)谢谢Darman。我在另一个项目中看到,他们创建了一个类,并在其中定义了文本错误。这样他们可以做到,但是。。。还有别的办法吗?@Darman:你做错了-硬编码detected@Develop7是的,我知道,我的错。只是想示意图显示创建自定义基本验证器以设置默认值
必需的
无效的
消息实际上是不必要的(如果没有错误的话),因为您可以使用例如
sfValidatorBase::setDefaultMessage('required','fieldrequired')设置默认值谢谢Felix,它工作得很好,而且它是一个干净的方法来做我想要的事情。您能帮我解决“已经存在具有相同“urlres”的对象”错误吗?要自定义此错误消息,我必须捕获什么错误类型?非常感谢。还有一个问题。。。仅当字段已填充时才可以验证该字段吗?在我的表格中,我可以填写电子邮件地址或电话号码。。。但要验证电子邮件地址,我需要将sfValidatorEmail分配给电子邮件字段…如果我这样做,它们会引发“无效”错误…是的,felix是唯一的。所以我必须在插入之前阅读以显示自定义错误?谢谢Hanks felix,它工作得很好:)它向我打印了这个错误“urlres:该url已经存在”,有没有办法只显示错误消息而不显示字段。。?
  'email'   => new sfValidatorEmail(array('required' => false))
$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")
                      )
                    ));