2010-03-29 43 views
1
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的sfValidatorSchemaCompare和日期格式输出问题

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

您能以某种方式更改日期输出吗?我需要错误信息将日期格式设置为与输入相同。 当出现错误时,我的输入字段也会设置错误的日期格式。

尝试了几件事情,但在这一刻没有运气。没有找到自己的解决方案或关于symfony的信息。

我使用symfony的版本1.2.11

+0

鉴于您正在处理输入字符串,可能更容易在表单发布之后在您的操作中检查此操作,并根据需要从此处引发错误或强制值。也许别人有更好的主意。 – Tom 2010-03-30 15:22:37

回答

1

我发现了一个与同事的解决方案一起。

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

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

    } 

因此,一旦确认是有效的,它会执行保存功能,并设置正确的日期格式其实之前将其保存到数据库中。

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