public function configure()
{
$this->widgetSchema['start_date'] = new sfWidgetFormInput();
$this->widgetSchema['end_date'] = new sfWidgetFormInput();
$this->validatorSchema->setPostValidator( new sfValidatorOr ( array(
new sfValidatorAnd( array
(new sfValidatorSchemaCompare('start_date', sfValidatorSchemaCompare::NOT_EQUAL, null),
new sfValidatorSchemaCompare('end_date', sfValidatorSchemaCompare::EQUAL, null)
)),
new sfValidatorSchemaCompare('start_date', sfValidatorSchemaCompare::LESS_THAN_EQUAL, 'end_date',
array('throw_global_error' => false), array('invalid' => 'The start date ("%left_field%") must be before the end date ("%right_field%")')))));
}
我有以下输入日期,我想检查结束日期是否不在开始日期之前:
输入:开始=> 31/03/10 End => 10年7月3日 输出:开始日期(2010-03-31)必须在结束日期(2010-03-07)之前
您能以某种方式更改日期输出吗?我需要错误消息来设置日期格式与输入相同。 当错误出现时,我的输入字段也会设置错误的日期格式。
尝试了几件事,但此刻没有运气。没有找到关于symfony的解决方案或信息。
我正在使用symfony版本1.2.11
答案 0 :(得分:1)
我和同事一起找到了解决方案。
经过一些试用,我们找到了解决我最初问题的方法。我们写的不是使用那个post验证器,而是自己的验证器。
class StartBeforeEndDateValidator extends sfValidatorBase {
public function configure($options = array(), $messages = array()) {
parent::configure($options, $messages);
$this->addMessage('Invalid_daterange', 'Start date (%start%) must be before End date (%end%)!');
}
public function doClean($values) {
sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
$timestampStart = sfContext::getInstance()->getI18N()->getTimestampForCulture($values['start_date'], sfContext::getInstance()->getUser()->getCulture());
$timestampEnd = sfContext::getInstance()->getI18N()->getTimestampForCulture($values['end_date'], sfContext::getInstance()->getUser()->getCulture());
if(format_date($timestampStart) > format_date($timestampEnd)){
throw new sfValidatorError($this, 'Invalid_daterange', array('start' => $values['start_date'], 'end' => $values['end_date']));
}
}
}
以symfony形式使用验证器:
public function configure() {
$this->widgetSchema['start_date'] = new sfWidgetFormInput();
$this->widgetSchema['end_date'] = clone $this->widgetSchema['start_date'];
$this->validatorSchema['start_date'] = new DateValidator();
$this->validatorSchema['end_date'] = clone $this->validatorSchema['start_date'];
$this->validatorSchema->setPostValidator(new StartBeforeEndDateValidator());
}
这是在验证时始终具有相同日期格式的解决方案,并且当错误触发验证时,日期的格式将以与设置相同的日期格式正确返回。
现在我们遇到的另一个“问题”是保存发生时,日期格式不适合mysql。因此,我们在symfony表单中覆盖save函数并应用正确的日期格式。
示例:
public function save($con = null){
$var = new Object();
if($this->taintedValues['id']!= ""){
$var->setId($this->taintedValues['id']);
}
$var->setStartDate(DateUtils::getIsoDateForCulture($this->taintedValues['start_date']));
$var->setEndDate(DateUtils::getIsoDateForCulture($this->taintedValues['end_date']));
$var->setIcpm($this->taintedValues['icpm']);
$var->save($con);
}
因此,一旦验证有效,它将执行保存功能并设置正确的日期格式,然后再将其保存到数据库中。
希望这对有这个问题的其他人有帮助。