<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zoltanhosszu.com &#124; blog &#187; függvény</title>
	<atom:link href="http://blog.zoltanhosszu.com/tags/fuggveny/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zoltanhosszu.com</link>
	<description>Zoltan Hosszu&#039;s blog about xHTML, CSS, JavaScript, PHP</description>
	<lastBuildDate>Wed, 07 Apr 2010 20:07:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHP lapozás</title>
		<link>http://blog.zoltanhosszu.com/2009/05/php-lapozas/</link>
		<comments>http://blog.zoltanhosszu.com/2009/05/php-lapozas/#comments</comments>
		<pubDate>Mon, 04 May 2009 16:00:34 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[függvény]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[lapozás]]></category>
		<category><![CDATA[programozás]]></category>

		<guid isPermaLink="false">http://blog.zoltanhosszu.com/?p=8</guid>
		<description><![CDATA[Ebben a cikkben egy adatbázist fogunk lapozható formára bontani. Nagyon hasznos ez a funkció, főleg egy nagyobb MySQL adatbázisnál, amikor az embernek többszáz recordja van egy táblában és ezeket szeretné a felhasználóknak valami átlátható formában megjeleníteni. Igazság szerint az alább leírt lapokra bontás talán a legegyszerűbb megoldása ennek a funkciónak, de remélem, hasznos lesz számotokra. [...]]]></description>
			<content:encoded><![CDATA[<p>Ebben a cikkben egy adatbázist fogunk<strong> lapozható formára</strong> bontani. Nagyon hasznos ez a funkció, főleg egy nagyobb MySQL adatbázisnál, amikor az embernek többszáz recordja van egy táblában és ezeket szeretné a felhasználóknak valami <strong>átlátható formában</strong> megjeleníteni. Igazság szerint az alább leírt lapokra bontás talán a legegyszerűbb megoldása ennek a funkciónak, de remélem, hasznos lesz számotokra. Az alább összefoglalt függvényt az<a href="http://www.alberletplusz.hu/" target="_blank"> AlbérletPlusz.hu</a> oldalhoz készítettem, ahol jelenleg is ez a PHP szkript felelős az oldalakra bontásért. Kezdjünk is hozzá.</p>
<p>Először is vegyük gyorsan sorra, hogy mire van szüksége az embernek egy lapozhatóan megjelenő tartalomhoz:<strong> honnan kezdődjön a lekérdezés a MySQL táblából és meddig tartson</strong>. Igazából a legnehezebb dolog itt nem a táblából való lekérdezés, hiszen azt egy sima &#8220;<em>SELECT * FROM tabla LIMIT x, y</em>&#8221; paranccsal megoldhatjuk, ahol <strong>x az eltolás mértéke</strong> (tehát, hogy honnan kezdjük az adatok lekérdezését), <strong>y pedig a megjelenítendő elemek száma</strong> (hmm, milyen érdekes, pont ezekre van szükségünk egy jól működő lapozás funkcióhoz, micsoda szerencse); a bonyolult funkció a lapok számának dinamikus kiírása, mondjuk egy ilyesmi formában:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-32 kep" title="lapozas" src="http://blog.zoltanhosszu.com/wp-content/uploads/lapozas.jpg" alt="lapozas" width="336" height="32" /></p>
<p style="text-align: center;">
<p>Ezt fogjuk most megírni.</p>
<p><span id="more-8"></span></p>
<p>Létrehozunk egy <strong>új függvényt</strong> mondjuk lapozas néven, és paramétereknek megadjuk az <strong>eltolás mértékét és a megjelenítendő elemek számát</strong>. A paramétereknek megadunk egy alap értéket, hogy ha a meghíváskor nem kap a függvény értékeket, akkor is tudjon szépen dolgozni.</p>
<p>Szükségünk lesz néhány változóra is: <strong>előző oldal</strong>, <strong>aktuális oldal</strong>, <strong>következő oldal</strong>, <strong>az oldalak száma</strong>, az oldalakon <strong>megjelenítendő összes elem száma</strong>, valamint egy olyan változóra ami az aktuális oldalszámtól jobbra és balra kiszámítja, hogy hány oldalt mutassunk:<strong> egy intervallumhatárra</strong>. Ez utóbbi változót így leírva lehet kicsit nehéz megérteni, de ahogy haladunk látni fogjátok a funkcióját.</p>
<pre class="brush:php">function lapozas($offset = 0, $show = 12) { //Lapozás függvény - $offset az eltolás értéke, $show a megjelenítendő elemek száma

	global $osszes; //Itt megkapjuk az összes elem számát a táblából, ezt a lekérdezéskor kell kiszámolnunk.

	$elozo = $offset - $show; //Előző oldal kiszámítása
	$kovetkezo = $offset + $show; //Következő oldal kiszámítása
	$aktoldal = (int)($offset / $show) + 1; //Aktuális oldal
	$oldalszam = $osszes / $show; //Oldalak számának kiszámítása

	if ($oldalszam &gt; (int)($osszes / $show)) $oldalszam = (int)($osszes / $show) + 1; //Oldalszám kerekítése</pre>
<p>A változóknak kiszámoljuk a <strong>kezdeti értékeit</strong> és ezzel meg is van az egyik lényeges adat: a kezdeti értékek. Ezekre nagy szükségünk lesz a következő lépéseknél, hiszen elég sokat fogunk számolni velük. Létrehozunk egy rendezetlen listát (&lt;ul&gt;), az oldalszámokat pedig ebbe fogjuk pakolgatni, majd betesszük első elemnek az &#8220;előző oldal&#8221; kiírást és linket.</p>
<pre class="brush:php first-line:12">	if ($oldalszam &gt; 1) { //Ha van elég oldal, hogy megjelenítsük

		print('&lt;ul class="scroll"&gt;'); //Rendezetlen lista létrehozása, ebben tároljuk az oldalszámokat

		if ($elozo &gt;= 0) print('&lt;li&gt;&lt;a href="oldal.php?&amp;offset=' . $elozo .'"&gt;« elõzõ oldal&lt;/a&gt;&lt;/li&gt;'); //Előző oldal kiírása, ha nem az első oldalon vagyunk</pre>
<p>Innentől <strong>két részre bontottam</strong> a függvényt, először is azért, mert szerintem 10 oldal alatt nem érdemes a &#8230;-os részt belerakni, mert 10-12 link még bőven kifér és átlátható; 10 felett viszont már a $range értékkel is számolgatunk majd.</p>
<p>Szóval 10 oldal alatt egy sima for ciklussal bedobáljuk az oldalszámokat a megfelelő linkekkel a listába. Egy kis finomság: <strong>az aktuális oldalt vastaggal fogjuk írni.</strong></p>
<pre class="brush:php first-line:18">		if ($oldalszam &lt; 10) { //Oldalszámozás, ... nélkül

			for ($i = 0; $i &lt; $oldalszam; $i++) {
				$off = ($i * $show) + ($offset % $show); //Offset számítása
				$oldal = $i + 1; //Kiirandó oldalszám megadása

				if ($off == $offset) $oldal = "<strong>" . $oldal . "</strong>"; //Aktuális oldal vastagon írva

				print ('&lt;li&gt;&lt;a href="oldal.php?&amp;offset=' . $off . '"&gt;' . $oldal . '&lt;/a&gt;&lt;/li&gt;'); //Kiiratás
			}

		}</pre>
<p>Ezzel meg is volnánk, most jön az érdekes rész, a <strong>&#8230;-ozás ha sok oldal van</strong>. Itt már szükségünk lesz a <strong>$range</strong> értékre, ami a már fent említett intervallumhatár értéket fogja tárolni. Ezt én 2-re állítottam, mert szerintem elég egy ötös (2 balra + aktuális oldal + 2 jobbra) intervallumot látni, de ezt nyugodtan megváltoztathatjátok. Itt be fogunk hozni 2 új változót, egy <strong>$start</strong> és egy <strong>$end</strong> változót, amik az aktuális oldaltól számolják a $range értékkel csökkentett ill. növelt értékeket. Ez azért kell, hogy ha az utolsó előtti oldalon vagyunk, ne írjunk ki utolsó+1 oldalt, a második oldalon meg -1-t. <img src='http://blog.zoltanhosszu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Lássuk akkor a kódot részletekben.</p>
<pre class="brush:php first-line:29">		 else { //Oldalszámozás ...-tal

			$range = 2; //Intervallum két szélének távolsága aktuális oldaltól

			if ($aktoldal &gt;= ($range *2)) { //Ha messzebb vagyunk az első oldaltól mint $range * 2, kiírjuk az első oldal linkjét
				print ('&lt;li&gt;&lt;a href="oldal.php?offset=0"&gt;1&lt;/a&gt;&lt;/li&gt;');
			}

			if ($aktoldal &gt; ($range *2)) { //Ha már a második oldal száma nem látszik, kipontozzuk
				print('&lt;li&gt;...&lt;/li&gt;');
			}

			$start = $aktoldal - $range; //$start és $end kezdeti értékek
			$end = $aktoldal + $range;

			// /!\ Kritikus rész /!\ a $start és $end pontos kiszámítása			

			if ($start &lt; 1) { //Nem megyünk negatívaba, ha közel vagyunk az oldalak elejéhez
				$start = 1;
				$end = ($range * 2) + 1;
			} elseif ($end &gt; $oldalszam) { //Nem megyünk túl a maximális oldalakon, ha a végén vagyunk
				$start = ($oldalszam - ($range * 2) + 1);
				$end = $oldalszam;
			}</pre>
<p>Innentől igazából a nehezén túl is vagyunk, most egy sima for-ral ki kell iratnunk az oldalakat, majdnem úgy mint a kipontozós résznél, annyi eltéréssel, hogy most $start-tól $end-ig tesszük ezt meg.</p>
<pre class="brush:php first-line:54">			for ($i = $start; $i &lt;= $end; $i++) { //Oldalak kiírása $start-tól $end-ig

				$off = ($i - 1) * $show;
				$oldal = $i;

				if ($off == $offset) $oldal = "&lt;b&gt;" . $oldal . "&lt;/b&gt;";

				print ('&lt;li&gt;&lt;a href="oldal.php?offset=' . $off . '"&gt;' . $oldal . '&lt;/a&gt;&lt;/li&gt;'); //Kiiratás
			}</pre>
<p>Már majdnem készen is vagyunk, egy nagyon apró dolog van csak hátra, az utolsó ill. a következő oldal linkjének kiírása, majd a lista és a függvény lezárása.</p>
<pre class="brush:php first-line:64">			if ($aktoldal &lt; ($oldalszam - ($range * 2) + 1)) {
				print('&lt;li&gt;...&lt;/li&gt;');
			}
			if ($aktoldal &lt;= ($oldalszam - ($range * 2) + 1)) {
				$utolso = $osszes - ($osszes % $show);
				print ('&lt;li&gt;&lt;a href="oldal.php?offset=' . $utolso . '"&gt;' . $oldalszam . '&lt;/a&gt;&lt;/li&gt;'); //Utolsó oldal kiiratása
			}
		}

		if ($kovetkezo &lt;= $osszes ) print('&lt;li style="border: 0px"&gt;&lt;a href="' . $klink . '&amp;offset=' . $kovetkezo . '"&gt;következő oldal »&lt;/a&gt;&lt;/li&gt;');

		print ("&lt;/ul&gt;");
	}

}</pre>
<p>Ezzel <strong>kész is</strong>! Nézzük meg egyben gyorsan:</p>
<pre class="brush:php">function lapozas($offset = 0, $show = 12) { //Lapozás függvény - $offset az eltolás értéke, $show a megjelenítendő elemek száma

	global $osszes; //Itt megkapjuk az összes elem számát a táblából, ezt a lekérdezéskor kell kiszámolnunk.

	$elozo = $offset - $show; //Előző oldal kiszámítása
	$kovetkezo = $offset + $show; //Következő oldal kiszámítása
	$aktoldal = (int)($offset / $show) + 1; //Aktuális oldal
	$oldalszam = $osszes / $show; //Oldalak számának kiszámítása

	if ($oldalszam &gt; (int)($osszes / $show)) $oldalszam = (int)($osszes / $show) + 1; //Oldalszám kerekítése

	if ($oldalszam &gt; 1) { //Ha van elég oldal, hogy megjelenítsük

		print('&lt;ul class="scroll"&gt;'); //Rendezetlen lista létrehozása, ebben tároljuk az oldalszámokat

		if ($elozo &gt;= 0) print('&lt;li&gt;&lt;a href="oldal.php?&amp;offset=' . $elozo .'"&gt;« előző oldal&lt;/a&gt;&lt;/li&gt;'); //Előző oldal kiírása, ha nem az első oldalon vagyunk

		if ($oldalszam &lt; 10) { //Oldalszámozás, ... nélkül

			for ($i = 0; $i &lt; $oldalszam; $i++) {
				$off = ($i * $show) + ($offset % $show); //Offset számítása
				$oldal = $i + 1; //Kiirandó oldalszám megadása

				if ($off == $offset) $oldal = "&lt;b&gt;" . $oldal . "&lt;/b&gt;"; //Aktuális oldal vastagon írva

				print ('&lt;li&gt;&lt;a href="oldal.php?&amp;offset=' . $off . '"&gt;' . $oldal . '&lt;/a&gt;&lt;/li&gt;'); //Kiiratás
			}

		} else { //Oldalszámozás ...-tal

			$range = 2; //Intervallum két szélének távolsága aktuális oldaltól

			if ($aktoldal &gt;= ($range *2)) { //Ha messzebb vagyunk az első oldaltól mint $range * 2, kiírjuk az első oldal linkjét
				print ('&lt;li&gt;&lt;a href="oldal.php?offset=0"&gt;1&lt;/a&gt;&lt;/li&gt;');
			}

			if ($aktoldal &gt; ($range *2)) { //Ha már a második oldal száma nem látszik, kipontozzuk
				print('&lt;li&gt;...&lt;/li&gt;');
			}

			$start = $aktoldal - $range; //$start és $end kezdeti értékek
			$end = $aktoldal + $range;

			// /!\ Kritikus rész /!\ a $start és $end pontos kiszámítása			

			if ($start &lt; 1) { //Nem megyünk negatívaba, ha közel vagyunk az oldalak elejéhez
				$start = 1;
				$end = ($range * 2) + 1;
			} elseif ($end &gt; $oldalszam) { //Nem megyünk túl a maximális oldalakon, ha a végén vagyunk
				$start = ($oldalszam - ($range * 2) + 1);
				$end = $oldalszam;
			}

			for ($i = $start; $i &lt;= $end; $i++) { //Oldalak kiírása $start-tól $end-ig

				$off = ($i - 1) * $show;
				$oldal = $i;

				if ($off == $offset) $oldal = "&lt;b&gt;" . $oldal . "&lt;/b&gt;";

				print ('&lt;li&gt;&lt;a href="oldal.php?offset=' . $off . '"&gt;' . $oldal . '&lt;/a&gt;&lt;/li&gt;'); //Kiiratás
			}

			if ($aktoldal &lt; ($oldalszam - ($range * 2) + 1)) {
				print('&lt;li&gt;...&lt;/li&gt;');
			}
			if ($aktoldal &lt;= ($oldalszam - ($range * 2) + 1)) {
				$utolso = $osszes - ($osszes % $show);
				print ('&lt;li&gt;&lt;a href="' . $klink . '&amp;offset=' . $utolso . '"&gt;' . $oldalszam . '&lt;/a&gt;&lt;/li&gt;'); //Utolsó oldal kiiratása
			}
		}

		if ($kovetkezo &lt;= $osszes ) print('&lt;li style="border: 0px"&gt;&lt;a href="' . $klink . '&amp;offset=' . $kovetkezo . '"&gt;következő oldal »&lt;/a&gt;&lt;/li&gt;');

		print ("&lt;/ul&gt;");
	}

}</pre>
<p>Remélem megértettétek, hogyan is működik ez a függvény, ha nem, <strong>bátran kérdezzetek</strong> a hozzászólásoknál!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zoltanhosszu.com/2009/05/php-lapozas/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
