traži:  
 php.com.hr >

(...nastavak)
 


Ovog puta ćemo preskočiti slike već idemo odmah na objašnjenje.

Objašnjenje :

Ovog puta smo kao uvjet prikaza ili obrade forme koristili $REQUEST_METHOD. On je korišten zato što ovog puta postoje dva submit gumba, i stiskanjem bilo kojeg od njih želimo umjesto prikaza forme pokrenuti obradu iste.

Kvaka leži u tome (a to je i cijeli point ovog primjera) da će se nakon sumbitanja forme pomoću jednog od tih gumba popuniti vrijednost unutar superglobalne $_POST varijable samo onog gumba koji je pritisnut, što dokazuje dio koda koji obrađuje formu.

if ($_POST["gumb1"])

echo "Pritisnuli ste gumb 1";

if ($_POST["gumb2"])

echo "Pritisnuli ste gumb 2";

Zato što mi u trenutku u kojem odlučujemo da li se treba prikazati forma ili se treba obraditi forma ne znamo koji je gumb pritisnut moramo koristiti $REQUEST_METHOD varijablu kao provjeru da li je forma već ispunjena. Napominjem, ukoliko je metoda forme GET primjer će sa kodom iz primjera (uz učinjene preinake iz POST u GET na svim mjestima) uvijek obavljati obradu forme pošto se u $REQUEST_METHOD uvijek nalazi GET, iako ne postoje podaci u query stringu.

Normalno, drugo rješenje problema je da se u if-u koji odlučuje da li se prikazuje ili obraduje forma ispitamo stanje svih gumba unutar forme. Nešto poput ovoga :

