symfony sfValidatorSchemaCompare ve dateformat çıktı sorunu

1 Cevap php
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%")')))));
  }

Ben bitiş tarihi başlangıç ​​tarihinden önce olup olmadığını kontrol etmek istiyorsanız aşağıdaki giriş tarihleri ​​var:

Input: Start => 31/03/10 End=> 07/03/10 Output: The start date (2010-03-31) must be before the end date (2010-03-07)

Can you in some way change the date output? I need the error message to set the date format the same as the input. Also my input fields are set with the wrong date format when the error appears.

Şu anda bazı şeyleri, ama hayır şans denedi. Symfony o kendini bir çözüm ya da bir bilgi bulamadık.

Ben symfony sürüm 1.2.11 kullanıyorum

1 Cevap

Ben birlikte bir meslektaşı ile bir çözüm bulundu.

Bazı Seçmeleri sonra, benim ilk soruna çözüm bulundu. Bunun yerine sonrası doğrulayıcı kullanarak, biz kendi onaylayıcı vardır yazdı.

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 şeklinde Doğrulayıcı Kullanımı:

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

Bu doğrulanmış ediliyor ve doğrulama bir hata ile tetikleyici olduğunda ayarlandığı gibi, tarih biçimi doğru aynı tarih biçiminde döndürülen her zaman aynı tarih biçimi için çözüm oldu.

Kaydetmek oldu Şimdi ne zaman karşılaştığımız bir başka "sorun" olduğunu, tarih formatı mysql için doğru değildi. Yani bizim symfony şeklinde kaydetmek işlevi geçersiz ve doğru tarih biçimini uygulamak.

Örnek:

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

  }

Doğrulama geçerli mi bir kez, o saklama işlevini gerçekleştirmek ve aslında veritabanına kaydetmeden önce doğru tarih biçimini ayarlamak olacaktır.

Bu sorun vardı diğer insanlar için yararlı olduğunu umuyoruz.