Data source adapter за Zend_Paginator

Следя Zend Frameowrk и въпреки че реално за момента не съм писал проект с него, се опитвам да съм в час с това, което се случва. Преди време разгледах Zend_Paginator компонента и написах няколко парчета код, за да видя реално как работи. Останах впечатлен, използва се лесно и се грижи за всичко необходимо: набавя необходимата информация в зависимост от избраната в момента страница и генерира линкове към съществуващите страници. За да свърши всичко това, Zend_Paginator компонента използва така наречените data source adapters, представляват връзката между Zend_Paginator и информацията, която искаме да покажем на страницата. В момента, заедно със Zend_Paginator имаме достъп и до няколко data source adapters: Array, DbSelect, DbTableSelect, Iterator и Null. В случай, че тези се окажат недостатъчни в даден момент, винаги можем да напишем наш собствен.
Adapterа по-долу има за цел да работи директно с базата от данни. Той приема две различни sql заявки – една с която да „пребори“ количеството информация и друга, която реално се използва за извличане на информацията. Ето и пример, как реално работи Zend_Paginator със създаденият adapter:

[geshi lang=php]
$query_count = ‘SELECT COUNT(*) FROM service_periodic’;
$query_fetch = ‘SELECT * FROM service_periodic’;
$adapter = new myLibs_Paginator_AdapterMySql($query_fetch, array(), $query_count, array(), $this->db);
$paginator = new Zend_Paginator($adapter);
[/geshi]

На ред 1 и 2 пишем двете заявки съответно за преброяване и за извличане на информацията. На ред 3 правим инстанция на myLibs_Paginator_AdapterMySql, което всъщност е създаденият от нас adapter и на ред 4 подаваме този обект на Zend_Paginator, след което го оставяме да се погрижи за останлото. myLibs_Paginator_AdapterMySql имплементира Zend_Paginator_Adapter_Interface интерфейса и съответно трябва да дефинираме два метода в него: public function getItems($offset, $itemCountPerPage) и public function count(). Ето и кода на myLibs_Paginator_AdapterMySql:

[geshi lang=php]
class myLibs_Paginator_AdapterMySql implements Zend_Paginator_Adapter_Interface {

protected $_db;
protected $_count = null;

protected $_sql_fetch;
protected $_exec_fetch;
protected $_sql_count;
protected $_exec_count;

public function __construct($sql_fetch, $exec_fetch, $sql_count, $exec_count, $db) {
$this->_db = $db;
$this->_sql_fetch = $sql_fetch;
$this->_exec_fetch = $exec_fetch;
$this->_sql_count = $sql_count;
$this->_exec_count = $exec_count;
}

public function count() {
if (is_numeric($this->_count)) {
return $this->_count;
}

$stmt = $this->_db->prepare($this->_sql_count);
$stmt->execute($this->_exec_count);
$this->_count = $stmt->fetchColumn();
unset($stmt);

return $this->_count;
}

public function getItems($offset, $itemCountPerPage) {
$offset = (int) $offset;
$itemCountPerPage = (int) $itemCountPerPage;

$stmt = $this->_db->prepare($this->_sql_fetch . “ LIMIT $offset, $itemCountPerPage“);
$stmt->execute($this->_exec_fetch);
$result = $stmt->fetchAll();
unset($stmt);

return $result;
}
}
[/geshi]

Сподели:
Edno23 Favit Svejo Twitter Facebook Google Buzz Delicious Google Bookmarks Digg
Публикувано в PHP. Постоянна връзка.

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *

*

Можете да използвате тези HTML тагове и атрибути: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>