Eugene
Eugene

Reputation: 2974

Yii: How to force CGridview to load data via AJAX only?

Is there a way to make a CGridView Not load data on the initial rendering of the view it lives on, and instead make it load the first page with a subsequent AJAX request after the initial page load?

This is mostly for performance optimization. There is a data model that is rather slow behind that CGridView, and I would like to be able to have the page load in a snappy way, then have the data load up a few seconds later with an AJAX request.

Upvotes: 4

Views: 3099

Answers (3)

tyan19
tyan19

Reputation: 13

Just write your code in controller like this:

$model= new Data('search');
$model->unsetAttributes();

if(isset($_GET['Data']))
   $model->attributes = $_GET['Data'];

if (!Yii::app()->request->isAjaxRequest)
   $data->id=0; //or something that sure model return empty

Upvotes: 0

Scott Gardner
Scott Gardner

Reputation: 8739

Brewer Gorge was very close, and thanks to his suggested answer, it put me on the right track. This works:

// Controller, after creating $dataProvider, before calling $this->render...
if (!Yii::app()->request->isAjaxRequest) {
    $dataProvider->criteria->addCondition('1 = 0');
}

// View
<script type="text/javascript">
$(window).load(function() {
    $('#id-of-grid').yiiGridView('update');
});
</script>

Upvotes: 0

Gregor Weber
Gregor Weber

Reputation: 688

You could modify the action as follows:

public function actionIndex() {
  $dataProvider = new CActiveDataProvider('User'); // The dataprovider your grid uses
  if (!$this->isAjaxRequest()) {
    $dataProvider->criteria->addCondition('1 = 0'); // You could also use 0, but I think this is more clear
  }

  [...]
}

And then in your view in the javascript section:

$(function() { // If you are using jQuery this is executed when the page is loaded
  $.fn.yiiGridView.update("{id-of-your-grid-view}");
});

Upvotes: 4

Related Questions