Delphi - Internet áruház készítése Delphi-vel

Internet áruház 10. rész

forráskód letöltése
Internet áruházunk e heti részénél elkészülünk azokkal az alapvető funkciókkal, melyek lehetővé teszik, hogy most már ténylegesen leadható legyen egy-egy megrendelés web lapjainkon keresztül. A rendelt termékek bekerülnek egy új adatbázisba, ahonnan a későbbiek folyamán további feldolgozásra kerülnek majd. A mellékelt példaprogram megnyitása előtt a következő teendőket kell elvégezni, hogy a program működőképes legyen:
  • A HTMLProducer.pas-ban lévő komponenst telepítenie kell a Delphi alá. (Ezt a komponenst a cikksorozat 6. részénél hoztuk létre, forráskódja az ottani példánál található!)
  • Kérjük, hozza létre az ASWEBSHOP10 alias-t. Ez mutasson a mellékelt példaprogram Data könyvtárára, az adatbázis elérés végett.
  • A lefordított WS10.EXE-t helyezze a web szerver scripts könyvtárába, ahonnan az futtatható.
  • A mellékelt HTM könyvtár tartalmát pedig helyezze el a web szerveren úgy, hogy az egy böngészőn keresztül elérhető legyen. Például másolja a C:\Inetpub\wwwroot\webshop\10\ könyvtárba. Ekkor a böngészőben a www.animare.hu/webshop/10/ cím beírásakor meg kell hogy jelenjen a kezdő oldal. Persze a web szerver neve mindenkinél más és más lesz. A mellékelt példában a webshop\10\ könyvtárra több hivatkozás is van az egyes web lapokon, így kérjük ettől Ön se térjen el.

A jelenlegi cikk elolvasása előtt javasoljuk a sorozat előző részeinek megismerését, mivel a mostani ismeretek csupán kiegészítői az előzőeknek, így azok ismerete nélkül e konkrét cikk tartalma sem érthető meg teljes egészében.


A múlt héten létrehozott sales.htm web lapunkat kissé módosítanunk kell, hogy működőképes legyen.

A web lapon lévő adatbeviteli mezőknél megadjuk, hogy melyik akció kezelje le programunkban a megrendelést. Ez az AddSales nevű lesz.
<form action="/scripts/ws10.exe/addsales" method=get>

Szükséges továbbá egy felsorolás is, mely rejtett (hidden) mezőkben megadja, hogy mely termékeket választotta ki a felhasználó és azokból hány darabot.
Ezt igen egyszerűen megoldhatjuk, mivel programunkban már megvalósítottuk ezt a funkciót, így itt most csak hivatkoznunk kell rá. Ehhez beszúrjuk a web lapba a <#boxlink> címkét. A THTMLProducer komponens ezt kicseréli a szükséges adatokra, így ezzel több gondunk nincs is.


Nézzük most mi is történik akkor, ha a felhasználó elküldi részünkre a megrendelő lapot és ezzel aktivizálja az AddSales akciót. A WebModule-ban ez lesz a harmadik akció, amit létre kell hoznunk. A hozzátartozó OnAction eseménynél pedig az alábbi kód válik szükségessé:
  try
    if AddSales then begin
      Response.Content:=HTMLProducer1.Content
            (FHTMDir+'salesok.htm');
    end else begin
      Response.Content:=HTMLProducer1.Content
            (FHTMDir+'saleserr.htm');
    end;
  except
    on e: exception do Response.Content:=e.message;
  end;
Itt meghívjuk az AddSales privát függvényünket, mely igaz értéket ad vissza, ha a megrendelés rendben volt és az tárolásra került. Ekkor egy salesok.htm állományt küldünk vissza a felhasználónak, melyben jelezhetjük felé, hogy rendelését megkaptuk. Ha az AddSales hamis értéket adott vissza, akkor valami hiba történt, ekkor egy másik web lapot kell küldenünk a felhasználónak, melyben tájékoztatjuk a hiba okáról. Ez lesz a saleserr.htm.

Nézzük most mit is tesz az AddSales függvény. Működése több részre bontható. Első lépésként ellenőrzi, hogy minden szükséges mező ki lett-e töltve a megrendelő lapon. Ha igen, akkor tárolja a megrendelés adatait.

Itt most tennünk kell egy kis kitérőt: a megrendelés adatainak tárolásához gyorsan létre kell hoznunk két újabb dbase táblát. Az egyik lesz a sales.dbf. Itt tároljuk el a megrendelés alapadatait (rendelő neve, címe, rendelés ideje, stb.). A másik tábla a salesit.dbf, ahová a rendelés tételei kerülnek, vagyis rekordonként egy-egy termék és a hozzá tartozó adatok (mennyiség, ár, stb.). A két tábla master-detail kapcsolatban van egymással. Ennek megvalósításához egy ID nevű, egyedi értéket tartalmazó mezőt is létrehozunk a sales.dbf-be, valamint egy MASTERID nevűt a salesit.dbf-be.

