2011-07-25 9 views
5

Pytanie o newbie w Yii: Mam model tabeli w Yii, który zawiera pole datetime.YII: Jak zmienić format datetime wyświetlany na View

Używam CActiveForm wyświetlić murawę:

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

ale pole tekstowe wyświetlane jest na formacie datetime pochodzą z MySQL, która jest rrrr-mm-dd hh: mm: ss

Jak mogłeś Zmieniam format wyświetlany w polu tekstowym na inny format czasu? (może dd/mm/yy lub mm/dd/rr lub jeszcze)

każda pomoc byłaby doceniona.

dziękuję!

Odpowiedz

26

Jeśli chcesz, aby data była przechowywana w jednym formacie, ale wyświetlana w innym formacie (tj. Wiele widoków), rozważ zmianę jej w modelu.

Na przykład:

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(); 
    } 
} 

Jakie metody zastąpić zależy co próbujesz osiągnąć.

From the docs:

  1. Dostosowanie CActiveRecord udostępnia kilka metod zastępczych które mogą być nadpisane w klasach potomnych aby dostosować swoją pracę.
    • beforeValidate i afterValidate: są wywoływane przed i po sprawdzeniu poprawności .
    • beforeSave i afterSave: są wywoływane przed i po zapisaniu instancji AR.
    • beforeDelete i afterDelete: są one wywoływane przed i po usunięciu instancji AR.
    • poKonstrukcja: jest wywoływana dla każdej instancji AR utworzonej przy użyciu operatora .
    • beforeFind: jest wywoływana, zanim wyszukiwarka AR jest używana do wykonania zapytania (np. Find(), findAll()).
    • afterFind: jest to wywoływane po każdej instancji AR utworzonej w wyniku zapytania.
+0

hej ... dziękuję, metoda afterFind() była tą, której szukałem :) – Calua

1

Wszystko, co potrzebne jest, aby używać CDateFormatter i jest to metoda format

czy można użyć sposobu macierzystego PHP na format daty przy użyciu funkcji date

Myślę, że istnieje wiele przykładów w PHP instrukcji na temat opcji formatowania (jak również wyjaśnienie, co oznacza każdy modyfikator formatu), więc nie byłoby problemu, aby dowiedzieć się rzeczy, ale jeśli masz jakiekolwiek problemy z Yii CDateFormatter, mogę podać kilka przykładów.

+0

gdzie mam sformatować wartości przed wyświetleniem go w formularzu? Czy mogę użyć czegoś takiego: textField ($ model, date ('d-m-Y', 'createdon'), array ('id' => 'createdon')); ?> ?? czy jest jakieś zdarzenie lub zachowanie na modelu yii, gdzie mogę to zrobić? – Calua

+0

Zasadniczo chcesz sformatować datę ze względu na ustawienia narodowe (możesz ustawić ustawienia regionalne za pomocą ['CLocale'] (http://www.yiiframework.com/doc/api/1.1/CLocale)). W moim odczuciu przekazuję 'CDateFormatter' - nie przeszkadza mi to zbytnio. Jeśli twój projekt jest zlokalizowany dla twojego obszaru i nie chcesz go lokalizować w innych obszarach, możesz użyć 'date ('dm-Y', )' (Yii właśnie oferuje ci narzędzie - aby go użyć lub nie jest kwestią twojego wyboru). Bardziej wygodne jest używanie ['CDateFormatter'] w tandemie z [' CLocale'] w przeciwnym razie. – Nemoden

+0

"czy jest jakieś zdarzenie lub zachowanie na modelu yii, gdzie mogę to zrobić?". Nie zrobiłem tego, ale myślę, że możesz przywiązać zachowanie. – Nemoden

3

Ten pracował dla mnie:

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(); 
    } 
} 
Powiązane problemy