#php #zend-framework #pagination #zend-framework2
#php #zend-framework #разбивка на страницы #zend-framework2
Вопрос:
Я следую этому руководству по документации zend, чтобы создать модуль блога с самого начала, закончил, и все работает правильно. В предыдущем уроке это было для создания модуля альбома, который они использовали TableGateway
, а также показали, как создать разбивку на страницы с его помощью, но в этом модуле блога они этого не сделали, и они используют ZendDbSql
.
Я пытался найти что-нибудь в Интернете об этом и ничего…
public function findAllPosts()
{
$sql = new Sql($this->db);
$select = $sql->select('posts');
$statement = $sql->prepareStatementForSqlObject($select);
$result = $statement->execute();
if (! $result instanceof ResultInterface || ! $result->isQueryResult()) {
return [];
}
$resultSet = new HydratingResultSet($this->hydrator, $this->postPrototype);
$resultSet->initialize($result);
return $resultSet;
}
В предыдущем уроке мы создали два метода, один вызывается fetchAll($paginated = false)
, а другой вызывается fetchPaginatedResults
, если $paginated
значение true вызывает метод fetchPaginatedResults
, например:
public function fetchAll($paginated = false)
{
if ($paginated) {
return $this->fetchPaginatedResults();
}
return $this->tableGateway->select();
}
private function fetchPaginatedResults()
{
// Create a new Select object for the table:
$select = new Select($this->tableGateway->getTable());
// Create a new result set based on the Album entity:
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Album());
// Create a new pagination adapter object:
$paginatorAdapter = new DbSelect(
// our configured select object:
$select,
// the adapter to run it against:
$this->tableGateway->getAdapter(),
// the result set to hydrate:
$resultSetPrototype
);
$paginator = new Paginator($paginatorAdapter);
return $paginator;
}
Мне было интересно, как сделать то же самое, используя ZendDbSql
and HydratingResultSet
?
Ответ №1:
Вы должны выбрать $db_adapter
, и вы получите разбиение на страницы с помощью :
use ZendPaginatorPaginator;
use ZendPaginatorAdapterDbSelect;
$sql = new Sql($this->db);
$select = $sql->select('posts');
new Paginator(new DbSelect($select, $db_adpter));
Комментарии:
1. Извините за мое невежество, но как мне выбрать метод
$db_adapter
внутри a?2. В
TableGateway
методе agetAdapter()
, довольно просто.
Ответ №2:
вы можете установить HydratingResultSet в Paginator.
Пример:
$sql = new Sql ( $this->db );
$select = $sql->select ( $this->table );
//$statement = $sql->prepareStatementForSqlObject ( $select );
//$result = $statement->execute ();
//if (! $result instanceof ResultInterface || ! $result->isQueryResult ()) {return [ ];}
$resultSet = new HydratingResultSet ( $this->hydrator, $this->Prototype );
//$resultSet->initialize ( $result );
// return $resultSet;
// Executando
$adapter = new ZendPaginatorAdapterDbSelect ( $select, $this->db, $resultSet );
$paginator = new ZendPaginatorPaginator ( $adapter );
$paginator->setItemCountPerPage ( $count );
$paginator->setCurrentPageNumber ( $offset );
return $paginator;
но если вы будете использовать Paginator, я не уверен, что Hydrator — лучший вариант.
Помните, вам необходимо установить пакет (если это zf3)
$ composer require zendframework/zend-paginator
Using version ^2.7 for zendframework/zend-paginator
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing zendframework/zend-paginator (2.7.0)
Loading from cache
Please select which config file you wish to inject 'ZendPaginator' into:
[0] Do not inject
[1] config/modules.config.php
[2] config/development.config.php.dist
Make your selection (default is 0):1
Remember this option for other packages of the same type? (y/N)
Installing ZendPaginator from package zendframework/zend-paginator
zendframework/zend-paginator suggests installing zendframework/zend-cache (ZendCache component to support cache features)
Writing lock file
Generating autoload files