2010-01-18 116 views
2

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

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:该网址已经存在”

是否有某种方式来删除“字段:” ??

谢谢

回答

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_length,max_length条件。

顺便说一句我假设你使用Doctrine,但我认为相同的验证器可用于Propel。


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

你也可以看看source code如果它可以帮助你。

+0

感谢Felix,它工作正常,它是一种干净的方法来做我想做的事。 你能帮我解决:“一个具有相同”urlres“的对象已经存在。”错误?我必须捕获哪些错误类型才能定制此错误消息? 非常感谢。 – nebur85 2010-01-20 11:34:08

+0

而另一个问题是......只有在填充字段时才有可能验证字段?在我的表单中,我可以填写电子邮件地址或电话号码......但要验证电子邮件地址,我需要将sfValidatorEmail分配给电子邮件字段...如果我这样做,他们会提出'无效'错误... – nebur85 2010-01-20 12:19:28

+0

是felix,是独特的。所以我必须阅读之前插入显示自定义错误? 谢谢 – nebur85 2010-01-20 15:45:07

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 

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

+0

DArmen,感谢,但我尽量说的是...... probabily在一个项目你必须从相同的实体/对象或probabily不止一种形式的所有实体/对象你想要显示消息'你必须输入字段'。这可能只在一个地方写'默认错误'吗? 我会尝试'无效'的错误,并希望工程:) 谢谢达门。 – nebur85 2010-01-19 09:07:50

+0

我在另一个项目中看到他们创建了一个类,并在里面定义了文本错误。这样他们可以做到这一点,但是......还有另一种方式? – nebur85 2010-01-19 09:15:07

+0

请看看更新的答案,这应该有助于 – Darmen 2010-01-19 09:24:13

0

Are there some way to delete "field:" ??

是:throw_global_error => true