Elektronický obchod v ASP – nákupní košík

14. srpna 2002

Aby si vaši zákaznící mohli vybírat zboží a nakoupit ho ve větším množství, potřebují nákupní košík. nenechte si tedy ujít dnešní pokračování, neboť právě o něj doplníme vytvářený elektronický obchod.

Způsobů, jak lze nákupní košík vytvořit je několik. Lze využít například databázi, proměnné na úrovni Session nebo textové soubory. Náš nákupní košík bude využívat právě proměnné na úrovni Session, respektive dvoudimensionální pole a proměnnou, do které budeme ukládat počet položek.

Konstanty (includes/konstanty.asp)

Pro lepší práci s nákupním košíkem si vytvoříme několik konstant – konstanty, které budou určovat velikost pole (intMaxPocetPolozek a intVlastnosti) a konstanty, které budou sloužit k přístupu k jednotlivým „vlastnostem“. Konstanty budou uloženy do souboru konstanty.asp.

  <%
    const cintVlastnosti = 5
    ‚počet vlastností – 1
    const cintMaxPocetPolozek = 99
    ‚maximální počet položek v košíku – 1
    const cintID = 0
    const cintVyrobce = 1
    const cintNazev = 2
    const cintMnozstvi = 3
    const cintCena = 4
    const cintZobrazit = 5
    ‚konstanty pro přístup k vlastnostem
  %>

Konstanty velikosti pole se musí zadat, protože pole musí být před svým definováním přesně ohraničené, a to kvůli vyhrazení místa v paměti počítače. (Určitými funkcemi VBScritpu lze dosáhnout i „dynamického“ zvětšování nebo zmenšování pole.)

Global.asa

Tento soubor slouží mimo jiné k provedení určitých činností při spuštění aplikace nebo při vytvoření objektu Session a také k provedení činností při ukončování platnosti objektu Session nebo ukončování aplikace. My budeme využívat pouze událost Session_OnStart, kde budeme inicializovat pole nákupního košíku a proměnnou intPocetPolozek. Soubor global.asa bude vypadat takto:

  <SCRIPT Language=“VBScript“ RUNAT=“SERVER“>
  Sub Application_OnStart
  End Sub
  Sub Application_OnEnd
  End Sub
  Sub Session_OnStart
    Dim arrKosik(), intPocetPolozek
    ‚deklarace proměnných
    const cintVlastnosti = 5
    const cintMaxPocetPolozek = 99
    ReDim arrKosik(cintMaxPocetPolozek, cintVlastnosti)
    ‚vytváření pole nákupního košíku
    intPocetPolozek = 0
    ‚nastavení počtu položek v košíku na 0
    Session(„arrKosik“) = arrKosik
    ‚inicializovat proměnnou na úrovni objektu Session
    Session(„intPocetPolozek“) = intPocetPolozek
    ‚ inicializovat proměnnou na úrovni objektu Session
  End Sub
  Sub Session_OnEnd
  End Sub
  </SCRIPT>

Kosik.asp

V souboru kosik.asp bude poměrně rozsáhlý skript, který bude obsluhovat přidávání položek, odebírání položek, změnu množství, rušení objednávky a další. Na začátek souboru nejdříve vložíme soubor connect.asp a poté ještě soubor konstanty.asp.

<!– #include virtual=“includes/connect.asp“ –>
<!– #include virtual=“includes/konstanty.asp“ –>

Dále deklarujeme proměnné, které budeme v rámci skriptu využívat, vytvoříme nákupní košík (objekt Array) a načteme data do proměnných. Nakonec ještě podle proměnné strAkce rozdělíme úkoly.

Případ Akce
pridej zavolá proceduru ProdejPolozku
vymaz zavolá proceduru ZrusPolozku -> Prepocitej
prepocitej zavolá proceduru NactiHodnoty -> Prepocitej
katalog uloží proměnné, přesměruje stránku na katalog.asp
objednat uloží proměnné, přesměruje stránku na objednat.asp
zrusit vymaže obsah košíku, nastaví intPocetPolozek na 0, přesměruje na stránku katalog.asp

