2015-12-07 87 views
0

我的模型验证输入日期时,转换格式类型并导致麻烦。验证日期格式的模型

<?php $form = yii\widgets\ActiveForm::begin([ 
    'options' => ['class' => ''], 
    'fieldConfig' => ['template' => "{label}\n{input}\n{hint}\n{error}"] 
]); ?> 

<div class="col-md-4"> 
    <?= $form->field($model, 'startDate')->widget(DatePicker::classname(), 
      [ 
      'language'  => 'pt-BR', 
      'dateFormat' => 'dd/MM/yyyy', 

      'clientOptions' => [ 
       'yearRange'  => '2005:+0', 
       'defaultDate' => date('d/m/Y', strtotime('-7days')) 
      ], 
      'options'  => [ 
       'class'   => 'form-control', 
       'maxlength'  => '10', 
       'placeholder' => 'Data inicial', 
       ] 
      ] 
    )->label(false) ?> 
</div> 
<div class="col-md-4"> 
    <?= $form->field($model, 'endDate')->widget(DatePicker::classname(), 
      [ 
      'language'  => 'pt-BR', 
      'dateFormat' => 'dd/MM/yyyy', 
      'clientOptions' => [ 
       'yearRange'  => '2005:+0', 
       'defaultDate' => date('d/m/Y') 
      ], 
      'options'  => [ 
       'class'   => 'form-control', 
       'maxlength'  => '10', 
       'placeholder' => 'Data final', 
       ] 
      ] 
    )->label(false) ?> 
</div> 
<div class="col-md-4"> 
    <?= Html::submitButton('Filtrar', ['class' => 'btn btn-primary']) ?> 
    <?php yii\widgets\ActiveForm::end(); ?> 
</div> 

及型号:

<?php 

namespace frontend\models; 

use yii\base\Model; 
use Yii; 

class Analysis extends Model 
{ 
    public $startDate; 
    public $endDate; 

    public function rules() 
    { 
     return [ 
      ['startDate', 'required'], 
      ['startDate', 'date', 'format' => 'dd/MM/yyyy'], 
      ['startDate', 'checkDateToday'], 
      ['startDate', 'checkGAMinDate'], 

      ['endDate', 'required'], 
      ['endDate', 'date', 'format' => 'dd/MM/yyyy'], 
      ['endDate', 'checkDateToday'], 
      ['endDate', 'checkGAMinDate'], 
      ['endDate', 'checkDateGreaterThan'] 
     ]; 
    } 

    public function checkDateToday($attribute, $params) 
    { 
     if($this->$attribute <= date('d/m/Y')){ 
      return true; 
     } else { 
     var_dump($this->$attribute); 
      $this->addError($attribute, $attribute . ' não pode ser maior que hoje: ' . date('d/m/Y')); 
     } 
    }  

    public function checkGAMinDate($attribute, $params) 
    { 
     if($this->$attribute > date('01/01/2005')){ 
      return true; 
     } else { 
      $this->addError($attribute, $attribute . ' não pode ser menor que 01/01/2005'); 
     } 
    } 

    public function checkDateGreaterThan($attribute, $params) 
    { 
     if($this->endDate < $this->startDate){ 
      return true; 
     } else { 
      $this->addError($attribute, 'Data final não pode ser maior que data incial.'); 
     } 
    } 

    public function attributeLabels() 
    { 
     return [ 
      'startDate' => Yii::t('app', 'Data inicial'), 
      'endDate' => Yii::t('app', 'Data final'), 
     ]; 
    } 
} 

当我把像 “25/12/2015”( 'd/M/Y'),验证后的模型回归的日期:“12/25/2015" 年。发生什么事了?

+0

奇怪,我想,但我不能复制这个错误。在您的数据库中,日期的格式与表单(日/月/年)相同?如果没有,那是,你能展示如何在控制器中保存这个属性? – Clyff

+0

我不保存这些属性,只在模型中验证。我将这些日期传递给控制器​​以用于api调用。 '$ model-> load(Yii :: $ app-> request-> post())&& $ model-> validate()' –

回答

1

问题是Datepicker's value property。正如文档所述,它使用Yii::$app->formatter->asDate()来生成该值。

由于该值始终是一个字符串,因此它必须是valid date format。正如你可以看到没有dd/mm/yyyy格式,但有一个mm/dd/yyyy

我无法找到取消此格式的方法,因此您可以更改格式,或者如果要维护此格式,则可以将模型的值更改为另一种有效格式(IE:dd-mm-yyyy) ,只能正确打印。

事情是这样的形式之前:

$model->startDate = str_replace('/', '-', $model->startDate); 
$model->endDate = str_replace('/', '-', $model->endDate); 
+0

这是最接近它的方法。 –