Sommario
Salvare una data 25/12/2015 in MySQL, leggerla e visualizzarla nello stesso formato
Occorre un po’ di magheggio per gestire le date con Yii. Il formato con cui MySQL registra out-of-the-box i campi data è quello ISO (yyyy-mm-dd). Per rendere compatibile la nostra applicazione con questo formato (non andiamo a cambiare il locale del database, e non ci poniamo al momento obiettivi sul rendere localizzabile l’applicazione) occorre
- trasformare 25/12/2015 in ISO in fase di scrittura e
- trasformare da ISO a 25/12/2015 in fase di lettura
Lettura di un campo data
Si scrive un filtro (afterFind) da aggiungere al model degli oggetti (tabelle) in cui ci sono le date che vogliamo gestire:
protected function afterFind(){ foreach($this->metadata->tableSchema->columns as $columnName => $column) { if (!strlen($this->$columnName)) continue; if ($column->dbType == 'date') { $timestamp = CDateTimeParser::parse($this->$columnName, 'yyyy-MM-dd'); $this->$columnName = Yii::app()->dateFormatter->formatDateTime( $timestamp,'short',null); } elseif ($column->dbType == 'datetime') { $timestamp = CDateTimeParser::parse($this->$columnName, 'yyyy-MM-dd hh:mm:ss'); $this->$columnName = Yii::app()->dateFormatter->formatDateTime( $timestamp); } } return true; }
Con il parser (CDateTimeParser::parse) catturiamo la data ISO che esce dalla query e la riformattiamo con il formatter (Yii::app()->dateFormatter->formatDateTime) nel formato short (dd/mm/yyyy) e senza l’orario se il campo è date, con l’orario se è datetime: in particolare, ‘short’, null dice che la data è in formato dd/mm/yyyy e non visualizza l’ora e i minuti.
Nota bene
Non è necessario ricompilare lo scaffold se si cambia il tipo campo database da date a datetime.
Scrittura di un campo data
Anche qui si aggiunge un metodo (beforeSave) al model (sempre nello stesso file quindi)
protected function beforeSave(){ foreach($this->metadata->tableSchema->columns as $columnName => $column) { if ($column->dbType == 'date') { $this->$columnName = date('Y-m-d', CDateTimeParser::parse( $this->$columnName, 'dd/MM/yyyy')); } elseif ($column->dbType == 'datetime') { $this->$columnName = date('Y-m-d H:i:s', CDateTimeParser::parse( $this->$columnName, 'dd/MM/yyyy')); } } return true; }
Grazie al sito forum di Yiiframework.
Commenti recenti