Stronicowanie SMARTY - PHP, paginacja, podział artykułów na strony
Z pewnego źródła otrzymałem do napisania zadanie, stronicowania - musiałem wykorzystać możliwość obiektowości oraz oprzeć ten skrypt o system szablonów SMARTY. Niestety pisanie od podstaw tego stronicowania było czaschłonne i nie specjalnie szybkie. W internecie poszukałem klasę, która nazywa się smarty.paginate.class.php i jest pluginem do systemu szablonów. Sprawa okazuje się być prosta.
Ściągamy naszą klasę z tej strony, dodatkowo aby umożliwić użytkownikowi przepisywanie za pomocą modRewrite możemy sobie ściągnąć TO i mamy to czego potrzebujemy. Jak wygląda kod?
<?php
session_start(); //start sesji wymagany jest do zapamiętania ostaniej odwiedzonej strony
require('Smarty.class.php'); // include SMARTY
require('SmartyPaginate.class.php'); // Klasa paginacji
$smarty =& new Smarty; // Wiadomo
SmartyPaginate::connect(); // inicjacja paginacji
SmartyPaginate::setLimit(25); // ustawienie Limitu wyświetlanych rekordów na stronie
$smarty->assign('results', get_db_results()); // dołączenie wyników z bazy danych
SmartyPaginate::assign($smarty);
$smarty->display('index.tpl'); // wyświetlenie wyników
function get_db_results() {
$link = mysql_connect("host", "user", "password", "database");
displaySmartyPagination::mysqlConnection();
//podmieniamy tylko dane do mysql
$_query = sprintf("SELECT SQL_CALC_FOUND_ROWS * FROM `tabela` LIMIT %d,%d",
SmartyPaginate::getCurrentIndex(), SmartyPaginate::getLimit());
$_result = mysql_query($_query);
while ($_row = mysql_fetch_array($_result, MYSQL_ASSOC)) {
$_data[] = $_row;
}
$_query = "SELECT FOUND_ROWS() as total";
$_result = mysql_query($_query);
$_row = mysql_fetch_array($_result, MYSQL_ASSOC);
SmartyPaginate::setTotal($_row['total']);
displaySmartyPagination::countAllRecords();
mysql_free_result($_result);
mysql_close($link);
return $_data; // zwrócenie wyniku
}
?>
index.tpl
---------
{* Wyświetli nagłówki i aktualnie wyświetlaną stronę *}
Items {$paginate.first}-{$paginate.last} out of {$paginate.total} displayed.
{* wyniki z bazy danych *}
{section name=res loop=$results}
{$results[res]}
{/section}
{* Nawigacja *}
{paginate_prev} {paginate_middle} {paginate_next}
OUTPUT
------
Items 1-25 out of 100 displayed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
prev [1-25][26-50][51-75][76-100] next
W razie problemów chętnie pomogę przy koniguracji skryptu.
Mam nadzieję jednak, że do czegoś się przydał, często na różnego rodzaju zaliczeniach pojawia się problem paginacji, dlatego też smarty.pagination.class.php powstało po to aby ułatwić użytkownikom możliwość dzielenia na części newsów, galerii, czy dowolnych wyników z bazy danych.