ugrás a tartalomhoz

PHP: Lapozás

kisstoth · 2005. Aug. 21. (V), 12.50
Sziasztok!

Írtam egy lapozó szkriptet:

<?php
$pages=10;

if(isset($_GET["page"])) {
  $page=$_GET["page"];
  if($page<0) {

    $page=0;
  }
  if(!is_numeric($page)) {
    $page=0;
  }
}
else {
  $page=0;
}

$news_page=@mysql_query("SELECT COUNT(*) AS QN FROM tabla");
$rows=@mysql_fetch_array($news_page);
$rows_num=$rows["QN"];

if($rows_num>$pages) {
  $page_num=1;

  for ($runner=0; $runner<$rows_num; $runner+=$pages) {
    $next=$page_num-1;
    if($runner<>$page) {
      echo "<a href=\"?page=$next\">$page_num.</a> ";
    }
    else {
      echo "$page_num. ";
    }
    $page_num++;
  }
}
?>
Az a gondom vele, hogy ha ez most így működik:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ......

És úgy szeretném "darabolni", ahogyan pl. itt a Weblaboron is van:

1 2 3 4 5 6 7 8 9 10 >>

<< 2 3 4 5 6 7 8 9 10 11 >>

<< 13 14 15 16 17 18 19 20 21 22

Egy ideje gondolkodom rajta, de csak nem jövök rá.

Van valakinek ötlete?
 
1

környezet

Hojtsy Gábor · 2005. Aug. 21. (V), 12.57
Hát ki kell vonni az aktuális oldalszából ötöt, meg hozzá kell adni ötöt. Ha az első eredmény < 1, akkor legyen egyenlő 1. Ha a második több mint max, akkor legyen egyenlő max. Eközött a két érték között kell ciklust csinálni. Persze még lehet finomítani :)
3

Majdnem

kisstoth · 2005. Aug. 21. (V), 19.39

$min=$page-5;
$max=$page+5;
if($min<1) {
  $min=1;
  $max=$max+5;
}

// max ellenőrzésre kerül sql alapján
Alap helyzetben (ha az első oldalon van, azaz a page értéke 0), akkor még jó is (min értéke 1, max értéke 10). De ha lapozok egyet (page értéke 1), akkor a min. értéke még mindig 1 (pedig 2-nek kellene lennie) és a max. növekszik 11-re.

Mit kellene tenni?
8

Sikerült

kisstoth · 2005. Szep. 4. (V), 14.56
Köszi, sikerült megoldani az elméleted alapján! ;)
2

Dátum inkább?

Jano · 2005. Aug. 21. (V), 15.12
Én inkább azon gondolkodnék el, hogyha ezek valóban hírek akkor ésszerűbb lenne a sima számok helyett dátum szerinti léptetést csinálni. Hír mennyiségtől függően nap, hét bontás ahelyett, hogy pl 10-esével jelenik meg egy lapon. Még számozásnál csak kábére találgat az ember, hogy az egyhetes szabija alatt kihagyott hírekhez körülbelül 4-5-ot kell vissza lapozni, datumnél pontosan oda ugorhat.

A lapozó listán pedig a szűk környzete melett ha hosszú a lista akkor érdemes nagyobb egységeket átlépő lapozó linket is betenni.

Pl 67 oldal jönne ki es én a 23-ik lapon vagyok és 45-re szeretnék menni akkor tudjak nagyobb lépésekben haladni:
-10...20, 21, 22, (23), 24, 25, 26 ... +10

Vagy ha már dátum:
-1 hónap, -1hét...12,13,(14),15,16...+1hét, +1hónap
4

Jó az ötlet

kisstoth · 2005. Aug. 21. (V), 19.44
Nem biztos, hogy a látogatók ezt első látásra kezelni tudnák. De valóban átláthatóbb.
7

1 2 3 ... 10 11 12 13 14 ... 33 34 35

Dualon · 2005. Aug. 22. (H), 15.12
Híreknél valóban jó ötlet a dátum szerinti csoportosítás!

