Symfony1 日期字段的Symfony表单验证(sfWidgetFormI18nDate)

Symfony1 日期字段的Symfony表单验证(sfWidgetFormI18nDate),symfony1,Symfony1,我使用的是Symfony 1.2.9,我有一个包含两个日期字段的表单: 开始日期和结束日期 我想对“开始日期”字段强制执行以下验证标准: 我不能小于今天的日期 二,。不能大于结束日期 iii.不得超过1个月 离开 对于结束日期,我需要以下限制: 我不能超过3个月 从今天开始 我已经编写了一份验证器后检查,如下所示: $today = date('Y-m-d'); //post validator check to make sure end date > start date $this

我使用的是Symfony 1.2.9,我有一个包含两个日期字段的表单:

开始日期和结束日期

我想对“开始日期”字段强制执行以下验证标准:

我不能小于今天的日期 二,。不能大于结束日期 iii.不得超过1个月 离开 对于结束日期,我需要以下限制:

我不能超过3个月 从今天开始 我已经编写了一份验证器后检查,如下所示:

$today = date('Y-m-d');

//post validator check to make sure end date > start date
$this->validatorSchema->setPostValidator(
 new sfValidatorAnd(array(
    new sfValidatorSchemaCompare('start_date', '<', 'end_date',
      array('throw_global_error' => true),
      array('invalid' => 'The start date ("%left_field%") must be before the end date ("%right_field%")<br />')
       ),

    new sfValidatorSchemaCompare('start_date', '<', $today,
      array('throw_global_error' => true),
      array('invalid' => 'The start date ("%left_field%") cannot be earlier than today\'s date: ('.$today.')<br />')
       ),

    new sfValidatorSchemaCompare('end_date', '>', $today,
      array('throw_global_error' => true),
      array('invalid' => 'The end date ("%left_field%") cannot be before today\'s date ("%right_field%")<br />')
       )
    )
   )
 );
然而,这是行不通的——也就是说,我还没有找到一种方法来实施基于今天日期的限制,或者从今天日期开始的补偿


非常欢迎提供解决方案。

我个人认为,为了代码的可读性,我会将验证后检查转移到表单上的验证后方法中,vis:

public function configure()
{
  // your normal configuration stuff goes here

  // set up your post validator method
  $this->validatorSchema->setPostValidator(
    new sfValidatorCallback(array(
      'callback' => array($this, 'postValidate')
    ))
  );
}
然后您可以执行以下操作:

public function postValidate($validator, $values)
{
  $today = date("Y-m-d");

  if (strtotime($values["start_date"]) < strtotime($today))
  {
    $error = new sfValidatorError($validator, "Start date cannot be before than today");
    throw new sfValidatorErrorSchema($validator, array('start_date' => $error));
  }

  if (strtotime($values["start_date"]) > strtotime($values["end_date"]))
  {
    // throw a similar validation error here
  }

  // etc...
}

就我个人而言,为了代码的可读性,我会将您的验证后检查转移到表单上的验证后方法中,vis:

public function configure()
{
  // your normal configuration stuff goes here

  // set up your post validator method
  $this->validatorSchema->setPostValidator(
    new sfValidatorCallback(array(
      'callback' => array($this, 'postValidate')
    ))
  );
}
然后您可以执行以下操作:

public function postValidate($validator, $values)
{
  $today = date("Y-m-d");

  if (strtotime($values["start_date"]) < strtotime($today))
  {
    $error = new sfValidatorError($validator, "Start date cannot be before than today");
    throw new sfValidatorErrorSchema($validator, array('start_date' => $error));
  }

  if (strtotime($values["start_date"]) > strtotime($values["end_date"]))
  {
    // throw a similar validation error here
  }

  // etc...
}

谢谢,但我有两个问题:1。如何在表单验证期间触发“postValidate”方法?2.您没有使用传入的验证器作为参数,在伪代码中,查看如何使用传入的验证器抛出验证错误将非常有用。编辑以进一步解释:-非常感谢。抱歉耽误了你的回复。我将尝试实施它——如果它奏效,我将接受它作为答案。里奇,我感谢你。我简直不敢相信。这是我长久以来一直试图解决的问题,感觉就像永远。文档和在线提示等现在都很有用。我必须承认,我实施了你的建议,但有些怀疑,因为我过去在这个问题上的经验——甚至SF论坛也没有帮助——但你的解决方案奏效了。哇!我感谢你!没问题-很高兴我能帮忙!我个人不喜欢SFValidator之类的东西,尤其是当它变得复杂时——我更喜欢使用自定义方法,这样我就知道所有东西都在哪里了:-谢谢,但我有两个问题:1。如何在表单验证期间触发“postValidate”方法?2.您没有使用传入的验证器作为参数,在伪代码中,查看如何使用传入的验证器抛出验证错误将非常有用。编辑以进一步解释:-非常感谢。抱歉耽误了你的回复。我将尝试实施它——如果它奏效,我将接受它作为答案。里奇,我感谢你。我简直不敢相信。这是我长久以来一直试图解决的问题,感觉就像永远。文档和在线提示等现在都很有用。我必须承认,我实施了你的建议,但有些怀疑,因为我过去在这个问题上的经验——甚至SF论坛也没有帮助——但你的解决方案奏效了。哇!我感谢你!没问题-很高兴我能帮忙!我个人不喜欢SFV和其他东西,尤其是当它变得复杂时——我更喜欢使用自定义方法,这样我就知道了所有东西的位置:-