Php 在将$.fn.yiigridview.update、筛选器、排序、分页重置为Null时遇到问题

Php 在将$.fn.yiigridview.update、筛选器、排序、分页重置为Null时遇到问题,php,jquery,yii,cgridview,Php,Jquery,Yii,Cgridview,我有一个CGridview,它以特定的间隔刷新。排序、过滤和分页都是由ajax完成的,工作得非常好。问题是$.fn.yiiGridView.update正在以特定的间隔更新网格,因此筛选器、排序、分页属性将重置为null,网格在每次刷新时显示第一页 这就是所讨论的视图_productDataGrid.php <?php $this->widget('bootstrap.widgets.TbGridView', array( 'id' => 'realtime-

我有一个CGridview,它以特定的间隔刷新。排序、过滤和分页都是由ajax完成的,工作得非常好。问题是$.fn.yiiGridView.update正在以特定的间隔更新网格,因此筛选器、排序、分页属性将重置为null,网格在每次刷新时显示第一页

这就是所讨论的视图_productDataGrid.php

    <?php

$this->widget('bootstrap.widgets.TbGridView', array(
    'id' => 'realtime-gridAMZ',
    'itemsCssClass' => 'table table-dark table-striped ',
    'htmlOptions' => array(
        'class' => 'product-datagrid',
    ),
    'dataProvider' => $model->search(),
    'filter' => $model,
    'ajaxUpdate' => 'realtime-gridAMZ',
    'ajaxUrl' => Yii::app()->createUrl('realTime/AjaxUpdate'),

    'pager' => array(
        'header' => '',
        'cssFile' => false,
        'maxButtonCount' => 10,
        'selectedPageCssClass' => 'active',
        'hiddenPageCssClass' => 'disabled',
        'firstPageCssClass' => 'previous',
        'lastPageCssClass' => 'next',
        'firstPageLabel' => '<<',
        'lastPageLabel' => '>>',
        'prevPageLabel' => '<',
        'nextPageLabel' => '>',
    ),
    'summaryCssClass' => 'label label-warning',
    'columns' => array(
        'id',
        'name',
        'category',
        'price'
        'rating'


    ),

));
?>
最后,这里是负责ajax渲染的RealTimeController中的actionAjaxUpdate

public function actionAjaxUpdate() {
    $dataProvider = new RealTime();
    $dataProvider->unsetAttributes();

    if (isset($_GET['RealTime']))
        $dataProvider->attributes = $_GET['RealTime'];
    $this->renderPartial('_producDataGrid', array(
        'model' => $dataProvider,
    ));

}
现在,正如我上面提到的,所有的功能都按预期工作。但是每次调用yiiGridViewUpdate时,过滤器、排序和分页属性都会被重置。例如,如果用户当前正在查看表格的第24页,1分钟后网格将更新,他将被重定向到表格的首页或第1页

与filter相同,假设用户输入一个搜索关键字,并且他正在查看结果,1分钟后他将再次看到表的首页或第1页,并且过滤结果将消失。因此,他必须在1分钟后再次在过滤框中键入搜索关键字

现在,这对任何通过网格浏览数据的人来说都是一大障碍


有人知道这个问题的解决方法吗?请让我知道我应该怎么做才能使它正常工作。我试图通过反复试验来解决这个问题,但我一事无成

提前感谢,

Maxx

Maxx。 我查看了为grid pager生成的JS代码(当网格被ajax更新时):

这正是js为网格分页发送ajax请求的原因,如下所示:

http://srv50213.ht-test.ru/app2/index.php?Assortment[itemSearch]=31351134582, BMW 5 SERIES '85-95 ?28/32/34 FORD MONDEO&Assortment_page=5&ajax=assortment-grid&r=assortment/searchtool
在这个uri中有一些神奇的参数:

  • 分类页面=5。传呼
  • 产品组合[itemSearch]=31351134582…
    产品组合[subgroup]='БАСАЛПБСССССА'
    -他们负责维护服务器端的过滤:

    if(isset($\u GET['realtime-gridAMZ']))
    $dataProvider->attributes=$\u GET['realtime-gridAMZ']

  • ajax=分类网格
    resp。用于指示ajax调用

考虑到这些先决条件,您可以尝试在获取序列化数据时修改代码以在计时器上更新网格。 在这里您可以修改一些:

 function updateAMZGrid() {
$.fn.yiiGridView.update('realtime-gridAMZ', {
    data: $(this).serialize()
});
return false;
}
您可能需要检查通过
$(this.)传递的数据。序列化()
或添加smth。类似于
$('#realtime gridAMZ')。serialize()
。 您可以检查
$\u GET['realtime-gridAMZ\u page']
并将其“复制/粘贴”到ajax请求中:

+ '&realtime-gridAMZ_page=' . $_GET['realtime-gridAMZ_page']
因此,您可以为重复请求获取当前数据。 在我的例子中,它在没有ajax的情况下与juiAutoComplete一起工作得很好:

...
'select'=>'js:function(event, ui) {                            
                $(this).val(ui.item.value); 
                location.href= "'. $this->createUrl($this->route) . '&Assortment[itemSearch]=" + ui.item.value + $("#uni-form").serialize() ;   
             }',    
因此,您可以尝试smth。与此类似:

 function updateAMZGrid() {
$.fn.yiiGridView.update('realtime-gridAMZ', {
    data: $(this).serialize() + $('#realtime-gridAMZ').serialize() + + '&realtime-gridAMZ_page=" . $_GET['realtime-gridAMZ_page'] . " 
});
...
return false;
还要检查服务器端是否正确获取了XHR请求中的GET参数:

`if (isset($_GET['realtime-gridAMZ']))
    $dataProvider->attributes = $_GET['realtime-gridAMZ'];`
为什么有
$dataProvider->attributes=$\u GET['realtime-gridAMZ'],我通常将get/POST参数输入模型,而不是数据提供程序:

 `$model->attributes = $_GET['realtime-gridAMZ'];`
只有在那之后

`$dataProvider = $model->search();`
希望,这将帮助您,如果不清楚,请随时提问。
别忘了gebugging工具:F12或Ctrl+Shift+I

有人知道这方面的修复方法吗。我迫切需要一个可行的解决方案。哇,这真是一个关于Yii Gridview Advanced的简明101。。。好消息。我用一个会话存储黑客解决了这个问题,但这正是我想要的答案。我已更新系统中的代码以反映您的建议。谢谢。很高兴,这有帮助。
`if (isset($_GET['realtime-gridAMZ']))
    $dataProvider->attributes = $_GET['realtime-gridAMZ'];`
 `$model->attributes = $_GET['realtime-gridAMZ'];`
`$dataProvider = $model->search();`