symfony sfValidatorSchemaCompare和dateformat输出问题

时间:2010-03-29 17:35:08

标签: php symfony1

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

1 个答案:

答案 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);

  }

因此,一旦验证有效,它将执行保存功能并设置正确的日期格式,然后再将其保存到数据库中。

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