Если Вы еще не сталкивались с виджетом Yii CGridView, то рекомендуем почитать о нем здесь: Yii Framework, отображение списка (таблицы) записей с помощью виджета CGridView
Для удобства выбора диапазона дат будем использовать виджет DatePicker. И так приступим к реализации примера.
Модель (model)
В модели необходимо внести некоторые правки. А именно, объявить два свойства $fromDate
и $toDate
которые будут принимать значение для поиска:
- <?php
- class Posts extends CActiveRecord {
- /**
- * Поиск по диапозону дат, начальная дата
- *
- * @var string
- */
- public $fromDate;
- /**
- * Поиск по диапозону дат, конечная дата
- *
- * @var string
- */
- public $toDate;
- //...
- }
Эти два свойства необходимо добавить в массив search
метода rules()
нашей модели:
- <?php
- class Posts extends CActiveRecord {
- //...
- public function rules() {
- return array(
- //...
- array('id, ..., fromDate, toDate', 'safe', 'on' => 'search'),
- );
- }
- //...
- }
В метод search()
модели добавим условие для поиска (у нас дата хранится в формате unix time, а выводится в формате d.m.Y, для конвертирования используем функцию strtotime()
):
- <?php
- class Posts extends CActiveRecord {
- //...
- public function search() {
- //...
- if(!empty($this->fromDate) && empty($this->toDate)) {
- $criteria->condition = "date >= '" .
- strtotime($this->fromDate) .
- "'";
- } elseif(!empty($this->toDate) && empty($this->fromDate)) {
- $criteria->condition = "date <= '" .
- strtotime($this->toDate).
- "'";
- } elseif(!empty($this->toDate) && !empty($this->fromDate)) {
- $criteria->condition = "date >= '" .
- strtotime($this->fromDate) .
- "' and date <= '" .
- strtotime($this->toDate) .
- "'";
- }
- //...
- }
- //...
- }
Контроллер (Controller)
В действие actionList()
нашего контроллера получаем параметры переданные виджетом CGridView:
- <?php
- class PostsController extends Controller {
- //...
- public function actionList() {
- $model = new Posts('search');
- //...
- $request = Yii::app()->request->getParam('Posts');
- $model->unsetAttributes();
- if (isset($request)) {
- $model->attributes = $request;
- }
- $this->render('list', array(
- 'model' => $model,
- ));
- }
- //...
- }
Представление (View)
В представлении подключаем виджет CGridView, а в нем подключаем виджет CJuiDatePicker 2 раза в заголовке колонки "date", и добавляем код перезагрузки виджета в конец представления (view), что бы после ajax загрузки данных наш календарь не поломался:
- <?php
- //...
- $this->widget('zii.widgets.grid.CGridView', array(
- 'dataProvider' => $model->search(),
- 'filter' => $model,
- 'id' => 'posts-grid',
- 'afterAjaxUpdate' => 'reinstallDatePicker',
- //...
- 'columns' => array(
- //...
- array(
- 'name' => 'date',
- 'type' => 'raw',
- 'filter' => $this->widget('zii.widgets.jui.CJuiDatePicker', array(
- 'model' => $model,
- 'attribute' => 'fromDate',
- 'language' => 'ru',
- 'options' => array(
- 'showAnim' => 'fold',
- 'dateFormat' => 'dd.mm.yy',
- 'changeMonth' => 'true',
- 'changeYear' => 'true',
- 'showButtonPanel' => 'true',
- ),
- ), true) . ' - ' . $this->widget('zii.widgets.jui.CJuiDatePicker', array(
- 'model' => $model,
- 'attribute' => 'toDate',
- 'language' => 'ru',
- 'options' => array(
- 'showAnim' => 'fold',
- 'dateFormat' => 'dd.mm.yy',
- 'changeMonth' => 'true',
- 'changeYear' => 'true',
- 'showButtonPanel' => 'true',
- ),
- ), true),
- 'filterHtmlOptions' => array('class' => 'user-filter-date'),
- 'value' => 'Yii::app()->dateFormatter->format("dd.M.yyyy", $data->date)',
- ),
- //...
- ),
- ));
- Yii::app()->clientScript->registerScript('re-install-date-picker', "
- function reinstallDatePicker(id, data) {
- $('#Posts_fromDate, #Posts_toDate').datepicker(jQuery.extend({showMonthAfterYear:false},jQuery.datepicker.regional['ru'],{
- 'showAnim' : 'fold',
- 'dateFormat' : 'dd.mm.yy',
- 'changeMonth' : 'true',
- 'changeYear' : 'true',
- 'showButtonPanel' : 'true'}));
- }
- ");
Готово, теперь мы можем выводить данные из таблицы по заданному диапазону дат.
Комментарии
Отличный пример, спасибо, все работает
Ответить