2015-12-07 3 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'), модель возврата после Validate: «12/25/2015" . Что происходит не так?

+0

Weird, я пытаюсь, но я не могу воспроизвести эту ошибку. В вашей базе данных формат ваших дат совпадает с формами (дд/мм/гггг)? Если нет, то есть, и можете ли вы показать, как вы сохраняете этот атрибут в контроллере? – 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

Это был самый близкий способ обойти его. –

Смежные вопросы