Poté následuje uložení proměnných a zobrazení obsahu košíku:

  <%
    Dim intID, strAkce, arrKosik, intPocetPolozek, intI, intJ, intMnoztvi, intCelkem
    ‚deklarace proměnných
    ReDim arrKosik(cintMaxPocetPolozek, cintVlastnosti)
    ‚vytvoření košíku na úrovni stránky (skriptu)
    intID = Request.QueryString(„produkt“)
    ‚načtení čísla produktu, o který se bude jednat (akce přidávání a odebírání, jinak 0)
    strAkce = Request(„akce“)
    ‚ zjištění, jaká akce se má provést
    arrKosik = Session(„arrKosik“)
    ‚naplnění košíku na úrovni skriptu daty z košíku na úrovni Session
    intPocetPolozek = Session(„intPocetPolozek“)
    ‚načtení počtu položek z proměnné na úrovni Session
    select case LCase(strAkce)
    ‚výbět akce
      case „pridej“
        If not intID = „“ Then
          PridejPolozku(intID)
        End If
      case „přidej“
        If not intID = „“ Then
          PridejPolozku(intID)
        End If
      case „vymaz“
        If not intID = „“ Then
          ZrusPolozku(intID)
        End If
      case „vymaž“
        If not intID = „“ Then
          ZrusPolozku(intID)
        End If
      case „prepocitej“
        NactiHodnoty
      case „přepočítat“
        NactiHodnoty
      case „katalog“
        Session(„arrKosik“) = arrKosik
        Session(„intPocetPolozek“) = intPocetPolozek
        ‚ulož hodnoty proměnných
        Response.Redirect(„katalog.asp“)
        ‚přesměruj do katalogu
      case „objednat“
        Session(„arrKosik“) = arrKosik
        Session(„intPocetPolozek“) = intPocetPolozek
        ‚ulož hodnoty proměnných
        Response.Redirect(„objednat.asp“)
        ‚přesměruj na objednávkový list
      case „zrusit“
        For intI = 0 To UBound(arrKosik, 1)
          For intJ = 0 To UBound(arrKosik, 2)
            arrKosik(intI, intJ) = „“
          Next
        Next
        ‚vymaž obsah košíku
        intPocetPolozek = 0
        ‚vynuluj počet položek
        Session(„arrKosik“) = arrKosik
        Session(„intPocetPolozek“) = intPocetPolozek
        ‚ulož hodnoty proměnných
        Response.Redirect(„katalog.asp“)
        ‚přesměruj do katalogu
      case „zrušit“
        For intI = 0 To UBound(arrKosik, 1)
          For intJ = 0 To UBound(arrKosik, 2)
            arrKosik(intI, intJ) = „“
          Next
        Next
        ‚vymaž obsah košíku
        intPocetPolozek = 0
        ‚vynuluj počet položek
        Session(„arrKosik“) = arrKosik
        Session(„intPocetPolozek“) = intPocetPolozek
        ‚ulož hodnoty proměnných
        Response.Redirect(„katalog.asp“)
        ‚přesměruj do katalogu
    end select
    Session(„arrKosik“) = arrKosik
    Session(„intPocetPolozek“) = intPocetPolozek
    ‚ulož hodnoty proměnných
  %>

Dalším krokem je vytvoření čtyř funkcí (procedur) pro manipulaci s daty v košíku: PridejPolozku, ZrusPolozku, Prepocitej, NactiHodnoty.

Procedura PridejPolozku

