Symfony1 日期字段的Symfony表单验证(sfWidgetFormI18nDate)
我使用的是Symfony 1.2.9,我有一个包含两个日期字段的表单: 开始日期和结束日期 我想对“开始日期”字段强制执行以下验证标准: 我不能小于今天的日期 二,。不能大于结束日期 iii.不得超过1个月 离开 对于结束日期,我需要以下限制: 我不能超过3个月 从今天开始 我已经编写了一份验证器后检查,如下所示: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
$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和其他东西,尤其是当它变得复杂时——我更喜欢使用自定义方法,这样我就知道了所有东西的位置:-