Izrada izbornika - PHP

Do sada smo sve pripremili za dinamičko ispisivanje izbornika. Sada to treba sve povezati u jednu cjelinu.

Za početak kreiramo prazan PHP dokument i nazovemo ga 'izboenik.php':

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Izbornik</title>
<style type="text/css">
<!--
* { 
	margin:0;
	padding:0;
}

li { list-style-type: none; }

#izbornik {
	width: 250px;
	font-size: 1.0em;
	font-family: Arial, Helvetica, sans-serif;
	font-weight: bold;
	background-color: #AAA;
}
#izbornik ul {
	margin: 0px;
	margin-left: 15px;
	font-size: 0.9em;
	font-weight: normal;
	background-color: #BBB;
}
#izbornik ul ul {
	margin: 0px;
	margin-left: 10px;
	font-size: 0.9em;
	font-weight: normal;
	background-color: #CCC;
}

#izbornik a {
	width:100%;
	text-decoration: none;
	color: #A00;
}

#izbornik li a {
	display:block;
}

#izbornik li a:hover {
	color: #333;
	background-color: #DDD;
}

.izbornik-aktivni {
	background-color: #FFFFFF;
	color: #DADADA;
}
-->
</style>
</head>

<body>
<?php
// Ovdje ide potreban PHP kod
?>
</html>

 

Sljedeći korak je pisanje koda za spajanje na bazu:

 

<?php
$db=@mysql_connect('localhost','izbornik','abc123');
if (!$db) {
	exit('Ne mogu se spojiti na MySQL server!!!');
}

if (!mysql_select_db('aubx_aubx',$db)) {
	exit('Ne mogu se spojiti na MySQL bazu');
}
?>

 

Znači, ovim kodom smo se spojili na bazu te u varijablu $db pohranili identifikator veze na bazu. Ako se ne možemo spojiti na MySQL server i odabrati bazu, izvršavanje skripte se prekida i ispisuje pogreška.

Zatim krećemo s dohvaćanjem stavki izbornika. Za dohvaćanje glavnih stavki izbornika dohvaćamo sve one stavke koje nemaju nadređene stavke:

<?php
$upit='
	SELECT id, naziv, link, nadredjena
	FROM izbornik
	WHERE nadredjena=0';

$rez=mysql_query($upit,$db);

if (mysql_num_rows($rez)==0) {
	echo 'Nema stavki u izborniku!!!';
} else {
	//ispisuj stavke izbornika
}
?>

Ovdje vidimo osnovni način rada s bazom podataka pomoću PHP-a - pisanje upita, dohvaćanje podataka iz baze, provjera broja rezultata i slično.

No, pošto koristimo jednu tablicu, potrebno je prilikom ispisivanja svake stavke provjeriti da li je ta stavka nekoj drugoj nadređena. Kako ispisivanje stavki izbornika rekurzivno i da ne bismo pisali previše koda radimo jednu funkciju koja kao parametar prima ID stavke i ispisuje izbornik:

<?php
function pisi($pId) {
global $db;

$upit='
	SELECT id, naziv, link
	FROM izbornik
	WHERE nadredjena='.$pId;

$rez=mysql_query($upit,$db);

if ($rez and mysql_num_rows($rez)!=0) {
	if ($pId==0) {
		?><ul id="izbornik"><?php
	} else {
		?><ul><?php
	}
	while ($red=mysql_fetch_assoc($rez)) {
		$id=$red['id'];
		$naziv=$red['naziv'];
		$link=$red['link'];
		$nadredjena=$red['nadredjena'];
		?>
		<li><a href="<?php echo $link; ?>"><?php echo $naziv; ?></a>
		<?php
			$upit_pod='
				SELECT COUNT(id) broj_podredjenih
				FROM izbornik
				WHERE nadredjena='.$id;

			$rez_pod=mysql_query($upit_pod,$db);

			if ($rez_pod and mysql_num_rows($rez_pod)>0) {
				pisi($id);
			}
		?>
		</li>
		<?php
	}
	?>
	</ul>
	<?php
}
}
?>

 

Funkcija pisi() ispisuje rekurzivno sve stavke izbornika i automatski ispisuje sve podizbornike. U glavnom programu, nakon što se spojimo na MySQL server i na bazu, ispisivanje izbornika započinjemo pozivom funkcije pisi(0);

 

No, to može biti problem kod velikog broja stavki - izbornik bi zauzimao previše mjesta. Zato ćemo na početku prikazati samo osnovne stavke. To znači da ćemo u našem primjeru ispisati: Voće, Pića i Automobili. Kad se klikne na neku od tih linkova, otvorit će se njegov podizbornik i tako dalje... Manjon promjenom prethodne funkcije i dodatkom jos jedne dobivamo sljedeci kod:

<?php
function kreiraj_stablo($id) {
global $db, $stablo;

$upit='
	SELECT id, naziv, link, nadredjena
	FROM izbornik
	WHERE id='.$id;

$rez=mysql_query($upit,$db);

if ($rez and mysql_num_rows($rez)!=0) {
	$red=mysql_fetch_assoc($rez);
	$id=$red['id'];
	$naziv=$red['naziv'];
	$link=$red['link'];
	$nadredjena=$red['nadredjena'];

	if ($nadredjena!=0) {
		$stablo[]=$nadredjena;
		kreiraj_stablo($nadredjena);
	}
}
}


function pisi($pId) {
global $db, $stablo;

$upit='
	SELECT id, naziv, link, nadredjena
	FROM izbornik
	WHERE nadredjena='.$pId;

$rez=mysql_query($upit,$db);

if ($rez and mysql_num_rows($rez)!=0) {
	if ($pId==0) {
		?><ul id="izbornik"><?php
	} else {
		?><ul><?php
	}
	while ($red=mysql_fetch_assoc($rez)) {
		$id=$red['id'];
		$naziv=$red['naziv'];
		$link=$red['link'];
		if (isset($_GET['id']) and $_GET['id']==$id) 
			$aktivni=' class="izbornik-aktivni"';
		else 
			$aktivni='';
		?>
		<li<?php echo $aktivni; ?>>
				<a href="<?php echo $link; ?>"><?php echo $naziv; ?></a>		
			<?php
			if (in_array($id,$stablo)) {
				$upit_pod='
					SELECT COUNT(id) broj_podredjenih
					FROM izbornik
					WHERE nadredjena='.$id;

				$rez_pod=mysql_query($upit_pod,$db);

				if ($rez_pod and mysql_num_rows($rez_pod)>0) {
					pisi($id);
				}
			}
		?>
		</li>
		<?php
	}
	?>
	</ul>
	<?php
}
}

$db=@mysql_connect('localhost','izbornik','abc123');
if (!$db) {
	exit('Ne mogu se spojiti na MySQL server!!!');
}

if (!mysql_select_db('aubx_aubx',$db)) {
	exit('Ne mogu se spojiti na MySQL bazu!!!');
}

if (isset($_GET['id']) and $_GET['id']==(int)$_GET['id']) {
	$id=$_GET['id'];
	$stablo[]=$id;
	kreiraj_stablo($id);
} else {
	$stablo=array();
}

pisi(0);

?>

 

Kad pokrenemo izbornik i u našem primjeru kliknemo na kategoriju Automobili - Mercedes - A klase dobijemo sljedeći rezultat: