symfony sfValidatorSchemaСравнить и проблема с форматированием даты - PullRequest
1 голос
/ 29 марта 2010
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 Конец => 07/03/10 Вывод: дата начала (2010-03-31) должна быть раньше даты окончания (2010-03-07)

Можете ли вы каким-то образом изменить вывод даты? Мне нужно сообщение об ошибке, чтобы установить формат даты так же, как ввод. Также мои поля ввода установлены с неправильным форматом даты, когда появляется ошибка.

Пробовал несколько вещей, но в этот момент не повезло. Не нашел решения или информации о Symfony самостоятельно.

Я использую Symfony версии 1.2.11

1 Ответ

1 голос
/ 31 марта 2010

Я нашел решение вместе с коллегой.

После некоторых попыток мы нашли решение моей первоначальной проблемы. Вместо того, чтобы использовать этот пост валидатор, мы написали собственный валидатор.

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

  }

Таким образом, после проверки правильности, она выполнит функцию сохранения и установит правильный формат даты перед тем, как фактически сохранить ее в базе данных.

Надеюсь, что это полезно для других людей, у которых была эта проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...