Pillola PHP/Yii lavorare con le date

Spread the love

yiiSalvare 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.

Il Wiki completo

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.