Stronicowanie SMARTY - PHP, paginacja, podział artykułów na strony

Posted by camillo | Bez kategorii, Inne, Internet, WebDesign, php | niedziela 8 czerwiec 2008 17:12

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.

Komentarze: 8 »

  1. Komentarz od Marcin — 06/07/2008 @ 22:58

    Witam, spoko artykuł.
    Mam mały kłopot, wrzuciłem pluginy i wszystkei pliki z tą classą do SMARTÓW
    i wywala mi bład przy tym elemęcie:
    displaySmartyPagination::mysqlConnection();

    Jeszcze popróbuje coś z tym zrobić :), bo właśnie czegoś takiego szukałem.

    Pozdrawiam
    Marcin

  2. Komentarz od camillo — 07/07/2008 @ 07:40

    Jaki to błąd? Możesz podać jego treść?

  3. Komentarz od Marcin — 07/07/2008 @ 20:30

    Witam, ponownie :)

    Fatal error: Class ‘displaySmartyPagination’ not found in C:\AppServ\www\test\przewijanie\index.php on line 21

    coś takiego mi wyrzuca.

    Przy takim kodzie, kod template to ten sam który tutaj zastosowałeś:

    assign(’results’, get_db_results()); // dołączenie wyników z bazy danych do szablony smarty - jest to return funkcji get_db_results()

    SmartyPaginate::assign($smarty);

    $smarty->display(’index.tpl’); // wyświetlenie wyników

    function get_db_results() {

    $link = mysql_connect(”localhost”, “”, “”, “test”);
    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 :)
    }
    ?>

    Może to wina tego że robie to na localhoscie pod win?? Różne rzeczy mi się tam dzieją, np. logowanie działa
    a jak wrzucam na serwer już nie działa.

    Wgrałem wszystkie pliki do szablonów SAMRTY, do libs i plugin.

    Będę wdzięczny za pomoc.

    Pozdrawiam
    Marcin

  4. Komentarz od camillo — 08/07/2008 @ 08:02

    Heh :) spróbuj to zakomentować. Zobaczymy - bo chyba źle zadeklarowana (a raczej napewno) nazwa klasy - byćmoże wkradło się coś z mojego obiektowego kodu :) (przerabiałem na obiektówkę)

  5. Komentarz od Marcin — 08/07/2008 @ 22:38

    heja, Faktycznie jest ok.
    Tylko coś mi nie wrzuca danych do tablicy, jest pusta. Widzi 6 pozycji ale nie ma zawartości.

    assign(’results’, get_db_results());

    SmartyPaginate::assign($smarty);
    $smarty->display(’index.tpl’);

    print print_r ($_data);

    function get_db_results()
    {

    $url = ‘localhost’;
    $identyfikator = ”;
    $haslo = ”;
    $baza_danych = ‘test’;

    $serwer = @mysql_connect($url,$identyfikator,$haslo);

    $zapyt=”SELECT * FROM test”;
    $news = @mysql_query($zapyt);
    if(!$news)
    {
    echo “blad zapytania”;
    }

    while ($array = mysql_fetch_array($news))
    {
    $_data[] = $_row;
    }

    $_query = “SELECT FOUND_ROWS() as total”;
    $_result = mysql_query($_query);
    $_row = mysql_fetch_array($_result, MYSQL_ASSOC);

    SmartyPaginate::setTotal($_row['total']);

    mysql_free_result($_result);
    mysql_close($serwer);

    return $_data;
    }
    ?>

    zmienna $_data, ma 6 pozycji ale nie ma zawartości jak daje printa nie wiem dlaczego?
    W templejcie to samo.

    Popatrze jeszcze na to.
    :)

  6. Komentarz od marcin — 09/07/2008 @ 09:39

    heja, faktycznie tak jest.
    Działa już classa paginacji.

    Tylko mam teraz problem z wyświetlaniem danych, tablica ma 6 elementów ale nie ma zawartości nawet jak daje print print_r ($_data);

    Popróbuje jeszcze coś.

    Dzięki za pomoc :).
    Mam pytanie znasz może jakiś image crroper, bo ja znalazłem taki http://www.ajaxprogrammer.com/?p=9 , ale wolał bym jeszcze coś prostrzego.

    Pozdrawiam
    Marcin

  7. Komentarz od joga96 — 24/07/2008 @ 06:40

    skopiowalem kod i mam czysto białą strone null nic na niej niema :( moze cos zle przekopiowałem czy poratujecie i podeslecie np. pliki działającego?? joga96@tlen.pl o tytule skryptsmarta

    Bardzo prosze

    Pozdrawiam

  8. Komentarz od camillo — 24/07/2008 @ 09:42

    samo skopiowanie nie działa :) musisz ustanowić połączenie z własnym serwerem MySQL. skopiuj kod kolegi i będzie działać o ile poprawne jest połączenie z MySQL i o ile masz jakieś rekordy w konkretnej tabeli. Warto by było dodać funkcje, która sprawdza ilość rekordów w bazie danych :)
    W razie problemów pisz… pomogę osobiście :)

Kanał RSS dla tego wpisu. TrackBack URI

Dodaj komentarz