Autor wpisu: Diabl0, dodany: 06.10.2009 11:53, tagi: zend_framework
Ostatnio dłuższy czas nic na blogu nie pisałem, ale to dlatego że w pracy siedzimy głównie nad rozbudową oraz dopracowywaniem obecnych rozwiązań to głównie programowanie ogranicza się do tworzenia kolejnych list, zestawień itp. Niestety nie jest to ani nic skomplikowanego, nietypowego czy stawiającego jakiekolwiek wyzwania. Dlatego aby nie zapomnieć o blogu i coś w końcu napisać tym razem opiszę zastosowanie w praktyce Zend_Paginatora
Diagram użytych w przykładzie tabel
W prawie każdym projekcie istnieją listy, zestawienia, raporty itp. W dobrym guście (nie wspominając o wygodzie) jest aby listy te były sortowalne, i w przypadku większej ilości danych podzielone na strony (chociaż tu mój szef ma ostre obiekcje i zawsze chce wszystkie rekordy (często nawet kilka tysięcy) na jednej stronie).
Do tworzenia takich właśnie list został stworzony Zend_Paginator. Poniżej natomiast przedstawię moje podejście do jego praktycznego i dość elastycznego wykorzystania.
Zaczniemy sobie od stworzenia problemu – w końcu na nich najszybciej się człowiek uczy (podobno ). Załóżmy że mamy prosty blog i 2 tabele – posty i autorzy oraz proste zadanie – wyświetlić listę/wyszukiwarke postów
Zacznijmy więc od stworzenia sobie kontrolera:
<?php class test_ListsController extends Zend_Controller_Action { /** * Index */ public function indexAction () { $postsModel = new test_models_Posts( ); // Czyścimy sobie dane otrzymane z GET/POST $params = $this->_parseSearchParams( $this->getRequest()->getParams() ); // Tworzymy formę wyszukiwania $searchForm = new test_forms_SearchForm( ); $searchForm->setAction( '/test/lists/index' ); $searchForm->setDefaults( $params ); $this->view->searchForm = $searchForm; // Przekazujemy otrzymane parametry do widoku - jeszcze nam się przydadzą $this->view->params = $params; // Pobieramy selecta na którym będziemy bazowali $select = $postsModel->prepareFetchAllSelect( $params ); // Przypisujemy selecta do paginatora $paginator = new Zend_Paginator( new Zend_Paginator_Adapter_DbTableSelect( $select ) ); // Ustawiamy aktualną stronę na której jesteśmy (domyślnie 1) $paginator->setCurrentPageNumber( $this->getRequest()->getParam( 'page', 1 ) ); // Ustawiamy ilość rekordów na stronę $paginator->setItemCountPerPage( $params[ 'perPage' ] ); $this->view->paginator = $paginator; } /** * Czyści i poprawia tablicę parametrów dla wyszukiwania * * @param array $params tablica parametrów GET/POST * @return array poprawiona i wyczyszczona tablica parametrów */ private function _parseSearchParams ( $params ) { // Domyślnie chcemy wyświetlać po 5 rekordów na stronę if ( ! isset( $params[ 'perPage' ] ) ) { $params[ 'perPage' ] = 5; } // Domyślnie chcemy wyświetlać tylko aktywne posty if ( ! isset( $params[ 'active' ] ) ) { $params[ 'active' ] = 1; } foreach ( $params as $key => $value ) { // Filtrujemy puste wartości if ( is_null( $value ) or $value == '' ) { unset( $params[ $key ] ); continue; } switch ( $key ) { case 'module': case 'controller': case 'action': case 'submit': // Te dane nie będą nam potrzebne - usuwamy unset( $params[ $key ] ); continue; break; } } return $params; } }
Kod jest skomentowany i chyba nie wymaga większych wyjaśnień.
Pierwszą wartą wspomnienia rzeczą jest metoda _parseSearchParams(). Tam wydzielam wszelką logikę związaną z specjalnymi przypadkami filtrowania czy ustawiania wartości domyślnych dla danej listy (jak np. domyślne pokazywanie tylko aktywnych postów).
Idąc dalej trafiamy na formę test_forms_SearchForm – naszą wyszukiwarkę: