iii modelo de pesquisa com daterange para o carimbo de horário

pode publicar a forma de filtrar uma coluna de exibição de exibição de grade (Ymd h: m: s) usando o seletor de data. meu modelo está abaixo

public function search() { $criteria=new CDbCriteria(); $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; $criteria->compare('proc_id',$this->proc_id); $criteria->compare('book_id',$this->book_id); $criteria->compare('Project_name', $this->Project_name); $criteria->compare('isbn_no', $this->isbn_no); $criteria->compare('book_title',$this->book_title); $criteria->compare('totalpage',$this->totalpage,true); $criteria->compare('totaltime',$this->totaltime,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'pagination'=>array( 'pageSize'=>100 ), )); } 

Para a condição normal normal está funcionando por condição abaixo

  $criteria->condition = " time_up LIKE '$this->time_up%'"; 

Para o intervalo de datas não está funcionando, eu tentei também wiki / 142 / no site do Yii, mas não uso. Ajude gentilmente nisso. Ou dê alguns outros methods para darange a busca de timestamp.

Minhas inputs do formulário de pesquisa avançada

  
beginWidget('CActiveForm', array( 'action'=>Yii::app()->createUrl($this->route), 'method'=>'get', )); ?>
widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$model, 'name'=>'Process[time_up_from]', // Model attribute filed which hold user input 'options'=>array( 'showAnim'=>'fold', 'dateFormat'=>'yy-mm-dd',), 'htmlOptions'=>array( 'style'=>'height:20px;width:100px', 'size'=>15, //'value'=>date('Ym-d'), /*'onchange'=>"$.fn.yiiGridView.update('books-grid', {data: $(this).serialize()});" */),));?>
widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$model, 'name'=>'Process[time_up_to]', // Model attribute filed which hold user input 'options'=>array( 'showAnim'=>'fold', 'dateFormat'=>'yy-mm-dd',), 'htmlOptions'=>array( 'style'=>'height:20px;width:100px', 'size'=>15, //'value'=>date('Ym-d'), /*'onchange'=>"$.fn.yiiGridView.update('books-grid', {data: $(this).serialize()});"*/ ),));?>

RESPOSTA PARA O PROBLEMA

Oi, eu encontrei a resposta é apenas uma condição if antes da condição de critério

 `if(strlen($this->time_up_from) && strlen($this->time_up_to)) { $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; } 

agora está funcionando bem. @ bool.dev muito obrigado por suas sugestões. Destaques muito.

Tente isso:

 public function search(){ $criteria=new CDbCriteria(); if(!empty($this->time_up_from) && !empty($this->time_up_to)){ $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP('$this->time_up_from') AND UNIX_TIMESTAMP('$this->time_up_to')"; } $criteria->compare('proc_id',$this->proc_id); $criteria->compare('book_id',$this->book_id); $criteria->compare('Project_name', $this->Project_name); $criteria->compare('isbn_no', $this->isbn_no); $criteria->compare('book_title',$this->book_title); $criteria->compare('totalpage',$this->totalpage,true); $criteria->compare('totaltime',$this->totaltime,true); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'pagination'=>array( 'pageSize'=>100 ), )); } 

time_up_to que time_up_to e time_up_from são atributos virtuais que você declarou no seu modelo, tenha cuidado para que você os tenha declarado corretamente e adicionado o validador seguro para eles, assim:

 // in your model public $time_up_from; public $time_up_to; // in the rules of the model return array( // other rules // below is the safe rule array('proc_id, book_id, Project_name, isbn_no, book_title, totalpage, totaltime, time_up, time_up_from, time_up_to', 'safe', 'on'=>'search'), ); 

Também no seu formulário de pesquisa, modifique os selecionadores de data, como já mencionei nos comentários:

  // remove the 'name'=>'Process[time_up_from]' and use the following line 'attribute'=>'time_up_from' // and remove the 'name'=>'Process[time_up_to]' and use the following line 'attribute'=>'time_up_to' 

Editar:

Como Dcoder apontou nos comentários abaixo, devemos sempre ligar params, para evitar a injeção de sql e, possivelmente, obter um desempenho melhorado, daí a condição modificada pode ser:

 if(!empty($this->time_up_from) && !empty($this->time_up_to)){ $criteria->condition="time_up BETWEEN UNIX_TIMESTAMP(:time_up_from) AND UNIX_TIMESTAMP(:time_up_to)"; $criteria->params[':time_up_from']=$this->time_up_from; $criteria->parmas[':time_up_to']=$this->time_up_to; } 

Do guia

Eu tenho um campo com número e eu uso … para especificar um intervalo no campo de input. No modelo, eu apenas faço:

  // check for .. as a range selector if ( stripos( $this->AGE_IN_DAYS, '..') ) { $range = explode( '..', $this->AGE_IN_DAYS ); $criteria->compare('AGE_IN_DAYS','>='.$range[0]); $criteria->compare('AGE_IN_DAYS','<='.$range[1]); } else { $criteria->compare('AGE_IN_DAYS',$this->AGE_IN_DAYS); } 

simples e na minha opção bastante lógica para o usuário. Ele colocaria 0..100 para selecionar o intervalo de 0 a 100. Nenhum campo adicional é necessário.