Yii: Как связать события yiiGridView.js с поздно загруженным CGridView

Мое представление состоит из виджета 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) к только что загруженной сетке. При этом фильтр сетки не работает.

Как заставить его работать? Конечно, я могу изначально отображать сетку в основном виде и визуально скрывать ее от пользователя. Но я хотел бы добиться этого более элегантным способом.

Спасибо.


person Olexandr    schedule 05.05.2014    source источник
comment
возможный дубликат события javascript Yii CGridView при нумерации страниц   -  person Meetai.com    schedule 15.08.2014


Ответы (2)


Вы можете использовать afterAjaxUpdate (поскольку ваши страницы загружаются с помощью ajax):

$this->widget('zii.widgets.grid.CGridView', array(
    // ... options ...
    'ajaxUpdate'=>true,
    'afterAjaxUpdate'=>'aFunctionThatWillBeCalled', //
    // ... more options ...
));

Вы можете добавить функцию js следующим образом:

Yii::app()->clientScript->registerScript('some-script-id','function aFunctionThatWillBeCalled(id, data){
    console.log("id is "+id);
    // your jquery code to remember checked rows
}');

проверьте здесь:

Событие javascript Yii CGridView при разбивке на страницы

person Meetai.com    schedule 15.08.2014

Пожалуйста, посмотрите, какие параметры в renderPartial() делают. Чтобы добиться того, что вы хотите, зарегистрируйте js в родительском представлении (вы это сделали), затем в ajax попробуйте

    Yii::app()->clientScript->scriptMap["*.js"]=false;
    $this->renderPartial('_grid_avail', array(
            'model' => $model,
        ),false,true);

Во-первых, вы отключите загрузку js, чтобы предотвратить двойную загрузку, а затем выполните renderPartial с обработкой вывода.

person ineersa    schedule 06.05.2014
comment
Спасибо, сэр, я пробовал это. К сожалению, это не работает. Я предполагаю, что запрос ajax создает свой собственный экземпляр Yii::app(), поэтому 4-й параметр renderPartial() (который вызывает метод CController::processOutput()) не имеет отношения к родительской веб-странице. - person Olexandr; 06.05.2014
comment
У меня действительно была такая же ситуация, но без фильтров (только разбиение на страницы), и это сработало. Если это не поможет, то визуализируйте невидимую сетку и обновите ее с помощью $('#roomavail-grid').yiiGridView('update', {data: this.serialize()}); Это будет правильный способ сделать это. - person ineersa; 06.05.2014