2009-12-07 54 views
1

我使用Symfony的1.2.9,和我有一個包含兩個日期字段的一種形式:Symfony的表單驗證日期字段(sfWidgetFormI18nDate)

起始日期日期和結束日期。

我想給予下列驗證標準爲「起始日期」字段:

  1. 我)。不能少於今天的日期 ii)。不能大於end_date iii)。不能超過1個月 遠

對於END_DATE,我想以下限制:

  • i)中。不能超過3個月 從今天遠
  • 我已經寫了一個帖子驗證檢查的過程如下:

    $today = date('Y-m-d'); 
    
    //post validator check to make sure end date > start date 
    $this->validatorSchema->setPostValidator(
    new sfValidatorAnd(array(
        new sfValidatorSchemaCompare('start_date', '<', 'end_date', 
         array('throw_global_error' => true), 
         array('invalid' => 'The start date ("%left_field%") must be before the end date ("%right_field%")<br />') 
         ), 
    
        new sfValidatorSchemaCompare('start_date', '<', $today, 
         array('throw_global_error' => true), 
         array('invalid' => 'The start date ("%left_field%") cannot be earlier than today\'s date: ('.$today.')<br />') 
         ), 
    
        new sfValidatorSchemaCompare('end_date', '>', $today, 
         array('throw_global_error' => true), 
         array('invalid' => 'The end date ("%left_field%") cannot be before today\'s date ("%right_field%")<br />') 
         ) 
        ) 
        ) 
    ); 
    

    但是,這是行不通的 - 即我還沒有找到一種方法尚未執行基於今天日期的限制或從今天的日期抵消。

    解決方案將非常受歡迎。

    回答

    4

    親自爲代碼的可讀性我將你的帖子驗證檢查到postValidate方法表單上,VIS:

    public function configure() 
    { 
        // your normal configuration stuff goes here 
    
        // set up your post validator method 
        $this->validatorSchema->setPostValidator(
        new sfValidatorCallback(array(
         'callback' => array($this, 'postValidate') 
        )) 
    ); 
    } 
    

    然後,你可以這樣做以下:

    public function postValidate($validator, $values) 
    { 
        $today = date("Y-m-d"); 
    
        if (strtotime($values["start_date"]) < strtotime($today)) 
        { 
        $error = new sfValidatorError($validator, "Start date cannot be before than today"); 
        throw new sfValidatorErrorSchema($validator, array('start_date' => $error)); 
        } 
    
        if (strtotime($values["start_date"]) > strtotime($values["end_date"])) 
        { 
        // throw a similar validation error here 
        } 
    
        // etc... 
    } 
    
    +0

    謝謝,但我有兩個問題: 1.您將如何獲得表單驗證期間觸發的'postValidate'方法? 2.您沒有使用作爲參數傳入的驗證程序,在僞代碼中,查看如何使用傳入的驗證程序引發驗證錯誤將很有用。 – 2009-12-08 11:54:18

    +0

    編輯解釋更多:-) – richsage 2009-12-08 12:37:51

    +0

    非常感謝Ric。對延遲迴復你的道歉表示歉意。我會嘗試實施它 - 如果它有效,我會接受它作爲答案。 – 2009-12-08 16:38:14