Если Вы еще не сталкивались с виджетом Yii CGridView, то рекомендуем почитать о нем здесь: Yii Framework, отображение списка (таблицы) записей с помощью виджета CGridView

Для удобства выбора диапазона дат будем использовать виджет DatePicker. И так приступим к реализации примера.

Модель (model)

В модели необходимо внести некоторые правки. А именно, объявить два свойства $fromDate и $toDate которые будут принимать значение для поиска:

  1. <?php
  2.  
  3. class Posts extends CActiveRecord {
  4.  
  5. /**
  6. * Поиск по диапозону дат, начальная дата
  7. *
  8. * @var string
  9. */
  10. public $fromDate;
  11.  
  12. /**
  13. * Поиск по диапозону дат, конечная дата
  14. *
  15. * @var string
  16. */
  17. public $toDate;
  18.  
  19. //...
  20. }

Эти два свойства необходимо добавить в массив search метода rules() нашей модели:

  1. <?php
  2.  
  3. class Posts extends CActiveRecord {
  4. //...
  5. public function rules() {
  6. return array(
  7. //...
  8. array('id, ..., fromDate, toDate', 'safe', 'on' => 'search'),
  9. );
  10. }
  11. //...
  12. }

В метод search() модели добавим условие для поиска (у нас дата хранится в формате unix time, а выводится в формате d.m.Y, для конвертирования используем функцию strtotime()):

  1. <?php
  2.  
  3. class Posts extends CActiveRecord {
  4. //...
  5. public function search() {
  6. //...
  7. if(!empty($this->fromDate) && empty($this->toDate)) {
  8. $criteria->condition = "date >= '" .
  9. strtotime($this->fromDate) .
  10. "'";
  11. } elseif(!empty($this->toDate) && empty($this->fromDate)) {
  12. $criteria->condition = "date <= '" .
  13. strtotime($this->toDate).
  14. "'";
  15. } elseif(!empty($this->toDate) && !empty($this->fromDate)) {
  16. $criteria->condition = "date >= '" .
  17. strtotime($this->fromDate) .
  18. "' and date <= '" .
  19. strtotime($this->toDate) .
  20. "'";
  21. }
  22. //...
  23. }
  24. //...
  25. }

Контроллер (Controller)

В действие actionList() нашего контроллера получаем параметры переданные виджетом CGridView:

  1. <?php
  2.  
  3. class PostsController extends Controller {
  4. //...
  5. public function actionList() {
  6. $model = new Posts('search');
  7. //...
  8.  
  9. $request = Yii::app()->request->getParam('Posts');
  10. $model->unsetAttributes();
  11. if (isset($request)) {
  12. $model->attributes = $request;
  13. }
  14. $this->render('list', array(
  15. 'model' => $model,
  16. ));
  17. }
  18. //...
  19. }

Представление (View)

В представлении подключаем виджет CGridView, а в нем подключаем виджет CJuiDatePicker 2 раза в заголовке колонки "date", и добавляем код перезагрузки виджета в конец представления (view), что бы после ajax загрузки данных наш календарь не поломался:

  1. <?php
  2.  
  3. //...
  4.  
  5. $this->widget('zii.widgets.grid.CGridView', array(
  6. 'dataProvider' => $model->search(),
  7. 'filter' => $model,
  8. 'id' => 'posts-grid',
  9. 'afterAjaxUpdate' => 'reinstallDatePicker',
  10. //...
  11. 'columns' => array(
  12. //...
  13. array(
  14. 'name' => 'date',
  15. 'type' => 'raw',
  16. 'filter' => $this->widget('zii.widgets.jui.CJuiDatePicker', array(
  17. 'model' => $model,
  18. 'attribute' => 'fromDate',
  19. 'language' => 'ru',
  20. 'options' => array(
  21. 'showAnim' => 'fold',
  22. 'dateFormat' => 'dd.mm.yy',
  23. 'changeMonth' => 'true',
  24. 'changeYear' => 'true',
  25. 'showButtonPanel' => 'true',
  26. ),
  27. ), true) . ' - ' . $this->widget('zii.widgets.jui.CJuiDatePicker', array(
  28. 'model' => $model,
  29. 'attribute' => 'toDate',
  30. 'language' => 'ru',
  31. 'options' => array(
  32. 'showAnim' => 'fold',
  33. 'dateFormat' => 'dd.mm.yy',
  34. 'changeMonth' => 'true',
  35. 'changeYear' => 'true',
  36. 'showButtonPanel' => 'true',
  37. ),
  38. ), true),
  39. 'filterHtmlOptions' => array('class' => 'user-filter-date'),
  40. 'value' => 'Yii::app()->dateFormatter->format("dd.M.yyyy", $data->date)',
  41. ),
  42. //...
  43. ),
  44. ));
  45.  
  46. Yii::app()->clientScript->registerScript('re-install-date-picker', "
  47. function reinstallDatePicker(id, data) {
  48. $('#Posts_fromDate, #Posts_toDate').datepicker(jQuery.extend({showMonthAfterYear:false},jQuery.datepicker.regional['ru'],{
  49. 'showAnim' : 'fold',
  50. 'dateFormat' : 'dd.mm.yy',
  51. 'changeMonth' : 'true',
  52. 'changeYear' : 'true',
  53. 'showButtonPanel' : 'true'}));
  54. }
  55. ");

Готово, теперь мы можем выводить данные из таблицы по заданному диапазону дат.