Misalkan kita punya tabel data yang mempunyai kolom tanggal dengan nama date dg format 1970-01-01 (PHP/MySQL bentuknya Y-m-d), nah kita ingin menampilkan data dengan rentang dari tanggal tertentu hingga tanggal tertentu, misalnya dari tanggal 2017-01-01 hingga 2017-12-31.
Berikut saya share tips step-by-step berdasarkan postingan CrazyCat yang saya modifikasi agar sesuai dg situasi yg saya hadapi.
Tapi tips Ini hanya untuk Yii.1.1. Hasil pencarian sekitar 2 minggu yang cukup membuat pening (buat saya).
- Buat file .php dengan nama EDateRangeSearchBehavior.php letakkan di direktory protected/components/behaviors.
2.a. Copy kode berikut:
<?php
/**
* This model behavior builds a date range search condition.
*/
class EDateRangeSearchBehavior extends CActiveRecordBehavior
{
/**
* @param the default 'from' date when nothing is entered.
*/
public $dateFromDefault = '1900-01-01';
/**
* @param the default 'to' date when nothing is entered.
*/
public $dateToDefault = '2099-12-31';
/*
* Date range search criteria
* public $attribute name of the date attribute
* public $value value of the date attribute
* @return instance of CDbCriteria for the model's search() method
*/
public function dateRangeSearchCriteria($attribute, $value)
{
// Create a new db criteria instance
$criteria = new CDbCriteria;
// Check if attribute value is an array
if (is_array($value))
{
// Check if either key in the array has a value
if (!empty($value[0]) || !empty($value[1]))
{
// Set the date 'from' variable to the first value in the array
$dateFrom = $value[0];
if (empty($dateFrom))
{
// Set the 'from' date to the default
$dateFrom = $this->dateFromDefault;
}
// Set the date 'to' variable to the second value in the array
$dateTo = $value[1];
if (empty($dateTo))
{
// Set the 'to' date to the default
$dateTo = $this->dateToDefault;
}
// Check if the 'from' date is greater than the 'to' date
if ($dateFrom > $dateTo)
{
// Swap the dates around
list($dateFrom, $dateTo) = array($dateTo, $dateFrom);
}
// Add a BETWEEN condition to the search criteria
$criteria->addBetweenCondition($attribute, $dateFrom, $dateTo);
}
else
{
// The value array is empty so set it to an empty string
$value = '';
// Add a compare condition to the search criteria
$criteria->compare($attribute, $value, true);
}
}
else
{
// Add a standard compare condition to the search criteria
$criteria->compare($attribute, $value, true);
}
// Return the search criteria to merge with the model's search() method
return $criteria;
}
}
2.b. Paste ke file EDateRangeSearchBehavior.php yang sudah dibuat.
3.a. Modif file model nya (misalnya Journal.php), tambahkan kode berikut (klo saya sih taruh di bagian akhir mode):
public function behaviors()
{
return array(
'dateRangeSearch'=>array(
'class'=>'application.components.behaviors.EDateRangeSearchBehavior',
),
);
}
3.b. Modif lagi file model Journal.php yang sama, pada
public function search()
yang digunakan pada search di view nya seperti ini:
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
//$criteria->compare('date',$this->date,true); //ini baris originalnya
$criteria->mergeWith($this->dateRangeSearchCriteria('date', $this->date)); //ini baris gantinya utk filter date range
$criteria->compare('description',$this->description,true);
$criteria->compare('kurs',$this->kurs,true);
- Sekarang ubah _search.php di direktori views (misalnya views/journal) sbg berikut:
<div class="wide form">
<?php $form=$this->beginWidget('CActiveForm', array(
'action'=>Yii::app()->createUrl($this->route),
'method'=>'get',
)); ?>
<div class="row">
<?php
// Date range search inputs
$attribute = 'date';
for ($i = 0; $i <= 1; $i++)
{
$year1='2016'; //bisa disesuaikan dg kebutuhan, bisa juga tiga tahun yang lalu date('Y')-3
$year3=date('Y');
echo ($i == 0 ? Yii::t('main', '<b>From</b>') : Yii::t('main', '<b>To</b>'));
$this->widget('zii.widgets.jui.CJuiDatePicker', array(
'id'=>CHtml::activeId($model, $attribute.'_'.$i),
'model'=>$model,
'attribute'=>$attribute."[$i]",
'options' => array(
'dateFormat' => 'yy-mm-dd',
'changeMonth'=>true,
'changeYear'=>true,
'yearRange'=>$year1.':'.$year3,
),
));
}
?>
</div>
<div class="row">
<?php echo $form->label($model,'id'); ?>
<?php echo $form->textField($model,'id'); ?>
</div>
<div class="row">
<?php echo $form->label($model,'description'); ?>
<?php echo $form->textField($model,'description',array('size'=>60,'maxlength'=>250)); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Search'); ?>
</div>
<?php $this->endWidget(); ?>
</div>
- Di file view yg ada pencarian menggunakan _search() misalnya admin.php, gak ada yg perlu diubah:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'journal-grid',
'dataProvider'=>$model->search(), //ini ambil dari model yg sudah kita modif di atas.
'filter'=>$model,
'columns'=>array(
array(
'header'=>'No.',
'value'=>'$this->grid->dataProvider->pagination->offset + $row+1', // row is zero based
'htmlOptions'=>array('width'=>'5%'),
),
array(
'header'=>'ID',
'name'=>'id',
'value'=>'$data->id',
'htmlOptions'=>array('width'=>'5%','style' => 'text-align: left;'),
),
array(
'header'=>'Date',
'value'=>'$data->date',
'htmlOptions'=>array('width'=>'10%','style' => 'text-align: left;'),
),
array(
'header'=>'Description',
'value'=>'$data->description',
'htmlOptions'=>array('width'=>'30%','style' => 'text-align: left;'),
),
.....
- That’s it…selamat mencoba. Di saya sudah dicoba dan berhasil.