Мое представление состоит из виджета CJuiAutoComplete и изначально пустого div.
<?php $roomsAvailableUrl = $this->createUrl('getavail');
$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
'name' => 'hotel',
'source' => $this->createUrl('hotel/get'),
'options'=>array(
'select'=>"js:function(event, ui) {
$.ajax({
type: 'GET',
url: '$roomsAvailableUrl',
dataType: 'html',
data: {
'Viroomavail[place_id]': ui.item.id
},
success: function(response) {
$('#rooms').html(response);
}
});
}"
),
)); ?>
<div id="rooms"></div>
Когда пользователь делает выбор, то JS-функция вызывает другое действие по ajax. Это действие возвращает частично отображаемый GridView в зависимости от отправленного параметра.
public function actionGetAvail()
{
if (Yii::app()->request->isAjaxRequest)
{
$model = new Viroomavail('search');
$model->unsetAttributes();
if (isset($_GET['Viroomavail']))
$model->attributes = $_GET['Viroomavail'];
$this->renderPartial('_grid_avail', array(
'model' => $model,
));
}
}
_grid_avail.php:
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'roomavail-grid',
'dataProvider' => $model->search(),
'filter' => $model,
'ajaxUpdate'=>'#roomavail-grid',
'ajaxUrl' => $this->createUrl('getavail'),
'columns' => array(
.......
),
));
GridView вставляется в раздел "#rooms". Я зарегистрировал необходимые ресурсы для CGridView в основном представлении.
$baseScriptUrl = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('zii.widgets.assets')).'/gridview';
Yii::app()->getClientScript()->registerCssFile($baseScriptUrl.'/styles.css');
Yii::app()->getClientScript()->registerScriptFile($baseScriptUrl.'/jquery.yiigridview.js');
Но я не знаю, как привязать события клиентского скрипта yigridview (функция $.fn.yiiGridView) к только что загруженной сетке. При этом фильтр сетки не работает.
Как заставить его работать? Конечно, я могу изначально отображать сетку в основном виде и визуально скрывать ее от пользователя. Но я хотел бы добиться этого более элегантным способом.
Спасибо.