Zend Paginator отображает неверное количество страниц, когда запрос имеет "отличный" - PullRequest
3 голосов
/ 09 октября 2010

Я использую Zf 1.10 в проекте и до этого бита довольно успешно использовал Zend_Paginator вместе с запросами Zend_DbTable.

Для запроса требуется ключевое слово DISTINCT, чтобы удалить дублирующиеся строки, созданные соединением, нокогда я его добавляю, пагинатор неправильно отображает навигацию для двух страниц результатов, когда фактически есть только одна страница результатов.Некоторое копание показывает, что он выполняет два запроса: один для результирующего набора «Мне нужно» (77 строк), а другой - для подсчета.Но второй запрос, сгенерированный магией Zend, не включает ключевое слово DISTINCT, поэтому счетчик возвращает 112 строк вместо 77 строк.

Вот соответствующий бит

$select = $this->select()
    ->setIntegrityCheck(false)
    ->from('companies')
    ->distinct()
    ->join('project_team', 'companies.companyID = project_team.companyID', null)
    ->join('project_team_roles', 'project_team.roleID = project_team_roles.roleID', null)
    ->join('projects', 'projects.projectID = project_team.projectID', null)
    ->where('project_team_roles.isArchitect')
    ->where('companies.companyName LIKE ?', '%' . $str . '%')
    ->where('projects.islive AND NOT projects.isDeleted')
    ->order('companies.companyName'); 
 $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
 $paginator = new Zend_Paginator($adapter);
 $paginator->setCurrentPageNumber($page);
 $paginator->setItemCountPerPage(100);
 return $paginator;

В этом нет ничего плохогос запросами, которые он генерирует, кроме игнорирования предложения DISTINCT в запросе count.Если вы удалите бит -> Different (), все получится великолепно - 112 строк и нумерация страниц все супер, за исключением того, что в данных есть повторяющиеся строки.

Я вижу, что сообщения об ошибках возвращаются к справедливым путям в отношении подобных проблем, ноони помечены как исправленные в более ранних версиях ZF

? Это известная ошибка?Могу ли я что-нибудь сделать, не написав свою собственную нумерацию страниц?Дело не в том, что написание нумерации страниц является особенно сложной задачей, но это означает, что этот бит будет непоследовательным для остальной части проектаопубликовано как ответ ниже.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Об этом спрашивали давным-давно, но все еще нужен ответ.

Вы должны использовать методы setRowCount () в вашем контроллере.

$select = $your_model->getSelect();
$select_count = $your_model->getCount(); // geting count from select above
$adapter = new Zend_Paginator_Adapter_DbSelect($select);
$adapter->setRowCount((int)trim($select_count)); // <-- // set integer !
$paginator = new Zend_Paginator($adapter);
// That's it
...

$this->view->paginator = $paginator; 
// and so on...
0 голосов
/ 10 октября 2010

Найден простой обходной путь ... Не используйте адаптер DbTable, но получите результаты в массив и передайте их на страницу-указатель

$results = $this->fetchAll($select)->toArray(); 
$adapter = new Zend_Paginator_Adapter_Array($results);

Эта ошибка есть только в DbTable,Казалось бы.

Удачи!

...