Térjünk vissza most az AddSales függvényre.

Ellenőrzéskor a kötelezően kitöltendő mezőket egyesével ellenőrizzük, hogy meg lettek-e adva. Ha nem, akkor egy TStringList típusú FErrorList nevű globális változóhoz hozzáadunk egy-egy hibaüzenetet. Ezt majd a későbbiek folyamán fogjuk a felhasználónak küldendő web lapra kiírni.

Ha az ellenőrzés lezajlott és nincs hiba, akkor történhet meg a rendelés tárolása. Ehhez először is generálunk egy egyedi azonosítót a sales.dbf ID mezőjéhez. Ehhez a config.dbf SALESID mezőjét használjuk fel, ahol mindig a legutóbbi rendelés sorszámát tároljuk.

Ha adott az ID értéke, akkor felveszünk a sales.dbf-be egy új rekordot és értelemszerűen kitöltjük a mezőket.

Ezután következik a rendelt termékek tárolása a salesit.dbf-be. Ehhez egy ciklusra lesz szükségünk, mivel nem tudhatjuk előre, hogy hány különböző termék kerül megrendelésre egy időben.

A ciklusban vizsgáljuk az összes kapott paramétert. A termékeket úgy kódoltuk (<#boxlink> címke), hogy a P2=4 azt jelenti, hogy a product.dbf-ben tárolt termékek közül a 2-es azonosítóval rendelkező termékből 4 darabot rendelt a vevő. Ezek alapján megtörténik a termékek egyesével történő tárolása is.
function TWebModule1.AddSales: boolean;
var
  i: integer;
  product, pcount: string;
begin
   result:=false;
   FErrorList.Clear;
   with Request.QueryFields do begin
    if Values['email']='' then begin
      FErrorList.Add('Nem adta meg az e-mail címét!');
    end;
    if Values['name']='' then begin
      FErrorList.Add('Nem adta meg a nevét!');
    end;
    if Values['irsz']='' then begin
      FErrorList.Add('Nem adta meg a települése irányítószámát!');
    end;
    if Values['city']='' then begin
      FErrorList.Add('Nem adta meg a települése nevét!');
    end;
    if Values['street']='' then begin
      FErrorList.Add('Nem adta meg az utca, házszám adatokat!');
    end;
    if FErrorList.Count=0 then begin

      tConfig.Open;
      tConfig.Edit;
      tConfigSALESID.Value:=tConfigSALESID.Value+1;
      tConfig.Post;
      i:=tConfigSALESID.AsInteger;
      tConfig.Close;

      tSales.Open;
      tSalesItem.Open;
      tProduct.Open;

      tSales.Append;
      tSalesID.Value:=i;
      tSalesSALESDATE.Value:=Now;
      tSalesSALESTIME.Value:=FormatDateTime('hh:nn:ss', Now);
      tSalesEMAIL.Value:=Values['email'];
      tSalesNAME.Value:=Values['name'];
      tSalesIRSZ.Value:=Values['irsz'];
      tSalesCITY.Value:=Values['city'];
      tSalesSTREET.Value:=Values['street'];
      tSalesCOMPANY.Value:=Values['company'];
      tSalesCIRSZ.Value:=Values['cirsz'];
      tSalesCCITY.Value:=Values['ccity'];
      tSalesCSTREET.Value:=Values['cstreet'];
      tSales.Post;

      for i:=0 to Count-1 do begin
        if Names[i][1]='p' then begin
          product:=Names[i];
          pcount:=Values[Names[i]];
          System.Delete(product, 1, 1);

          tSalesItem.Append;
          tSalesItemPRODUCTID.AsString:=product;
          tSalesItemCOUNT.AsString:=pcount;

          if tProduct.Locate('ID', StrToInt(product), []) then begin
            tSalesItemPRICE.Value:=tProductPRICE.Value;
            tSalesItemTAX.Value:=tProductTAX.Value;
          end;
          tSalesItem.Post;
        end;
      end;

      tProduct.Close;
      tSalesItem.Close;
      tSales.Close;

      result:=true;
    end;
  end;
end;
Még egy apróság van vissza, ami nem más, mint a hibakezelés. Amikor a saleserr.htm kerül feldolgozásra a THTMLProducer komponens által, akkor itt találni fog egy <#errorlist> címkét. Ekkor nincs más teendőnk, mint az FErrorList globális változóban felsorolt hibaüzeneteket egymás után kilistázva, behelyettesítenünk a címke helyére.
procedure TWebModule1.HTMLProducer1CustomHTMLTag
   (Index: Integer; TagParams: TStrings; var ReplaceText: String);
var
  i: integer;
begin
  case Index of
...
    16: begin//errorlist
      ReplaceText:='<ul>';
      for i:=0 to FErrorList.Count-1 do begin
        ReplaceText:=ReplaceText+'<li>'+FErrorList[i];
      end;
      ReplaceText:=ReplaceText+'</ul>';
    end;
  end;
end;


Internet áruház cikksorozat