Оформить filter GridView как отдельный виджет

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Оформить filter GridView как отдельный виджет

Сообщение Nicolai6120 »

Добрый день! Пытаюсь вывести вместо простого input в фильтре CGridView виджет (кастомный плагин для выбора дат, родной datepicker не подходит). Можно конечно повесить плагин на класс инпута и просто во вьюхе регистрировать скрипты, но так не интересно, нужно будет часто использовать этот элемент, нужно формить именно как виджет. При этом вот так не работает:

Код: Выделить всё

// внутри CGridView
'filter' => $this->widget('application.widgets.DateRangePicker'),

// сам виджет
class DateRangePicker extends CWidget
{

    public function run()
    {
        $this->render('dateRangePickerWidget', []);
    }

}
код виджета на страницу вставляется, только если тут же вызвать метод run(), но выше самого GridView, внутрь него не попадает, в то место, где фильтр должен быть.
Аватара пользователя
Apache02
Сообщения: 50
Зарегистрирован: 2014.02.09, 01:14

Re: Оформить filter GridView как отдельный виджет

Сообщение Apache02 »

Очевидно, что 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 и ссылку
	// ...
),
В общем через расширение стандартных классов можно сделать удобное объявление и единообразный вывод. Но тут можно забыть про основные задачи, которые нужно решать.
Nicolai6120
Сообщения: 143
Зарегистрирован: 2014.08.13, 15:08

Re: Оформить filter GridView как отдельный виджет

Сообщение Nicolai6120 »

Почему-то мысль с колонкой я упорно откидыва, казалось, что фильтр к ней не относится, только данные. Тогда пожалуй это самый правильный вариант, спасибо!
Ответить