Php symfony sfValidatorSchemaCompare和dateformat输出问题

Php symfony sfValidatorSchemaCompare和dateformat输出问题,php,symfony1,Php,Symfony1,我有以下输入日期,我想检查结束日期是否早于开始日期: 输入:开始=>31/03/10结束=>07/03/10 输出:开始日期(2010-03-31)必须早于结束日期(2010-03-07) 您能否以某种方式更改日期输出?我需要错误消息来设置与输入相同的日期格式。 此外,出现错误时,我的输入字段设置为错误的日期格式 尝试了几件事,但目前运气不佳。没有找到symfony it self的解决方案或信息 我正在使用symfony 1.2.11版我与同事一起找到了解决方案 经过一些试用,我们找到了解决我

我有以下输入日期,我想检查结束日期是否早于开始日期:

输入:开始=>31/03/10结束=>07/03/10 输出:开始日期(2010-03-31)必须早于结束日期(2010-03-07)

您能否以某种方式更改日期输出?我需要错误消息来设置与输入相同的日期格式。 此外,出现错误时,我的输入字段设置为错误的日期格式

尝试了几件事,但目前运气不佳。没有找到symfony it self的解决方案或信息


我正在使用symfony 1.2.11版

我与同事一起找到了解决方案

经过一些试用,我们找到了解决我最初问题的办法。我们没有使用后验证器,而是编写了自己的验证器

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%")')))));
  }
以symfony形式使用验证程序:

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']));
    }

  }

}
这是一种解决方案,在验证时始终使用相同的日期格式,并且在触发验证时出现错误,则会以设置的相同日期格式正确返回日期格式

现在我们遇到的另一个“问题”是,当保存发生时,日期格式不适合mysql。因此,我们在symfony表单中重写save函数,并应用正确的日期格式

例如:

  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());
  }
因此,一旦验证有效,它将执行保存功能并在实际将其保存到数据库之前设置正确的日期格式


希望这对其他有此问题的人有所帮助。

我与同事一起找到了解决方案

经过一些试用,我们找到了解决我最初问题的办法。我们没有使用后验证器,而是编写了自己的验证器

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%")')))));
  }
以symfony形式使用验证程序:

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']));
    }

  }

}
这是一种解决方案,在验证时始终使用相同的日期格式,并且在触发验证时出现错误,则会以设置的相同日期格式正确返回日期格式

现在我们遇到的另一个“问题”是,当保存发生时,日期格式不适合mysql。因此,我们在symfony表单中重写save函数,并应用正确的日期格式

例如:

  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());
  }
因此,一旦验证有效,它将执行保存功能并在实际将其保存到数据库之前设置正确的日期格式


希望这对其他有此问题的人有所帮助。

鉴于您正在处理输入字符串,在表单发布后的操作中检查此问题可能更容易,并根据需要从中抛出错误或强制输入值。也许其他人有一个更好的主意。鉴于您正在处理输入字符串,在表单发布后的操作中检查这一点可能更容易,并根据需要从中抛出错误或强制值。也许其他人有更好的主意。