Más esetekben én azt szeretem a legjobban, ha van link a legelső lapokra, az épp nézett lap környezetére, és a legutolsókra is.
<< Előző 1 2 3 ... 10 11 12 13 14 ... 33 34 35 Következő >>
Természetesen az épp kiválasztott oldalt valamiképp jelölni kell. A fenti példában némileg rövidítettem, szvsz az előző és következő 5-6 lapra érdemes linkelni.
Arra viszont még nem találtam szép és logikus megoldást, hogy egy adott link különböző sorrendek (pl. dátum szerint, név szerint, növekvően vagy csökkenően) mindig ugyanoda mutasson, vagyis felhasználóbarát legyen a lapozás. Körülményes, Ha van erre jó ötletetek, szívesen fogadnám!
5

Off

Anonymous · 2005. Aug. 22. (H), 09.13
<?
if(isset($_GET["page"])) {
  $page=$_GET["page"];
  if($page<0) {

    $page=0;
  }
  if(!is_numeric($page)) {
    $page=0;
  }
}
else {
  $page=0;
}
?>
Ezt a hosszú kódot egy sorral is lehetne helyettesíteni:

<?
$page=(isset($_GET["page"]))?intval($_GET["page"]):0;
?>
Gyulus
6

pager.php

Hodicska Gergely · 2005. Aug. 22. (H), 11.00
Szia!