if ( !( $_POST["gumb1"] or $_POST["gumb2"] ) ) {

Normalno, uočavate da bi sa ovom shemom morali navesti sve postojeće gumbe da osiguramo pravilno ponašanje našeg malenog sistema prikaza i obrade forme.

U formama sa više gumba se obično koristi malo drugačiji model prikaza i obrade forme, te ću se njemu posvetiti malo kasnije u ovom članku. Za sada je bitno da znate da se PHP-u prosljeđuju vrijednosti samo onih submit gumba koji su pritisnuti pri submitanju forme.

Idemo se sada na trenutak vratiti na metode slanja formi, te ćemo se nakon toga baciti na pojedine elemente forme te na rad sa njima.

Kombiniranje POST i GET metode prosljeđivanja podataka kroz jednu formu

Ponekada je potrebno kombinirati obje metode prosljeđivanja podataka.

Recimo, u slučaju kada se unutar jednog PHP dokumenta nalazi više 'dijelova' sitea

Tu govorim o tzv. Višenamjenskim stranicama. Ukratko, koncept takvih dokumenata je da se na osnovi jedne (ili više) varijable iz query stringa surferu prikazuju potpuno različiti dijelovi našeg sitea.

Recimo, ako surfer otvori link tipa http://www.moj-site.com/indeks.php?nav=novosti

Prikazuje mu se lista svih novosti, a ako otvori link

http://www.moj-site.com/indeks.php?nav=kontakt otvara mu se kontakt forma. Očito je da u ovom slučaju moramo nekako proslijediti $_GET['nav'] varijablu kroz query string i kada se popuni kontakt forma da bi sve radilo kako spada.

Ovo je moguće ukoliko se radi o formi sa POST metodom slanja podataka.

Idemo pogledati primjer pa će stvari biti jasnije. Sam primjer je malo kompleksniji radi ilustracije konkretnog problema. Radi se o višenamjenskoj stranici čiji jedan dio sadrži formu koju ćemo prikazivati i obrađivati.

Primjer 5: Kombiniranje POST i GET metode u istoj formi

<html>

<head>

<title>Primjer 5: Kombiniranje POST i GET metode prosljeđivanja podataka</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

</head>

<body>

<h2>Primjer 5 : Kombiniranje POST i GET metode prosljeđivanja podataka</h2>

<hr>

<p>Dobrodošli na višenamjensku stranicu:<br>

<br>

Dijelovi stranice :</p>

<ul>

<li> <a href="<?=$PHP_SELF?>">Početna stranica</a></li>

<li><a href="<?=$PHP_SELF?>?nav=tekst">Stranica sa tesktom</a></li>

<li><a href="<?=$PHP_SELF?>?nav=forma">Forma</a></li>

</ul>

<hr>

<?

// realizacija višenamjenske stranice

switch (@ $_GET["nav"]){

case "forma":

// dio dokumenta sa prikazom i obradom forme

if (! $_POST["SBgumb"]){

?>

<form name="primjer3" method="post" action="<?=$PHP_SELF?>?nav=forma">

Unesi svoje ime :

<input name="ime" type="text" >

<br>

<input name="SBgumb" type="submit" value="Pošalji">

</form>

<?

} else {

// obrada forme

echo "Polje ime sadrži vrijednost : " . $_POST["ime"];

}

break;

case "tekst":

?>

<p>Ovo je dio stranice sa

nekim većim tekstom koji služi samo za ilustraciju </p>

<?

break;

default :

// obavlja se ako ne postoji $_GET["nav"] varijabla ili ako ima nenavedenu vrijednost

// prikazuje se pri dolasku na dokument

echo "Nalazite se na početnoj stranici";

}

?>

</body>

</html>

Objašnjenje :

Već sam spomenuo da se ovdje radi o višenamjenskoj stranici koja je realizirana pomoću kontrolne varijable $_GET["nav"]. Ovisno u vrijednosti u njoj naš dokument surferu vraća drugačiji ispis. Pošto tema ovog članka nisu višenamjenske stranice dio sa kojim ćemo se detaljnije pozabaviti je slučaj kada se u $_GET["nav"] nalazi vrijednost forma kada se prikazuje naša forma.

if (! $_POST["SBgumb"]){

?>

<form name="primjer3" method="post" action="<?=$PHP_SELF?>?nav=forma">

Unesi svoje ime :

<input name="ime" type="text" >

<br>

<input name="SBgumb" type="submit" value="Pošalji">

</form>

<?

} else {

// obrada forme

echo "Polje ime sadrži vrijednost : " . $_POST["ime"];

}

U ovom isječku koda koji prikazuje i obrađuje formu je boldan dio na kojem ćemo se malo zadržati.

Koncept je poprilično jednostavan i razumljiv, no postoje neke stvari na koje je potrebno paziti kod ovog načina prosljeđivanja podataka. No idemo redom.

U prvom primjeru ovog članka sam rekao da action argument <form> taga služi za određivanje URL-a do dokumenta koji očekuje podatke iz te forme te ih obrađuje i radi sa njima ono što je potrebno. Pošto je u ovom slučaju dokument koji prihvaća podatke isti kao i onaj koji prikazuje formu kao prvi dio linka koristimo $PHP_SELF varijablu radi osiguravanja da će se opet otvoriti isti dokument. No, u ovom slučaju je problematika dodatno zakomplicirana time što se forma nalazi unutar višenamjenske stranice i ukoliko nekako ne proslijedimo vrijednost i za $_GET["nav"] varijablu nakon submitanja forme će se umjesto koda za obradu forme pokrenuti default grana switch strukture.

Iz tog razloga smo ručno 'zalijepili' na kraj action argumenta i query string sa vrijednosti za $_GET["nav"] varijablu, tako da osiguramo da će se nakon submitanja forme opet pokrenuti pravilna grana switch-a (ona u kojoj se nalazi kod za prikaz i obradu forme).

Pošto smo proslijedili tu vrijednost naša skripta će nakon submitanja obaviti obradu forme. Princip prikaza i obrade forme je isti onome iz primjera 3 tako da se ovog puta neću zadržavati na njegovom objašnjenju.

Kao što sam rekao, u ovom konceptu je potrebno paziti na neke stvari da bi sve radilo. Prva i očita stvar je da moramo proslijediti točnu vrijednost za $_GET["nav"]. No druga, ne toliko očita stvar je da ovaj koncept ne radi ukoliko se radi o formi sa GET metodom.

Problem leži u samom HTML-u, tj HTTP protokolu. Naime, kada se formi da GET metoda i u action argument te forme ručno upišemo link zajedno sa query stringom, taj query string će biti automatski zamijenjen sa imenima i vrijednostima elemenata iz forme. Ilustracije radi, pokušajte pokrenuti gornji primjer, samo promijenite metodu slanja forme iz POST u GET.

No, stvari ipak nisu toliko crne. Postoji način kako 'natjerati' formu da ipak proslijedi i $_GET["nav"] varijabli nakon submitanja forme ukoliko se forma šalje GET metodom. Jedan od načina je da u formu dodamo dodatno, nevidljivo, polje imena nav te u njega spremimo pravilnu vrijednost.

Znači, da bi stvari radile sa GET metodom, u gornjem primjeru treba samo izmijeniti HTML forme sa slijedećim kodom :

if (! $_GET["SBgumb"]){

?>

<form name="primjer3" method="post" action="<?=$PHP_SELF?>">

<input name="nav" type="hidden" value="forma">

Unesi svoje ime :

<input name="ime" type="text" >

<br>

<input name="SBgumb" type="submit" value="Pošalji">

</form>

<?

} else {

// obrada forme

echo "Polje ime sadrži vrijednost : " . $_GET["ime"];

}

Ovim primjerom ćemo završiti prvi dio ovog članka u kojem se govorilo o nekim osnovnim konceptima oko rada sa formama. Vidjeli smo na koje sve načine se mogu podaci proslijediti iz forme nekoj PHP skripti, te kako u toj skripti prihvatiti te podatke i izvršiti neke operacije nad njima. Za sada smo samo ispisivali podatke nazad 'na ekran', ali u zaključnom dijelu članka ćemo malo proširiti i taj dio.

No, prije toga ćemo proći kroz sve elemente koji se mogu naći u formi, te ću ilustrirati neke metode rada sa tim različitim vrstama elemenata.  



PHP i forme
 © 2004 - 2008 php.com.hr