Удобный фильтр даты в Yii

У меня странная проблема: у меня есть модель и атрибут create_time (timestamp). Я должен показать временную метку в виде удобного для пользователя формата даты (YMD), но проблема в том, что когда я ищу дату, скажем, используя только дату (23) или только год (2013), я получаю предупреждение php вместо его работы когда вводится вся строка. До сих пор я сделал следующее:

//Controller Action:
$dataProvider = new MyModel('search');
                $dataProvider -> unsetAttributes();// clear any default values

                if (isset($_GET['MyModel'])) {
                        $dataProvider -> attributes = $_GET['MyModel'];
                }
                $this -> render('MyView', array('dataProvider' => $dataProvider, ));


//My View page

$this->widget('zii.widgets.grid.CGridView', array(
'id' =>'list-grid',
    'dataProvider'=>$dataProvider->search(),
    'filter' =>$dataProvider, 
    'columns'=>array(
        array(
        'first_name',          
        'last_name',
        'consult_price',
        'create_time'=>array('name'=>'create_time',
                                                'header' =>'Profile Created In',
                                                'value'=>'Components::userFriendlyDate($data->id);',// or before validate and afterFind on Model
                                                'htmlOptions' =>array('style'=>'text-align: center'),
                                                ..................

// My Model
$criteria = new CDbCriteria;
                if (!empty($this -> create_time)) {
                       // as i say this explodes a string with y-m-d format so i am getting an error.
                        list($day, $month, $year) = explode("/", $this -> create_time);
                        $daystart = mktime(0, 0, 0, (int)$month, (int)$day, (int)$year);
                        $dayend = mktime(23, 59, 59, (int)$month, (int)$day, (int)$year);
                        $criteria -> condition = ':s<=create_time AND create_time<=:e';
                        $criteria -> params = array(':s' => $daystart, ':e' => $dayend);
                }
$criteria -> compare('create_time', $this -> convert($this -> create_time));
return new CActiveDataProvider($this, array('criteria' => $criteria, ));

//where convert function goes likes this:
  public function convert($date) {

        if ($date == NULL)
                return $date;
        //null shows all records
        else {
                list($day, $month, $year) = explode("/", $this -> create_time);
                $daystart = mktime(0, 0, 0, (int)$month, (int)$day, (int)$year);
                $dayend = mktime(23, 59, 59, (int)$month, (int)$day, (int)$year);
                $sql = "SELECT create_time FROM MYTable WHERE create_time BETWEEN '$dayend' AND '$daystart'";
                $result = Yii::app() -> db -> createCommand($sql) -> queryAll();
                return $result;
        }
    }

Кто-нибудь работал с преобразованием поля метки времени при поиске ?? Нужна помощь !


person tnchalise    schedule 07.03.2013    source источник
comment
Какое предупреждение вы получите?   -  person topher    schedule 07.03.2013
comment
Ошибка типа смещения PHP 2!   -  person tnchalise    schedule 07.03.2013


Ответы (1)


Ошибка находится на list($day, $month, $year) = explode("/", $this -> create_time). Это связано с тем, что list($variables) ожидает, что массив будет иметь как минимум такое же количество элементов, что и переменные, которые будут назначены. Перед выполнением этой строки вам необходимо дополнить дату отсутствующими полями (день, месяц или год).

Вы можете использовать datepicker в качестве своего поля, чтобы гарантировать, что $create_time всегда будет иметь день, месяц и год.

Альтернативно:

  1. добавить отдельные поля для дня, месяца и года
  2. установите их на текущий день, месяц и год соответственно, если они пустые и
  3. объедините их в $create_time.
person topher    schedule 08.03.2013
comment
Да, я знаю, где была ошибка. Единственная и последняя альтернатива - datePicker ?? - person tnchalise; 08.03.2013
comment
Я добавил еще один вариант. Однако datepicker проще реализовать, поскольку вам нужно только отредактировать представление. - person topher; 08.03.2013
comment
Именно то, о чем я думаю ..! Большое спасибо за предложения. - person tnchalise; 08.03.2013