Yii CSqlDataProvider () и MSSQL — ошибка последней страницы

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

Это значения, которые я получаю на каждой странице

//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) база данных для предоставления данных

0

Решение

Похоже, это Yii Framework проблема с 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();
}

}

Благодаря этот сообщение.

1

Другие решения

Других решений пока нет …