2015-04-05 6 views
0

Я использую Yii 1.1.16 и CSqlDataProvider() для отображения данных в CGridView. При переходе на последнюю страницу я получаю последние PageSize счетных записей, вместо них количество записей на последней странице. Например, у меня есть сетка с 12 записями и установлена ​​в 10, что означает, что у меня 2 страницы, поэтому на странице 1 я получаю записи от 1 до 10, но на странице 2 (последняя страница) получаю записи 3 - 12!Yii CSqlDataProvider() и MSSQL - ошибка последней страницы

Это ценности, я на каждой странице

//on page 1 
$dataProvider->getPagination()->getPageCount(); //2 
$dataProvider->getPagination()->currentPage; //0 
$dataProvider->getPagination()->offset; //0 

//on page 2 
$dataProvider->getPagination()->getPageCount(); //2 
$dataProvider->getPagination()->currentPage; //1 
$dataProvider->getPagination()->offset; //10 

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

Я намеренно написал Yii версию, потому что это работает, прежде чем Yii обновить 1.1.8

еще одна вещь, я использую MSSQL (Microsoft SQL) базы данных для предоставления данных

ответ

1

Похоже, это Yii framework issue с MSSQL и здесь является одним из решений, перекрывая CSqlDataProvider

class MSSqlDataProvider extends CSqlDataProvider 
{ 

    /** 
    * Fetches the data from the persistent data storage. 
    * @return array list of data items 
    */ 
    protected function fetchData() 
    { 
     $sql = $this->sql; 
     $db = $this->db === null ? Yii::app()->db : $this->db; 
     $db->active = true; 

     if (($sort = $this->getSort()) !== false) { 
      $order = $sort->getOrderBy(); 
      if (!empty($order)) { 
       if (preg_match('/\s+order\s+by\s+[\w\s,]+$/i', $sql)) 
        $sql.=', ' . $order; 
       else 
        $sql.=' ORDER BY ' . $order; 
      } 
     } 

     if (($pagination = $this->getPagination()) !== false) { 
      $pagination->setItemCount($this->getTotalItemCount()); 
      $limit = $pagination->getLimit(); 
      $offset = $pagination->getOffset(); 

      // update limit to the correct value for the last page 
      if ($offset + $limit > $pagination->getItemCount()) 
       $limit = $pagination->getItemCount() - $offset; 

      $sql = $db->getCommandBuilder()->applyLimit($sql, $limit, $offset); 
     } 

     $command = $db->createCommand($sql); 
     foreach ($this->params as $name => $value) 
      $command->bindValue($name, $value); 

     return $command->queryAll(); 
    } 

} 

Благодаря this сообщению.