Очевидно, что HTML виджета генерируется раньше генерации CGridView. А конкретно в момент объявления
Код: Выделить всё
'filter' => $this->widget('application.widgets.DateRangePicker'),
Это изза того, что $this->widget не возвращает HTML код, а выводит его на страницу (какбы логично, там возвращается экземпляр класса виджета, у которого можно узнать id).
1. Смотрим в параметры CController::widget (
http://www.yiiframework.com/doc/api/1.1 ... get-detail )
$captureOutput boolean
whether to capture the output of the widget. If true, the method will capture and return the output generated by the widget. If false, the output will be directly sent for display and the widget object will be returned. This parameter is available since version 1.1.2.
...
2. Вариант №2. Колонки у CGridView это тоже классы (дефолтно CDataColumn), и можно определить свой генератор колонки для дат. И там можно сделать свой вывод заголовка, фильтра, ячейки, данных ячейки и подвала. Если часто используем, то везде описываем эту колонку примерно так:
Код: Выделить всё
'columns' => array(
// ...
array(
'name' => 'date', // имя аттрибута модели
'class' => 'application.widgets.DateColumnWithDateRangePicker', // путь к классу колонки
),
// ...
),
2.1. Можно пойти еще глубже и "расширить" CGridView чтобы не писать полный путь до нужного класса колонки, и описывать колонки примерно так:
Код: Выделить всё
'columns' => array(
'id:id',
'userId:user', // колонка со ссылками на пользователей
'date:date', // колонка с датой и свой пикер даты
'ip:ip', // у себя вывожу флаг страны по данным geo ip и ссылку
// ...
),
В общем через расширение стандартных классов можно сделать удобное объявление и единообразный вывод. Но тут можно забыть про основные задачи, которые нужно решать.