Я нашел решение вместе с коллегой.
После некоторых попыток мы нашли решение моей первоначальной проблемы. Вместо того, чтобы использовать этот пост валидатор, мы написали собственный валидатор.
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 и применяем правильный формат даты.
пример:
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);
}
Таким образом, после проверки правильности, она выполнит функцию сохранения и установит правильный формат даты перед тем, как фактически сохранить ее в базе данных.
Надеюсь, что это полезно для других людей, у которых была эта проблема.