Autor | Zpráva | ||
---|---|---|---|
unlucky Profil |
#1 · Zasláno: 1. 11. 2009, 15:56:38 · Upravil/a: unlucky
Na netu jsem našel opravdu pěkný pager, akorát se mi nějak nepovedlo udělat pro stránkování s mod rewrite typu
domena.cz/article/2/ zatim se zobrazuje akorat article.php?page=2 bude to asi funkce databind a preparelink <div class="pre"><pre><?php class Pager { /* nasledujici atributy je potreba nastavit pred volanim databind (vetsina je ale nepovinna) */ /** SQL prikaz pro vyber dat pred strankovanim, nesmi pouzivat LIMIT */ public $SelectCommand; /** * SQL prikaz na vypocitani poctu zaznamu lze nechat * nenastaveny, v tom pripade se vygeneruje v metode DataBind z * SelectCommandu */ public $CountCommand; /** Pocet zaznamu na strance */ public $PageSize = 10; /** Parametr URL, ze ktereho se cte cislo akt. stranky */ public $UrlParameterName; /** atribut ID, ktery bude mit <div> kolem pageru */ public $PagerID = "PagerId"; /** atribut Class, ktery bude mit <div> kolem pageru */ public $PagerCssClass = "PagerClass"; /** * zarovnani <div> kolem pageru - hodnota text-align v atributu style, * hodnota inherit znamena, ze div tento atribut * vubec mit nebude */ public $PagerAlign = "inherit"; /** css trida pouzita pro vykresleni soucasne stranky */ public $CurrentPageCssClass; /** priznak strankovani bez pouziti modu */ public $BasicPaging = 1; /** nahrazovat entity na vystupu */ public $HtmlSpecialChars = 1; /* metody get_TargetedPage, get_ItemCount a get_PageCount ma smysl pouzit az po zavolani DataBind, kdy jsou nastaveny prislusne atributy */ /** pozadovana stranka - precteno z parametru URL */ private $targetedPage = 1; public function get_TargetedPage() { return $this->targetedPage; } /** pocet radku nestrankovane vysledkove sady */ private $itemCount = 0; public function get_ItemCount() { return $this->itemCount; } /** celkovy pocet stranek = itemCount/PageSize */ private $pageCount = 0; public function get_PageCount() { return $this->pageCount; } /** * Pole pouzitych modu strankovani * @see AddPagerMode * @see ClearPagerModes */ public $_modes; /** vysledkova sada - ziskana v metode DataBind **/ private $ResultSet = NULL; /** * url prefix pro pager - zachovany vsechny atributy krome toho, * ktery prislusi pageru */ private $prefix; /** * priznak, zda bude parametr pageru prvnim parametrem v url */ private $first = 0; /** * konstruktor - parametry jsou SQL prikaz na vyber vysledkove * sady a parametr URL, ve kterem bude cislo aktualni stranky * @param SelectCommand - SQL dotaz, ktery vraci vsechny zaznamy, ktere maji byt strankovany * (tedy vsechny, ne jen jednu stranku) * @param UrlParameterName - parametr, ktery bude cten z URL a zjisti se z nej, ktera stranka * je prave vybrana (doporucene hodnoty napr. "strana", "page" apod.) */ public function __construct( $SelectCommand, $UrlParameterName) { $this->SelectCommand = $SelectCommand; $this->UrlParameterName = $UrlParameterName; $this->_modes = array(); } /** * Z konstruktoru predaneho SelectCommandu vytvori upraveny dotaz, ktery vraci pouze * jednu stranku vysledkove sady. Dale vytvori CountCommand (pokud nebyl CountCommand * nastaven explicitne), ktery je pouzit k spocitani vsech prvku, ktere vraci SelectCommand. * Je vypocitan celkovy pocet stranek plne vysledkove sady (pageCount) a z databaze * je ziskana pozadovana stranka vysledkove sady (ResultSet) */ public function DataBind() { // priprava prikazu pro spocitani zaznamu, // pokud nebyl zadan zvenci if (!$this->CountCommand || $this->CountCommand == "") { $this->CountCommand = preg_replace( '@SELECT (.*) FROM@', 'SELECT COUNT(*) AS Count FROM', $this->SelectCommand); } //zjisteni cisla aktualni stranky if (isset($_GET[$this->UrlParameterName])) $this->targetedPage = (int)($_GET[$this->UrlParameterName]); else $this->targetedPage = 1; if ($this->targetedPage == 0) $this->targetedPage = 1; //zjisteni poctu zaznamu $c = (mysql_fetch_object( mysql_query($this->CountCommand))); $this->itemCount = $c->Count; //vypocet poctu stranek $this->pageCount = (int) (($c->Count + $this->PageSize - 1) / $this->PageSize); if ($this->targetedPage > $this->pageCount) $this->targetedPage = 1; //vypocet parametru pro LIMIT $firstrow = ($this->targetedPage - 1) * $this->PageSize; //ziskani pozadovane stranky $this->ResultSet = mysql_query("$this->SelectCommand ". " LIMIT $firstrow, $this->PageSize" ); //analyza url - zjisteni prefixu $hrefprefix = $_SERVER['SCRIPT_NAME']; $this->first=1; foreach ( $_GET as $key=>$value) { if ($key == $this->UrlParameterName) continue; if ($this->first) { $hrefprefix .= "?".$key."=".$value; $this->first = 0; } else $hrefprefix .= "&".$key."=".$value; } $this->prefix = $hrefprefix; } /** * Vypise ladici informace - predevsim pouzite SQL prikazy */ public function DebugPrint($htmlmode = 1) { $firstrow = ($this->targetedPage - 1) * $this->PageSize; echo "Pager debug print: <br />"; echo "<ul>"; echo " <li>Targeted page: ".$this->targetedPage."</li>"; echo " <li>Page count: ".$this->pageCount."</li>"; echo " <li>Select command: ".$this->SelectCommand."</li>"; echo " <li>Select page command: ".$this->SelectCommand." LIMIT $firstrow, $this->PageSize </li>"; echo " <li>Count command: ".$this->CountCommand."</li>"; echo " <li>Url prefix: ".$this->prefix."</li>"; echo "</ul>"; } /** * Postupne vraci radky z vysledkove sady (jako objekty - fetch_object). * Dava smysl az po zavolani DataBind() * @return radek vysledkove sady jako objekt */ public function GetOne() { $obj = mysql_fetch_object($this->ResultSet); if ($obj == null || !($this->HtmlSpecialChars)) return $obj; else { foreach ($obj as $field => $value) $obj->$field = htmlspecialchars($value); return $obj; } } /** * vrati vsechny vysledky jako pole objektu * * @return array of object - vysledky */ public function GetAll() { $a = null; $i = 0; while ($obj = $this->GetOne()) { $a[$i] = $obj; $i++; } return $a; } /** * Pomocna metoda pro vytvoreni odkazu na urcitou stranku. * Dava smysl az po volani DataBind() * @param page - stranka, na kterou bude odkazovano * @param anchoringText - text odkazu * @param cssClass - css trida odkazu */ public function prepareLink( $page, $anchoringText, $cssClass) { $prefix = $this->prefix; $s = ""; if ($page != $this->targetedPage) { if ($page == 1) $h = $prefix; else { if ($this->first) $h = $prefix."?".$this->UrlParameterName."=".$page; else $h = $prefix."&".$this->UrlParameterName."=".$page; } if ($cssClass != "" && $cssClass) $css = " class=\"$cssClass\"" ; else $css=""; return "<a href=\"$h\"$css>$anchoringText</a> "; } else { if ($this->CurrentPageCssClass && $this->CurrentPageCssClass != "") { $s.= "<span class=\"$this->CurrentPageCssClass\">"; $s.= $anchoringText; $s.= "</span> "; } else if ($cssClass && $cssClass != "") { $s.= "<span class=\"$cssClass\">"; $s.= $anchoringText; $s.= "</span> "; } else $s.= $anchoringText." "; return $s; } } /** * Vypise pager do tela stranky. Iteruje pres jednotlive mody */ public function DrawPager() { if ($this->BasicPaging) { //pokud uzivatel zadne mody nenastavil, nastavi se zakladni //mody PrevNext, FirstLast a Default $this->AddPagerMode(new FirstLastPagerMode); $this->AddPagerMode(new PrevNextPagerMode); $this->AddPagerMode(new DefaultPagerMode); } //vy |
||
AM_ Profil |
#2 · Zasláno: 1. 11. 2009, 17:49:41
-chybí dotaz, nevíme, co po nás chceš
-tak dlouhým kódem se tu nikdo asi probírat nebude -a to ještě spíš o to, že jsi ho nedal do a nechal ho v čisté nečitelné formě |
||
unlucky Profil |
#3 · Zasláno: 1. 11. 2009, 18:35:56
dotaz tam někdo dole je, nevejde se. DO tagu jsem dal, akorat při změně se vrátil zpátky
jenom chci vypsat linky pro mod rewrite adresy nevim jak byste to udelali |
||
Časová prodleva: 14 let
|
0