2011-07-25 36 views
5

Una pregunta de novato en Yii: Tengo un modelo de una tabla en Yii que contiene un campo de fecha y hora.YII: Cómo cambiar el formato de fecha y hora que se muestra en la Vista

estoy usando CActiveForm a mostrar este campo:

<div class="row"> 
    <?php echo $form->labelEx($model,'createdon'); ?> 
    <?php echo $form->textField($model,'createdon', array('id'=>'createdon')); ?> 
    <?php echo $form->error($model,'createdon'); ?> 
</div> 

pero el campo de texto que se muestra es el formato de fecha y hora provenir de MySQL, que es hh aaaa-mm-dd: mm: ss

Cómo podría ¿Cambié el formato que se muestra en el campo de texto a un formato de hora diferente? (tal vez dd/mm/aa o mm/dd/aa o más)

cualquier ayuda sería apreciada.

gracias!

Respuesta

26

Si desea que la fecha se almacene en un formato, pero se muestre en otro formato (es decir, varias vistas), considere cambiarlo en el modelo.

Por ejemplo:

class Whatever extends CActiveRecord  
{ 
    protected function afterFind() 
    { 
      // convert to display format 
     $this->createdon = strtotime ($this->createdon); 
     $this->createdon = date ('m/d/Y', $this->createdon); 

     parent::afterFind(); 
    } 

    protected function beforeValidate() 
    { 
      // convert to storage format 
     $this->createdon = strtotime ($this->createdon); 
     $this->createdon = date ('Y-m-d', $this->createdon); 

     return parent::beforeValidate(); 
    } 
} 

Qué métodos se reemplaza depende de lo que estamos tratando de lograr.

From the docs:

  1. personalización CActiveRecord proporciona algunos métodos de marcador de posición que puede suprimirse en las clases hijas para personalizar su flujo de trabajo.
    • beforeValidate y afterValidate: se invocan antes y después de que se realice la validación .
    • beforeSave y afterSave: se invocan antes y después de guardar una instancia de AR.
    • beforeDelete y afterDelete: estos se invocan antes y después de eliminar una instancia de AR.
    • afterConstruct: esto se invoca para cada instancia de AR creada utilizando el nuevo operador.
    • beforeFind: esto se invoca antes de que un buscador de AR sea utilizado para realizar una consulta (por ejemplo, find(), findAll()).
    • afterFind: esto es invocado después de cada instancia de AR creada como resultado de una consulta.
+0

hey ... gracias, el método afterFind() es el que estaba buscando :) – Calua

1

Todo lo que necesita es utilizar CDateFormatter y es el método format

o puede utilizar forma nativa de PHP hasta la fecha formato utilizando la función date

creo que hay un montón de ejemplos en PHP manual sobre opciones de formato (así como la explicación de lo que significa cada modificador de formato), por lo que no sería un problema resolver las cosas, pero si tiene algún problema con el CDateFormatter de Yii, le puedo dar algunos ejemplos.

+0

donde debo formatear el valor antes de que se muestra en el formulario? podría utilizar algo como esto: TextField ($ modelo, la fecha ('d-m-Y', 'createdon'), array ('id' => 'createdon')); ?> ?? o hay algún evento o comportamiento en el modelo yii donde puedo hacerlo? – Calua

+0

Básicamente, desea formatear la fecha debido a la configuración regional (puede establecer la configuración regional con ['CLocale'] (http://www.yiiframework.com/doc/api/1.1/CLocale)). Paso 'CDateFormatter' en mi opinión, esto no me molesta demasiado. Si su proyecto está localizado para su área y no considera ubicarlo en otras áreas, puede ir con 'date ('dm-Y', )' (Yii solo le ofrece una herramienta, para usarla o no) es una cuestión de tu elección). Es más conveniente usar ['CDateFormatter'] en tándem con [' CLocale'] de lo contrario. – Nemoden

+0

"o hay algún evento o comportamiento en el modelo yii donde puedo hacerlo?". No lo hice, pero creo que puedes adjuntar un comportamiento. – Nemoden

3

Esto funcionó para mí:

class SomeClass extends CActiveRecord 
{ 

    protected function afterFind() 
    { 
     // convert to display format 
     $this->my_date_time = DateTime::createFromFormat('Y-m-d H:i:s', $this->my_date_time)->format('d-m-Y'); 

     parent::afterFind(); 
    } 

    protected function beforeSave() 
    { 
     // convert to storage format 
     $this->my_date_time = DateTime::createFromFormat('d-m-Y', $this->my_date_time)->format('Y-m-d H:i:s'); 

     return parent::beforeSave(); 
    } 
} 
Cuestiones relacionadas