Elektronický katalog slouží návštěvníkovi k lepší orientaci mezi nabízenými produkty. U každého produktu by měl být uveden název, popis produktu, cena a DPH. Náš elektronický katalog bude obsahovat seznam produktů a jejich cen (ceník) a seznam produktů členěných podle kategorií i s jeho detailem (katalogový list).
Seznam kategorií (includes/kategorie.asp)
Produkty uložené v databázi je třeba nějakým způsobem členit do jednotlivých kategorií. Informace o těchto kategoriích jsou uloženy v databázi, v tabulce Kategorie, kterou jsme vytvořili v minulém díle. Jak ale získat tyto informace z databáze? Vytvoříme si soubor kategorie.asp, který bude obsahovat tři funkce: ZobrazKategorie, ZobrazPozici, ZobrazPopis
. Soubor budeme vkládat do stránek katalogu vždy nahoru a v místě, kde budeme volat jednu z těchto funkcí, se objeví požadovaný řetězec, popřípadě menu. Před vložením tohoto souboru ještě musíme vložit soubor pro připojení k databázi – connect.asp.
Každá z uvedených funkcí přebírá pouze jeden argument: intKategorie, neboli číslo kategorie, které se akce týká. Celý obsah souboru musí být uzavřen do značek ASP skriptů: <% obsah_souboru %>
Funkce ZobrazKategorii nejdříve získá z databáze název aktuální kategorie a výsledek zapíše do proměnné strMenu. V případě, že je číslo kategorie 0 (0 znamená nejvyšší kategorie), zapíše jako název kategorie Katalog:
Sub ZobrazKategorie(intKategorie) Dim objData, strMenu ‚deklarace proměnných If intKategorie > 0 Then ‚když je kategorie větší než 0 Set objData = objDatabaze.Execute(„SELECT Nazev, Nadrazena FROM Kategorie WHERE ID = “ & intKategorie) ‚připoj se do databáze a z tabulky Kategorie vyber pole Název a Nadřazená strMenu = „<b>“ & objData(„Nazev“) & „</b>“ ‚zapiš do proměnné strMenu název kategorie objData.Close set objData = nothing ‚zavři objekt se záznamy Else ‚jinak intKategorie = 0 ‚nastaví hodnotu proměnné na 0 strMenu = „<b>Katalog</b>“ ‚zapiš do proměnné strMenu Katalog End If |
|
Dále pak funkce vyhledá v databázi všechny podkategorie a zapíše je do proměnné strMenu. Nakonec vloží obsah proměnné strMenu do stránky:
Set objData = objDatabaze.Execute(„SELECT Nazev, ID FROM Kategorie WHERE Nadrazena=“ & intKategorie) ‚vyber z tabulky Kategorie všechny podkategorie strMenu = strMenu & „<ul>“ do while not objData.EOF ‚pro každý nalezený záznam … strMenu = strMenu & „<li><a href=““katalog.asp?kategorie=“ & objData(„ID“) & „““>“ & objData(„Nazev“) & „</a><br /></li>“ ‚zapiš do proměnné název kategorie a ID – QueryString kategorie (viz níže) objData.MoveNext ‚posuň se o záznam dál loop strMenu = strMenu & „</ul>“ objData.Close set objData = nothing ‚zavři objekt se záznamy Response.Write(strMenu) ‚vypiš menu na obrazovku End Sub |
|
Druhá funkce – ZobrazPopis, zobrazí na místě volání popis aktuální kategorie:
Sub ZobrazPopis(intKategorie) Dim objData ‚deklarace proměnných If intKategorie > 0 Then ‚je kategorie větší než 0 Set objData = objDatabaze.Execute(„SELECT Popis FROM Kategorie WHERE ID=“ & intKategorie) ‚vyhledej záznam v databázi Response.Write(objData(„Popis“)) ‚vypiš Popis kategorie objData.Close set objData = nothing ‚zavři objekt se záznamy End If End Sub |
|
Poslední funkcí v souboru kategorie.asp bude ZobrazPozici. Tato funkce zobrazí cestu od nejvyšší kategorie až k té aktuální:
Sub ZobrazPozici(intKategorie) Dim I, objData, strPozice ‚deklarace proměnných i = intKategorie strPozice = „“ ‚inicializace proměnných do while not i = 0 ‚dokud není nadřazená kategorie 0 (= Katalog)… Set objData = objDatabaze.Execute(„SELECT Nazev, Nadrazena FROM Kategorie WHERE ID=“ & i) ‚najdi nadřazenou kategorie strPozice = “ >> <a href=““katalog.asp?kategorie=“ & i & „““>“ & objData(„Nazev“) & „</a>“ & strPozice ‚zapiš název kategorie a odkaz i = objData(„Nadrazena“) ‚změň hodnotu i na cislo nadrazene kategorie objData.Close set objData = nothing ‚zavři objekt se záznamy loop ‚pokračuj dalším záznamem strPozice = „<a href=““katalog.asp““>Katalog</a>“ & strPozice ‚doplň nejvyšší kategorii – Katalog Response.Write(strPozice) ‚vypiš pozici End Sub |
|
Seznam produktů (katalog.asp)
Funkce uložené v souboru kategorie.asp budeme využívat hlavně v souboru katalog.asp. Tato stránka bude obsahovat seznam produktů v dané kategorii řazený podle výrobců.
Na začátek souboru musíme přidat příkazy pro vložení souboru connect.asp a také kategorie.asp:
<!– #include file=“includes/connect.asp“ –> <!– #include file=“includes/kategorie.asp“ –> |
|
Dále musíme získat proměnou kategorie v kolekci QueryString, pomocí níž si mezi stránkami předáváme informaci o kategorii, kterou chceme otevřít. Následující kód napíšeme hned za příkazy pro vkládání souborů:
<% Dim intQSKategorie ‚deklarace proměnných PripojDatabazi ‚připojení k databázi intQSKategorie = CInt(Request.QueryString(„kategorie“)) ‚získání hodnoty proměnné kategorie z kolekce QueryString (proměnná je součástí adresy za ?) a převod na číslo If not intQSKategorie > 0 Then ‚když intQSKategorie je menší než 0 nebo je délka nulová nebo to není číslo … intQSKategorie = 0 ‚nastav hodnotu proměnné na 0 End If %> |
|
Za tímto kódem následuje obsah stránky v HTML. Funkce ze souboru kategorie.asp vložíme tam, kde chceme zobrazit jejich výsledek. Jako argument těchto funkcí použijeme proměnnou intQSKategorie, která obsahuje číslo aktuální kategorie:
<% ZobrazKategorie(intQSKategorie) %> <% ZobrazPopis(intQSKategorie) %> <% ZobrazPozici(intQSKategorie) %> |
|
Na místo, kde chceme zobrazit seznam produktů, vložíme zbylý kód skriptu:
<% Dim objData ‚deklarace proměnných Set objData = objDatabaze.Execute(„SELECT ID, Nazev, Vyrobce FROM Produkty WHERE Kategorie=“ & intQSKategorie & “ ORDER BY Vyrobce“) ‚z tabulky Produkty vyber všechny záznamy pro aktuální kategorii If not objData.EOF Then ‚když kategorie obsahuje nějaké produkty … Response.Write(„<table width=““90%““><tr><td width=““120″“><b>Výrobce</b></td><td><b> Název</b></td></tr>“) ‚zapiš hlavičku tabulky Do while not objData.EOF ‚pro každý produkt … Response.Write(„<tr><td>“ & objData(„Vyrobce“) & „</td>“) Response.Write(„<td><a href=““detail.asp?produkt=“ & objData(„ID“) & „““>“ & objData(„Nazev“) & „</a></td></tr>“) ‚přidej řádek tabulky s výrobcem a názvem zboží s odkazem na jeho detail objData.MoveNext ‚přesun na další záznam loop ‚další produkt … Response.Write(„</table>“) ‚zapiš zápatí tabulky Else Response.Write(„<b>Kategorie neobsahuje žádný produkt, zkuste podkategorie!</b>“) ‚když neexistuje žádný produkt, zapiš varování End If objData.Close set objData = nothing ‚zavři objekt se záznamy OdpojDatabazi ‚ukončí spojení s databází %> |
|
Ceník (cenik.asp)
Další stránkou, kterou v rámci elektronického katalogu vytvoříme, bude stránka cenik.asp. Tato stránka bude obsahovat seznam všech produktů s odkazy na jednotlivé katalogové listy. Na začátek stránky musíme opět vložit soubor connect.asp, a to příkazem:
<!– #include file=“includes/connect.asp“ –> |
|
Nyní zbývá do stránky vložit kód podobný tomu předchozímu. Musíme jen vymazat z dotazu SQL příkaz WHERE, který omezuje výběr produktů z databáze pouze na určité položky, a přidat informaci o ceně. Upravený kód vypadá takto:
<% Dim objData, intCena ‚deklarace proměnných PripojDatabazi ‚připojení k databázi Set objData = objDatabaze.Execute(„SELECT ID, Nazev, Vyrobce, Cena, DPH, Sleva FROM Produkty ORDER BY Vyrobce“) ‚z tabulky Produkty vyber všechny záznamy If not objData.EOF Then ‚když existují nějaké produkty … Response.Write(„<table width=““90%““><tr><td width=““120″“><b>Výrobce</b></td><td><b> Název</b></td></tr>“) ‚zapiš hlavičku tabulky Do while not objData.EOF ‚pro každý produkt … Response.Write(„<tr><td>“ & objData(„Vyrobce“) & „</td>“) Response.Write(„<td><a href=““detail.asp?produkt=“ & objData(„ID“) & „““>“ & objData(„Nazev“) & „</a></td>“) intCena = Round(objData(„Cena“) * ((objData(„DPH“) + 100) / 100) * (1 – (objData(„Sleva“) / 100)), 1) ‚vypočítej koncovou cenu Response.Write(„<td>“ & intCena & “ Kč</td></tr>“) ‚přidej řádek tabulky s výrobcem a názvem zboží s odkazem na jeho detail objData.MoveNext ‚posuň se na další produkt loop ‚další produkt … Response.Write(„</table>“) ‚zapiš zápatí tabulky Else Response.Write(„<b>V e-shopu není žádný produkt!</b>“) ‚když neexistuje žádný produkt, zapiš varování End If objData.Close set objData = nothing ‚zavři objekt se záznamy OdpojDatabazi ‚ukončí spojení s databází %> |
|
Detail produktu (detail.asp)
Pouhý seznam produktů s cenami zákazníkovi většinou nestačí. Pro elektronické obchodování je důležité, aby u každého produktu byly detailní informace jako popis, barva, technické parametry a podobně. Stránka, obsahující tato data, se bude jmenovat detail.asp. Pomocí adresy URL předáme proměnnou produkt
, která obsahuje identifikační číslo produktu z databáze.
Na začátek souboru přidáme opět příkaz pro vložení souboru connect.asp:
<!– #include file=“includes/connect.asp“ –> |
|
ASP kód stránky:
<% Dim intProdukt, objData, intCena ‚deklarace proměnných PripojDatabazi ‚připojení k databázi intProdukt = Request.QueryString(„produkt“) ‚získání proměnné produkt z adresy URL If not intProdukt > 0 Then ‚v případě, že je proměnná produkt prázdná… Response.Redirect(„katalog.asp“) ‚přesměruj do katalogu End If Set objData = objDatabaze.Execute(„SELECT * FROM Produkty WHERE ID=“ & intProdukt) ‚z tabulky produkty vyber produkty If not objData.EOF Then ‚jestliže produkt existuje … Response.Write(„<table width=““90%““ border=““1″“>“) ‚zapiš do tabulky… Response.Write(„<tr><td>ID</td><td>“ & objData(„ID“) & „</td></tr>“) Response.Write(„<tr><td>Výrobce</td><td>“ & objData(„Vyrobce“) & „</td></tr>“) Response.Write(„<tr><td>Název</td><td>“ & objData(„Nazev“) & „</td></tr>“) Response.Write(„<tr><td>Popis</td><td>“ & objData(„Popis“) & „</td></tr>“) Response.Write(„<tr><td>Cena</td><td>“ & objData(„Cena“) & „</td></tr>“) Response.Write(„<tr><td>DPH</td><td>“ & objData(„DPH“) & „</td></tr>“) Response.Write(„<tr><td>Sleva</td><td>“ & objData(„Sleva“) & „</td></tr>“) intCena = Round(objData(„Cena“) * ((objData(„DPH“) + 100) / 100) * (1 – (objData(„Sleva“) / 100)), 1) ‚vypočítej koncovou cenu Response.Write(„<tr><td>Koncová cena</td><td>“ & intCena & “ Kč</td></tr>“) Response.Write(„<tr><td><a href=““katalog.asp?kategorie=“ & objData(„Kategorie“) & „““>Zpět do katalogu</a></td>“) Response.Write(„<td>“) If objData(„Prodavat“) = true Then Response.Write(„<a href=““kosik.asp?akce=pridej&produkt=“ & objData(„ID“) & „““>Vložit do košíku</a>“) Else Response.Write(“ „) End If Response.Write(„</td></tr>“) ‚vlož odkazy pro vložení do košíku a vrácení do katalogu Response.Write(„</table>“) Else ‚když produkt neexistuje Response.Redirect(„katalog.asp“) ‚přesměruj do katalogu End If objData.Close set objData = nothing ‚zavři objekt se záznamy OdpojDatabazi ‚ukončí spojení s databází %> |
|
Vyhledávání (hledej.asp)
Důležitou součástí každého katalogu je i vyhledávací stránka. V katalogu, čítajícím několik set až tisíc různých produktů, se těžce orientuje jen podle kategorií. Někdy také uživatel neví přesně, co by chtěl. Vyhledávací systém se skládá ze dvou částí, a sice z vyhledávacího formuláře, který můžete umístit na libovolnou stránku, a vyhledávací stránky hledej.asp.
Vyhledávací formulář bude vypadat takto:
<form action=“hledej.asp“ method=“POST“> Hledat: <input type=“text“ name=“vyraz“ /> <input type=“submit“ name=“hledej“ value=“Vyhledat“ /> </form> |
|
Vyhledávací stránka nejdříve načte z formuláře hledaný řetězec a poté prochází jednotlivé záznamy a hledá v nich. Na začátek stránky musíme opět vložit soubor connect.asp:
<% Dim objData, strHledej, strSeznam, intPocet ‚deklarace proměnných PripojDatabazi ‚připojení k databázi strHledej = Request.Form(„vyraz“) ‚získání hledaného řetězce z formuláře intPocet = 0 ‚počet nalezení Set objData = objDatabaze.Execute(„SELECT ID, Nazev, Vyrobce, Popis FROM Produkty“) ‚vyber všechny produkty z databáze do while not objData.EOF ‚pro každý produkt … If strHledej = „“ or InStr(UCase(objData(„Vyrobce“)), UCase(strHledej)) > 0 or InStr(UCase(objData(„Nazev“)), UCase(strHledej)) > 0 or InStr(UCase(objData(„Popis“)), UCase(strHledej)) > 0 Then ‚je hledaný řetězec v poli: Výrobce, Název, Popis … strSeznam = strSeznam & „<a href=““detail.asp?produkt=“ & objData(„ID“) & „““>“ & objData(„Nazev“) & “ (“ & objData(„Vyrobce“) & „)</a><br />“ ‚zapiš do seznamu nalezených produktů intPocet = intPocet + 1 ‚zvyš počet nalezení o 1 End If objData.MoveNext ‚posuň se na další produkt loop objData.Close set objData = nothing ‚zavři objekt se záznamy If intPocet > 0 Then ‚v případě, že počet výskytů je větší než 0 Response.Write(„<p><b>Hledaný řetězec „““ & strHledej & „““ byl nalezen “ & intPocet & „-krát:</b><br />“) Response.Write(strSeznam) Response.Write(„</p>“) ‚vypiš seznam Else ‚jinak Response.Write(„<p><b>Hledaný řetězec „““ & strHledej & „““ nebyl nalezen!</p>“) ‚vypiš „chybu“ End If OdpojDatabazi ‚ukončí spojení s databází %> |
|
Vyhledávací systém by se také dal řešit funkcemi pro SQL Server, což by bylo celkově rychlejší, ale nepoužitelné pro databáze Access (Access není celkově vhodný pro aplikaci elektronického obchodu).
Na závěr si ještě můžete stáhnout dnešní zdrojové kódy a ukázku hotového katalogu (využívá databázi Access).