Én ezt ütöttem össze egyszer. Nagyon régi kód (stílust nem vállalom), de működik. Plusz van benne pár finomság. Nem csak azt mondhatod, hogy a 6. oldal látszódjon, hanem hogy a 657. sor. És akkor minden úgy számolódik, hogy a megjelenő oldalon az első sor a 657. legyen. Plusz a linkek úgy számolódnak, hogy ha 7. oldalon vagy, és úgy van beállítva, hogy 5 link jelenik meg, akkor 5 6 [7] 8 9 linkek látszódnak, tehát igyekszik az aktuális oldal linkjét középre kavarni.
<?php
	// Ennyi sor jelenik meg egy oldalon
	define( 'DEFAULT_ROW_PER_PAGE', 10 );
	// Ennyi link jelenik meg egy oldalon (plusz generalodank az olyan linkek, mint a firstPage, lastPage, stb.)
	define( 'DEFAULT_LINK_NUM_PER_PAGE', 7 );
	// Az URL-ben ilyen neven adodik at az aktualis sor sorszama
	define( 'ACT_ROW_URL', 'p_ar' );
	// Az URL-ben ilyen neven adodik at, hogy hany sor jelenjen meg egy oldalon, ez csak akkor
	// kerul bele az URL-be, ha az elter a defaulttol
	define( 'ROW_PER_PAGE_URL', 'p_rpp' );
	// Az URL-ben ilyen neven adodik at, hogy hany link jelenjen meg egy oldalon, ez csak akkor
	// kerul bele az URL-be, ha az elter a defaulttol
	define( 'LINK_NUM_PER_PAGE_URL', 'p_lnpp' );

	function generatePagerLinkPart( $actRow, $totalRowNum, $rowPerPage = DEFAULT_ROW_PER_PAGE, $linkNumPerPage = DEFAULT_LINK_NUM_PER_PAGE ) {
		// $actRow: az aktualisan megjeleno oldalon ez a sor lesz az elso
		// Tehat ha $actRow % $rowPerPage != 1, akkor az elso oldalra kvazi kevesebb elem jut:
		// pl. $actRow = 3, $rowPerPage = 3,  $totalRowNum = 5
		//    1. oldal: 1,2
		//    2. oldal: 3,4,5    <- ez latszik
		// Amikor viszont rakattintunk az elso oldal-hoz tartozo linkhez,
		// aminel az $actRow 1 persze mar 3 elem fog szinten latszodni
		//    1. oldal: 1,2,3    <- ez latszik
		//    2. oldal: 4,5
		// Sajnos mas megoldast nem talatam ugy, hogy a kezdo sort lehessen megadni a linkeke generalasakor,
		// ne a kezdo oldalt. Ugyis ha linkeket mi generaljuk, akkor az egyes oldalakra igaz lesz, hogy
		// $actRow % $rowPerPage != 1, szoval ilyen anomalia nem fordulhat elo

		settype( $totalRowNum, 'integer' );
		if ( $totalRowNum < 1 ) return false;
		settype( $actRow, 'integer' );
		if ( $actRow < 1 ) $actRow = 1;
		if ( $actRow > $totalRowNum ) $actRow = $totalRowNum;
		settype( $rowPerPage, 'integer' );
		if ( $rowPerPage < 1 ) $rowPerPage = DEFAULT_ROW_PER_PAGE;
		settype( $linkNumPerPage, 'integer' );
		if ( $linkNumPerPage < 1 ) $linkNumPerPage = DEFAULT_LINK_NUM_PER_PAGE;

		// Ennyi lap van osszesen
		$totalPageNum = ceil( $totalRowNum / $rowPerPage );

		// Ha az elso oldalon nem $rowPerPage darab sor van
		// pl. $actRow = 3, $rowPerPage = 3,  $totalRowNum = 5
		// 1. oldal: 1,2
		// 2. oldal: 3,4,5
		if ( $actRow % $rowPerPage != 1 ) {
			// Ha az elso oldalon tobb ures hely van, mint amennyi az utolso oldalra kiferne
			// (olyan leosztaskor, amikor ha az elso oldal tele van), akkor noveljuk az oldalak szamat
			// A pelda majd erthetove teszi:
			// $actRow = 1, $rowPerPage = 4, $totalRowNum = 6
			// 1. oldal: 1,2,3,4     -> ez latszik
			// 2. oldal: 5,6
			// --> Ket elem hianyozhat az elso oldalrol, ennyi hely van meg az utolso oldalon
			// $actRow = 2, $rowPerPage = 4, $totalRowNum = 6
			// 1. oldal: 1
			// 2. oldal: 2,3,4,5     -> ez latszik
			// 3. oldal: 6
			// --> $totalPageNum-ot novelni kell, az elso oldalrol 3 ures hely van
			// $actRow = 3, $rowPerPage = 4, $totalRowNum = 6
			// 1. oldal: 1,2
			// 2. oldal: 3,4,5,6     -> ez latszik
			// --> $totalPageNum-ot nem kell novelni, az elso oldalon 2 ures hely van
			if (  $actRow % $rowPerPage  >=  $totalRowNum % $rowPerPage  ) $totalPageNum++;
		}
		// Ennyi link latszik majd valojaban
		$showedLinkNum = $totalPageNum > $linkNumPerPage ? $linkNumPerPage : $totalPageNum;
		// Ez a lap fog latszodni
		$showedPage = ceil( $actRow / $rowPerPage );
		// Ha nem az elso sorral kezdunk, akkor eltolodik eggyel
		if ( $actRow % $rowPerPage != 1 ) $showedPage++;

		// Most hatarozzuk meg, hogy az aktualisan latszodo oldal hanyadik legyen a linkek kozott
		// Az kovetkezo 3 sor lenyege, hogy az aktualisan latszodo oldal a linkeke kozott lehetoleg kozepre keruljon
		if ( $totalPageNum - $showedPage >= floor( $showedLinkNum / 2 ) ) $showedPagePos = ceil( $showedLinkNum / 2 );
		else $showedPagePos = $showedLinkNum - (  $totalPageNum  -  $showedPage  );
		if ( $showedPage < $showedPagePos ) $showedPagePos = $showedPage;
		// Erre az oldalra hivatkozik az elso link
		$firstLinkedPage = $showedPage - $showedPagePos + 1;
		// Erre az oldalra hivatkozik az utolso link
		$lastLinkedPage = $firstLinkedPage + $showedLinkNum - 1;

		$notDefaultParams = '';
		if ( $rowPerPage != DEFAULT_ROW_PER_PAGE ) {
			$notDefaultParams = ROW_PER_PAGE_URL . URL_QUERYSTRING_EQ . $rowPerPage . URL_QUERYSTRING_SEP;
		}
		if ( $linkNumPerPage != DEFAULT_LINK_NUM_PER_PAGE ) {
			$notDefaultParams .= ( LINK_NUM_PER_PAGE_URL . URL_QUERYSTRING_EQ . $linkNumPerPage . URL_QUERYSTRING_SEP);
		}

		$links = array();
		// Elso oldalra mutato link
		if ( $showedPage == 1 ) $links[ 'firstPage' ] = false;
		else $links[ 'firstPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . '1';
		// $linkNumPerPage-gel elorebb levo oldalra mutato link
		if ( $showedPage == 1 ) $links[ 'prevXPage' ] = false;
		else {
			$prevX = $actRow - $rowPerPage * $linkNumPerPage;
			if ( $prevX < 1 ) $prevX = 1;
			$links[ 'prevXPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $prevX;
		}
		// Elozo oldalra mutato link
		if ( $showedPage == 1 ) $links[ 'prevPage' ] = false;
		else {
			$prev = $actRow - $rowPerPage;
			if ( $prev < 1 ) $prev = 1;
			$links[ 'prevPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $prev;
		}
		// Kovetkezo oldalra mutato link
		if ( $showedPage == $totalPageNum ) $links[ 'nextPage' ] = false;
		else {
			$next = $actRow + $rowPerPage;
			$links[ 'nextPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $next;
		}
		// $linkNumPerPage-gel hatrebb levo oldalra mutato link
		if ( $showedPage == $totalPageNum ) $links[ 'nextXPage' ] = false;
		else {
			// Ha nincs mar annyi oldal hatra, mint amennyivel lapozni szeretnenk
			if ( $showedPage + $linkNumPerPage > $totalPageNum ) {
				// Ennyivel kevesebbet lapozunk
				$correction = $showedPage + $linkNumPerPage - $totalPageNum;
			} else $correction = 0;
			// Ha az osszsorok szama oszthato az egy oldalon megjeleno sorok szamaval, akkor korrigalni kell
			// Ezt jelenti a szorzo 3. osszetevoje
			$nextX = $actRow + $rowPerPage * (  $linkNumPerPage  -  $correction  );
			$links[ 'nextXPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $nextX;
		}
		// Utolso oldalra mutato link
		if ( $showedPage == $totalPageNum ) $links[ 'lastPage' ] = false;
		else {
			// Ha az osszsorok szama oszthato az egy oldalon megjeleno sorok szamaval, akkor korrigalni kell
			// Ezt jelenti a szorzo 3. osszetevoje
			$last = $actRow + $rowPerPage * (  $totalPageNum  -  $showedPage  );
			$links[ 'lastPage' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $last;
		}
		$links[ 'firstLinkedPage' ] = $firstLinkedPage;
		$links[ 'pages' ] = array();

		for( $i = $firstLinkedPage; $i <= $lastLinkedPage; $i++ ) {
			$index = count( $links[ 'pages' ] );
			$links[ 'pages' ][ $index ] = array();
			// Az aktualisan latszodo oldalnak nincs linkje
			if ( $i == $showedPage ) $links[ 'pages' ][ $index ][ 'link' ] = false;
			// Az aktualisan latszodo oldalt megeleozo oldal
			else if ( $i < $showedPage ) {
				$prev = $actRow - $rowPerPage * ( $showedPage - $i );
				if ( $prev < 1 ) $prev = 1;
				$links[ 'pages' ][ $index ][ 'link' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $prev;
				// Az aktualisan latszodo oldal utan kovetkezo
			} else {
				$next = $actRow + $rowPerPage * (  $i  -  $showedPage  );
				$links[ 'pages' ][ $index ][ 'link' ] = $notDefaultParams . ACT_ROW_URL . URL_QUERYSTRING_EQ . $next;
			}
			$links[ 'pages' ][ $index ][ 'firstRow' ] = $actRow;
			$links[ 'pages' ][ $index ][ 'lastRow' ] = (  $i == $totalPageNum  ?  $totalRowNum  :  $actRow + $rowPerPage -1  );
		}

		$links[ 'actPage' ] = $showedPage;
		$links[ 'totalPageNum' ] = $totalPageNum;
		$links[ 'nextRowNum' ] = $totalRowNum - $actRow - $rowPerPage + 1;
		if ( $showedPage == $totalPageNum ) $links[ 'nextRowNum' ] += ( $rowPerPage - $totalRowNum % $rowPerPage );
		$links[ 'prevRowNum' ] = $actRow - 1;
		$links[ 'totalRowNum' ] = $totalRowNum;
		$links[ 'rowPerPage' ] = $rowPerPage;
		$links[ 'linkNumPerPage' ] = $linkNumPerPage;

		return $links;
	}
?>
Itt van még egy kis smarty template is hozzá:
<table border=0 cellpadding=0 cellspacing=0 align=center>
<tr>
   <td class=pagerTD>
      <table style="width:100%">
      <tr>
         <td class=pagerTD><div align=center>Összesen {$pagerLinks.totalRowNum} találat</td>
      </tr>
      </table>
   </td>
</tr>
<tr>
   <td class=pagerTD>
      <table align=center>
      <tr>
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.firstPage eq false}
               &nbsp;&lt;&minus;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.firstPage}">&nbsp;&lt;&minus;&nbsp;</a>
            {/if}
         </div></td>
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.prevXPage eq false}
               &nbsp;&lt;&lt;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.prevXPage}">&nbsp;&lt;&lt;&nbsp;</a>
            {/if}
         </div></td>
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.prevPage eq false}
               &nbsp;&lt;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.prevPage}">&nbsp;&lt;&nbsp;</a>
            {/if}
         </div></td>
         {section name=pages loop=$pagerLinks.pages}
            {if $pagerLinks.pages[pages.index].link eq false}
               <td class=pagerActPageTD style="border:solid black 1px;width:25px"><div align=center>
                  &nbsp;{math equation="x + y" x=$pagerLinks.firstLinkedPage y=$smarty.section.pages.index}&nbsp;
               </div></td>
               {assign var="firstRow" value=$pagerLinks.pages[pages.index].firstRow}
               {assign var="lastRow" value=$pagerLinks.pages[pages.index].lastRow}
            {else}
               <td class=pagerTD style="width:25px"><div align=center>
                  &nbsp;<a href="/{$baseLink}{$pagerLinks.pages[pages.index].link}">{math equation="x + y" x=$pagerLinks.firstLinkedPage y=$smarty.section.pages.index}</a>&nbsp;
               </div></td>
            {/if}
         {/section}
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.nextPage eq false}
               &nbsp;&gt;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.nextPage}">&nbsp;&gt;&nbsp;</a>
            {/if}
         </div></td>
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.nextXPage eq false}
               &nbsp;&gt;&gt;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.nextXPage}">&nbsp;&gt;&gt;&nbsp;</a>
            {/if}
         </div></td>
         <td class=pagerTD style="width:25px"><div align=center>
            {if $pagerLinks.lastPage eq false}
               &nbsp;&minus;&gt;&nbsp;
            {else}
               <a href="/{$baseLink}{$pagerLinks.lastPage}">&nbsp;&minus;&gt;&nbsp;</a>
            {/if}
         </div></td>
      </tr>
      </table>
   </td>
</tr>

<tr>
   <td class=pagerTD>
      <table style="width:100%">
      <tr>
         <td class=pagerTD style="width:60px"><div align=left>&nbsp;&lt;&nbsp;{$pagerLinks.prevRowNum}&nbsp;találat&nbsp;</div></td>
         <td class=pagerTD>
            <div align=center>{$pagerLinks.actPage} / {$pagerLinks.totalPageNum} oldal</div>
            <div align=center>{$firstRow} &minus; {$lastRow} találat</div>
         </td>
         <td class=pagerTD style="width:60px"><div align=right>&nbsp;{$pagerLinks.nextRowNum}&nbsp;találat&nbsp;&gt;&nbsp;</div></td>
      </tr>
      </table>
   </td>
</tr>
</table>
9

nem mulkodik

gaspar456 · 2010. Aug. 28. (Szo), 19.59
nem mulkodik ez a pager