Funkce, nebo lépe řečeno procedura, PridejPolozku bude přebírat jako parametr ID produktu. Prvním úkolem procedury bude ověřit, zda již není produkt se stejným číslem produktu v košíku. V případě, že produkt v košíku obsažen je, bude pouze k počtu kusů připočtena 1 (aby nebyl přidáván dvakrát).

  <%
    Sub PridejPolozku(intID)
    Dim boolVKosiku, intI, objData, intIndex
    ‚deklarace promenných
    For intI = 0 To intPocetPolozek – 1
    ‚vyhledávání položky se stejným ID v košíku
      If arrKosik(intI, cintID) = intID and arrKosik(intI, cintZobrazit) = true Then
      ‚když se ID shodují
        boolVKosiku = true
        ‚položka v košíku je
        arrKosik(intI, cintMnozstvi) = arrKosik(intI, cintMnozstvi) + 1
        ‚přičti k množství 1
        Exit For
        ‚dál už není nutné hledat
      Else
      ‚jinak
        boolVKosiku = false
        ‚položka v košíku není
      End If
    Next
    If not boolVKosiku Then
    ‚když položka není v košíku
      pripojDatabazi
      ‚připoj databázi (musí být vložen soubor connect.inc)
      Set objData = objDatabaze.Execute(„SELECT vyrobce, nazev, cena, dph, sleva FROM produkty WHERE id=“ & intID)
      ‚vyhledej data v databázi
      If not objData.EOF Then
      ‚pokud existují nějaká data
        intPocetPolozek = intPocetPolozek + 1
        ‚zvětši počet položek
        intIndex = intPocetPolozek – 1
        ‚nastav index pole (pole jsou číslována od 0 => je nutné odečíst 1 od počtu položek)
        arrKosik(intIndex, cintID) = intID
        arrKosik(intIndex, cintVyrobce) = objData(„Vyrobce“)
        arrKosik(intIndex, cintNazev) = objData(„Nazev“)
        arrKosik(intIndex, cintMnozstvi) = 1
        arrKosik(intIndex, cintCena) = Round(objData(„Cena“) * ((objData(„DPH“) + 100) / 100) * (1 – (objData(„Sleva“) / 100)), 1)
        arrKosik(intIndex, cintZobrazit) = true
        ‚zapiš hodnoty do košíku
      End If
      objData.Close
      Set objData = nothing
      ‚zavři objekt data
      odpojDatabazi
      ‚odpoj databázi
    End If
    End Sub
  %>

Procedura ZrusPolozku

Procedura ZrusPolozku má jako vstupní parametr ID výrobku obsazeného v košíku. Nejdříve procedura vyhledá v košíku položku se stejným ID, po nalezení položky změní vlastnost Množství na „0“ a vlastnost Zobrazit na „false“. Nakonec zavolá funkci Prepocitej.

  <%
    Sub ZrusPolozku(intID)
    Dim intI
    ‚deklarace proměnných
    For intI = 0 To intPocetPolozek – 1
    ‚vyhledej v košíku položku se stejným ID
      If arrKosik(intI, cintID) = intID Then
        arrKosik(intI, cintMnozstvi) = 0
        arrKosik(intI, cintZobrazit) = false
        ‚nastav hodnotu Mnozstvi na 0 a Zobrazit na false.
        Exit For
        ‚dál není potřeba hledat
      End If
    Next
    Prepocitej
    ‚přepočítej obsah nákupního košíku
    End Sub
  %>

Procedura NactiHodnoty

Procedura NactiHodnoty slouží k načítání údajů o množství jednotlivých produktů v nákupním košíku z formuláře. Nejdříve ověří, jestli byl formulář odeslán, poté načte jednotlivé hodnoty polí pocetn (kde n je pořadové číslo položky).

  <%
    Sub NactiHodnoty
    Dim intI, intMnozstvi
    If not Request.Form(„formular_odeslan“) = „“ Then
      For intI = 0 To intPocetPolozek – 1
        intMnozstvi = Request.Form(„pocet“ & intI)
        ‚pro každou položku získej hodnotu
        If IsNumeric(intMnozstvi) Then
          arrKosik(intI, cintMnozstvi) = CInt(intMnozstvi)
        Else
          arrKosik(intI, cintMnozstvi) = 1
        End If
        ‚zkonvertuj na číslo
        If arrKosik(intI, cintMnozstvi) = 0 Then
          arrKosik(intI, cintZobrazit) = false
        End If
        ‚je-li hodnota 0, vymaž položku
      Next
    End If
    Prepocitej
    ‚přepočítej obsah nákupního košíku
    End Sub
  %>

Procedura Prepocitej

