2015-10-13 10 views
5

Ho una tabella con la colonna for_date salvata dal tipo numero intero nel database. Al fine di mostrare for_date con il formato DateTime, ho usato ActiveForm con il codice:Yii2 Converti da numero intero a datetime per visualizzare e salvare nel database con numero intero

<?= $form->field($model, 'for_date')->textInput([ 
    'class' => 'form-control datepicker', 
    'value' => $model->for_date ? date(Yii::$app->params['dateFormat'], $model->for_date) : date(Yii::$app->params['dateFormat'], time()), 
    'placeholder' => 'Time']) 
    ->label('Attendance Date') ?> 

Ma quando creano e salvano, Yii informato This field must be integer

Nel file di modello, ho avuto 2 funzioni qui sotto per convertire prima di convalidare , ma è ancora un errore.

public function beforeValidate(){ 
    if(!is_int($this->for_date)){ 
     $this->for_date = strtotime($this->for_date); 
     $this->for_date = date('d/M/Y', $this->for_date); 
    } 
    return parent::beforeValidate(); 
} 

public function afterFind(){ 
    $this->for_date = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date)); 
    $this->for_date = date('d/M/Y', $this->for_date); 
    return parent::afterFind(); 
} 

Come posso rendere corretto il salvataggio nel database con numero intero?

+1

vorrei lasciarlo come 'int' nel modello e usare getter e setter. Il messaggio di errore che ottieni è molto probabile dalle impostazioni delle regole. Quindi potresti cambiare il tuo validatore lì. –

+0

Sì, giusto. – Francis

risposta

0

ho trovato la soluzione. Nel Model Search (il mio caso è AttendanceSearch.php), trovare la funzione regole e passare for_date dalla linea hanno integer al di sotto di linee hanno safe

My Code:

public function rules() 
    { 
     return [ 
      [['id', 'user_id', 'project_id', 'commit_time', 'workload_type'], 'integer'], 
      [['comment', 'for_date'], 'safe'], 
     ]; 
    } 
0

Secondo il codice for_date è ancora in un formato di data dopo beforeValidate corre a causa della linea:

$this->for_date = date('d/M/Y', $this->for_date); 

rimuovere questa riga e dovrebbe funzionare.

Avrete comunque problemi con la formattazione della data o qualcuno che sta inserendo una data non valida, ad esempio 30/02/2015.

Suggerirei di creare una proprietà separata, ad es. for_date_display e aggiungendo una regola di data per questo. Poi, in un beforeSave trasformare questa data in un timestamp e impostare for_date a questo valore come segue:

public $for_date_display; 
... 

public function afterFind() { 
    $this->for_date_display = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date)) 
} 

public function beforeSave($insert = true) { 
    $this->for_date = strtotime($this->for_date_display); 
    return parent::beforeSave($insert); 
} 
+0

Perché avere una funzione primaSalva? – Francis

+1

Perché 'for_date' non verrà inserito/modificato direttamente dagli utenti. Modificano 'for_date_display' e questo deve essere trasformato per il salvataggio nel database. – topher