【问题标题】:Customize errors symfony自定义错误 symfony
【发布时间】:2010-01-18 14:11:16
【问题描述】:

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:那个url已经存在”

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

谢谢

【问题讨论】:

    标签: forms symfony1 customization


    【解决方案1】:

    也许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

    【讨论】:

    • 谢谢菲利克斯,它工作正常,这是一种干净的方法来做我想做的事。你能帮我解决“已经存在具有相同“urlres”的对象吗?错误?我必须捕获什么错误类型才能自定义此错误消息?非常感谢。
    • 还有一个问题......只有在填写时才能验证字段?在我的表格中,我可以填写电子邮件地址或电话号码...但是要验证电子邮件地址,我需要将 sfValidatorEmail 分配给电子邮件字段...如果我这样做,他们会引发“无效”错误...
    • 是的,felix,是独一无二的。所以我必须在插入之前阅读以显示自定义错误?谢谢
    • 感谢 felix,它工作正常 :) 它打印我这个错误“urlres:那个 url 已经存在”,还有一些方法可以只显示没有字段的错误消息..?
    【解决方案2】:

    让我试着帮助你。 您可以在表单类的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
    

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

    【讨论】:

    • DArmen,谢谢,但我想说的是......可能在一个项目中,您有多个来自同一实体/对象的表单,或者可能在您想要显示消息的所有实体/对象中您必须输入字段'。这可能只在一个地方写“默认错误”吗?我将尝试“无效”错误并希望有效:) 谢谢 Darmen。
    • 我在另一个项目中看到他们创建了一个类,并在其中定义了文本错误。这样他们可以做到这一点,但是……还有其他方法吗?
    • @Darmen:你做错了 - 检测到硬编码
    • @Develop7,是的,我知道,我的错。只是想示意性地展示
    • 创建一个自定义的基本验证器来设置默认的requiredinvalid 消息确实是不必要的(如果没有错误的话),因为您可以使用例如设置默认值。 sfValidatorBase::setDefaultMessage('required', 'Field required');
    【解决方案3】:

    有什么方法可以删除“字段:” ??

    是的:throw_global_error =&gt; true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多