Kamis, 28 Februari 2013

2/28/2013
2
Sebelum berangkat ke kampus, saya akan memberikan sedikit tips untuk anda yang sedang membuat aplikasi dengan Yii Framework yang berkaitan dengan penanggalan. Penanggalan yang saya maksud adalah penanggalan dengan format yang lazim kita temui di indonesia yaitu "tanggal-bulan-tahun" atau "dd-mm-yyyy". anda dapat menggunakannya dengan extensions DateTimeI18NBehavior dengan sedikit modifikasi.
Berikut script yang telah dimodifikasi

<?php

/*
 * DateTimeI18NBehavior
* Automatically converts date and datetime fields to I18N format
*
* Author: Ricardo Grana <rickgrana@yahoo.com.br>, <ricardo.grana@pmm.am.gov.br>
* Version: 1.1
* Requires: Yii 1.0.9 version
*/

class DateTimeI18NBehavior  extends CActiveRecordBehavior
{
    public $dateOutcomeFormat = 'Y-m-d';  //Format pengisian tanggal di My-SQL yang ditentukan
    public $dateTimeOutcomeFormat = 'Y-m-d H:i:s';

    public $dateIncomeFormat = 'yyyy-MM-dd';
    public $dateTimeIncomeFormat = 'yyyy-MM-dd hh:mm:ss';

    public function beforeSave($event){

        //search for date/datetime columns. Convert it to pure PHP date format
        foreach($event->sender->tableSchema->columns as $columnName => $column){

            if (($column->dbType != 'date') and ($column->dbType != 'datetime')) continue;

            if (!strlen($event->sender->$columnName)){
                $event->sender->$columnName = null;
                continue;
            }

            if (($column->dbType == 'date')) {
                $event->sender->$columnName = date($this->dateOutcomeFormat, CDateTimeParser::parse($event->sender->$columnName, 'dd-MM-yyyy'));
            } else {

                $event->sender->$columnName = date($this->dateTimeOutcomeFormat,
                        CDateTimeParser::parse($event->sender->$columnName,
                                strtr(Yii::app()->locale->dateTimeFormat,
                                        array("{0}" => Yii::app()->locale->timeFormat,
                                                "{1}" => Yii::app()->locale->dateFormat))));
            }

        }

        return true;
    }


    public function afterFind($event){
           
        foreach($event->sender->tableSchema->columns as $columnName => $column){

            if (($column->dbType != 'date') and ($column->dbType != 'datetime')) continue;

            if (!strlen($event->sender->$columnName)){
                $event->sender->$columnName = null;
                continue;
            }

            if ($column->dbType == 'date'){
                $event->sender->$columnName = Yii::app()->dateFormatter->format('dd-MM-yyyy',
                        CDateTimeParser::parse($event->sender->$columnName, $this->dateIncomeFormat));
            }else{
                $event->sender->$columnName =
                Yii::app()->dateFormatter->formatDateTime(
                        CDateTimeParser::parse($event->sender->$columnName,    $this->dateTimeIncomeFormat),
                        'medium', 'medium');
            }
        }
        return true;
    }
}
simpan dengan nama DateTimeI18NBehavior.php dan simpan di folder extensions. Bagaimana cara menggunakannya ? Anda buka model yang hendak anda ganti format tanggalnya, kemudian tambahkan script berikut
    
    public function behaviors()
    {
        return array(
            'datetimeI18NBehavior'=>array(
                'class'=>'application.extensions.DateTimeI18NBehavior'
            ),
        );
    }
atau jika modelnya banyak, maka akan lebih mudah jika anda membuat component baru dengan nama terserah anda. sebagai contoh saya membuat dengan nama EActiveRecord.php kemudian isi dengan script berikut
<?php

class EActiveRecord extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
    
    public function behaviors()
    {
        return array(
            'datetimeI18NBehavior'=>array(
                'class'=>'application.extensions.DateTimeI18NBehavior'
            ),
        );
    }
}
dan pada model yang ingin di ubah format tanggalnya, silahkan ganti CActiveRecord menjadi EActiveRecord. Selesai :D

2 komentar:

  1. PERTAMAX... haha
    Thank you for u shareing

    BalasHapus
  2. Tapi ada masalah pada saat update data, format tanggal kembali ke settingan default 1 Jan 1970, ini kenapa ya bisa kejadian seperti itu

    BalasHapus

Mohon tidak mencantumkan URL pada komentar yang bersifat promosi.