Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[php] Prosta obsługa stronicowania - część 1.
W artykule “[sql] Trik w MySQL” przedstawiłem sposób na obsługę stronicowania w SQL. Teraz chciałbym przedstawić pozostałe części aplikacji - czyli Model, Controller i View - które z tego korzystają. W tej części opisze sam model, w części drugiej skupie się na kontrolerze i widoku.
Wykorzystanie SQL_CALC_FOUND_ROWS jest niewątpliwie optymalne, ale nie do końca wygodne, dlatego też pierwszym krokiem będzie obudowanie go w jakiś bardziej przystępny sposób. W tym celu stworzymy dwie metody w klasie bazowej dla naszych modeli:
-
class Fasic_Db_Table extends Zend_Db_Table {
-
// Zainicjuj obiekt select
-
public function selectStart($short = null, $fields = ‘*’, $countBy = true) {
-
if($countBy) { // Automatyczne obliczanie liczby wszystkich rekordów
-
$primary = ‘SQL_CALC_FOUND_ROWS ‘.(($short? $short.‘.’ : ”) .
-
}
-
// Stwórz obiekt select i zainicjuj go
-
$select = $this->getAdapter()->select()
-
-
return $select;
-
}
-
// Pobierz wszystkie dane i opakuj za pomocą klasy Fasic_Pagged
-
public function selectEnd(Zend_Db_Select $select, $page = 1, $onpage = 25) {
-
// Ustaw LIMIT
-
$select->limitPage($page, $onpage);
-
// Pobierz wszystkie dane
-
$result = $select->query(Zend_Db::FETCH_OBJ)->fetchAll();
-
// Pobierz liczbę wszystkich rekordów
-
$sql = ‘SELECT FOUND_ROWS() as count’;
-
$count = $this->getAdapter()->query($sql)->fetch(Zend_Db::FETCH_OBJ);
-
// Opakuj dane
-
return new Fasic_Pagged($result, $count->count, $page, $onpage);
-
}
-
}
Sposób wykorzystania przedstawię na przykładzie tabeli Users (załóżmy, że zawiera dwa pola id oraz login).
-
class Users extend Fasic_Db_Table {
-
public function fetchUsers($page = 1, $query = null) {
-
// Zainicjuj obiekt select
-
$select = $this->selectStart(‘u’);
-
// Dodaj do zapytania dodatkowe parametry
-
if($query) {
-
$select->where(‘login LIKE ?’, $query.‘%’);
-
}
-
// Zwróć dane
-
return $this->selectEnd($select, $page, 25);
-
}
-
}
Klasa Fasic_Pagged nie zaprezentuje ze względu na liczbę linii kodu. Warto jednak wspomnieć, iż ma ona na celu opakowanie wszystkich danych związanych ze stronicowaniem, czyli liczbę elementów, liczbę wszystkich elementów, numer strony, listę elementów. Jednocześnie posiada metody pomocnicze ułatwiające pracę przy budowaniu stronicowania, na przykład getMaxPage()(która zwraca liczbę stron). Natomiast dzięki zaimplementowaniu interfejsu IteratorAggregate obiekt tej instancji możemy wykorzystać w pętli foreach (o czym przekonamy się później).
Przedstawiona idea wydaje się być przejrzysta - zapraszam więc do drugiej części.
Komentarze: 2 to “[php] Prosta obsługa stronicowania - część 1.”
Napisz komentarz
“Wykorzystanie SQL_CALC_FOUND_ROWS jest niewątpliwie optymalne” - akurat nie do końca. Gdy w zapytania w sekcji for WHERE/ORDER korzystamy z kolumn z indexami, szybciej jednak wykonają się dwa osobne zapytania. Po szczegóły odsyłam do znakomitego bloga: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Hmm … skoro robimy stronicowanie w ZF to mozemy uzyc Zend Paginatora