Procedura Prepocitej vyhledá v nákupním košíku položky, které mají nastavenu vlastnost Zobrazit na „false“. Když narazí na takovou položku, vymaže data z nákupního košíku a položku za ní přesune na její místo.

  <%
    Sub Prepocitej
    Dim intI, intX, intY
    ‚deklarace proměnných
    For intI = 0 To intPocetPolozek – 1
    ‚pro každou položku košíku
      If arrKosik(intI, cintZobrazit) = false Then
      ‚když má být položka vymazána (má nastavenu vlastnost Zobrazit na false)
        For intY = 0 To UBound(arrKosik, 2)
        ‚vymaž všechny vlastnosti položky
          arrKosik(intI, intY) = „“
        Next
        intX = intI
        Do While not intX = UBound(arrKosik, 1)
          For intY = 0 To UBound(arrKosik, 2)
            arrKosik(intX, intY) = arrKosik(intX + 1, intY)
            arrKosik(intX + 1, intY) = „“
          Next
          intX = intX + 1
        Loop
        ‚posuň všechny položky o „jedno místo nahoru“
        intPocetPolozek = intPocetPolozek – 1
        ‚sniž počet položek v košíku
      End If
    Next
    End Sub
  %>

Zobrazení obsahu nákupního košíku

Obsah nákupního košíku bude vypsán do tabulky. K ovládání funkcí nákupního košíku slouží formulářová tlačítka a textová pole určená pro zadávání počtu kusů.

  <form action=“kosik.asp?“ method=“POST“>
    <input type=“hidden“ name=“formular_odeslan“ value=“ano“>
    <table width=“75%“ align=“center“ border=“1″>
    <tr>
      <td width=“20″><b>X</b></td>
      <td><b>Název (Výrobce)</b></td>
      <td width=“80″><b>Cena za kus</b></td>
      <td width=“80″><b>Množství</b></td>
      <td width=“100″><b>Cena za položku</b></td>
    </tr>
  <%
    intCelkem = 0
    If intPocetPolozek > 0 Then
      For intI = 0 To intPocetPolozek – 1
        If arrKosik(intI, cintZobrazit) = true Then
        ‚pro každou položku, je-li viditelná
          Response.Write(„<tr>“)
          Response.Write(„<td><a href=kosik.asp?akce=vymaz&produkt=“ & arrKosik(intI, cintID) &“>X</a></td>“)
          Response.Write(„<td>“ & arrKosik(intI, cintNazev) & “ (“ & arrKosik(intI, cintVyrobce) & „)</td>“)
          Response.Write(„<td>“ & arrKosik(intI, cintCena) & “ Kč / kus</td>“)
          Response.Write(„<td><input type=text name=pocet“ & intI & “ value=“ & arrKosik(intI, cintMnozstvi) & “ ></td>“)
          Response.Write(„<td><b>“ & (arrKosik(intI, cintCena) * arrKosik(intI, cintMnozstvi)) & “ Kč</b></td>“)
          Response.Write(„</tr>“)
          ‚zapiš řádek nákupního košíku
          intCelkem = intCelkem + (arrKosik(intI, cintCena) * arrKosik(intI, cintMnozstvi))
          ‚připočítej k celkové sumě cenu položky
        End If
      Next
      Response.Write(„<tr>“)
      Response.Write(„<td colspan=4>Počet položek:</td>“)
      Response.Write(„<td>“ & intPocetPolozek & „</td>“)
      Response.Write(„</tr>“)
      ‚vypiš počet položek
      Response.Write(„<tr>“)
      Response.Write(„<td colspan=4>Celková cena včetně DPH a slev:</td>“)
      Response.Write(„<td><b>“ & intCelkem & “ Kč</b></td>“)
      Response.Write(„</tr>“)
      ‚vypiš celkovou cenu
    End If
    Response.Write(„<tr>“)
    Response.Write(„<td colspan=5 align=center>“)
    If not cintMaxPocetPolozek = intPocetPolozek Then
      Response.Write(„<input type=submit name=akce value=Katalog>   „)
    End If
    If intPocetPolozek > 0 Then
      Response.Write(„<input type=submit name=akce value=Přepočítat>   „)
      Response.Write(„<input type=submit name=akce value=Zrušit>   „)
      Response.Write(„<input type=submit name=akce value=Objednat>“)
    End If
    Response.Write(„</tr>“)
    ‚zapiš ovládací tlačítka
  %>
    </table>
  </form>

Nakonec si můžete stáhnout zdrojové kódy a ukázku hotového košíku. Příště už budeme pomocí našeho elektronického obchodu objednávat.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek Flier.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *