Delphi - Internet áruház fejlesztése Delphi-vel

Internet áruház 2. rész

forráskód letöltése
Múlt héten megkezdet internetes áruházunkat ezen a héten olyan irányban fejlesztjük tovább, hogy most már képesek legyünk interneten keresztül új termékeket felvenni az áruház "raktárába". A mellékelt példa megnyitása előtt kérjük hozza létre az ASWEBSHOP02 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 WS.EXE-t helyezze a web szerver scripts könyvtárába, ahonnan az futtatható.
A HTM könyvtárban lévő Index.htm állományt pedig helyezze el a web szerveren úgy, hogy az egy böngészőn keresztül elérhető legyen. Például: C:\Inetpub\wwwroot\webshop. Ekkor a böngészőbe a www.animare.hu/webshop/ cím beírásakor meg kell, hogy jelenjen az iménti web lap. Persze a web szerver neve mindenkinél más és más lesz.

Az előkészületek után most nézzük miként is alakul a programunk. A WebModul-ban elhelyeztünk egy-két új komponenst. Például van egy új TTable komponens tConfig névvel, melyhez egy Config.dbf adatbázist kapcsoltunk. Mostani feladatunk az, hogy a múlt héten létrehozott Product.dbf-be felvegyünk új rekordokat. Ha visszaemlékszünk, akkor ennek van egy ID nevű mezője, melybe egyedi számokat kell írnunk, az egyes termékek azonosításához.
Hogy melyik lesz a soron következő azonosító szám, azt majd a Config.dbf-be tároljuk el.
Ennek jelenleg csupán egyetlen mezője lesz PRODUCTID névvel. Mivel az adatbázisnak mindig csak egy rekordja lesz, így mindig az aktuális rekordból és a PRODUCTID mezőből megtudhatjuk a soron következő termék azonosító számát.

Ennek tárolásához felhasználjuk a tProduct TTable komponens OnNewRecord eseményét. Ez akkor jön létre, mikor egy-egy új rekord keletkezik az adatbázisban. Célszerű, hogy ez legyen az a pillanat, amikor az ID mezőnek értéket adunk. Ennek menete a következő. A tConfig adatbázisból vesszük a PRODUCTID mező értékét, eggyel növeljük, majd tároljuk az új értéket. Ezután már csak ki kell olvasni az új értéket és a tProduct ID mezőjének értékül adni.
procedure TWM1.tProductNewRecord(DataSet: TDataSet);
begin
  tConfig.Edit;
  tConfigPRODUCTID.Value:=tConfigPRODUCTID.Value+1;
  tConfig.Post;
  tProductID.Value:=tConfigPRODUCTID.Value;
end;
További újdonság jelenlegi verziónkban, hogy most már mind a két adatbázis egy TDatabase komponenshez kapcsolódik. Erre azért van szükség, mert amikor felveszünk egy új terméket, de valamilyen hiba történik, akkor nemcsak a tProduct adatbázisban kell figyelmen kívül hagyni az új rekord felvételét, de a tConfig módosított PRODUCTID mező értékét is vissza kell állítani. Ehhez majd a TDatabase tranzakció kezelését használjuk fel.

A TDatabase használatához az AliasName property-nél kiválasztjuk az ASWEBSHOP02 aliast. A TransIsolation property-t tiDirtyRead értékre kell választanunk, mivel lokális táblákkal, mint a most használt dbase, csak ebben az üzemmódban megy a TDatabase. Adunk még egy WebShopDatabases nevet is a komponensnek a DatabaseName property-nél. Végül a Connected property-vel megnyitjuk az adatbázis kapcsolatot.

Ezek után a TTable komponensek már nem közvetlenül az alias névhez kapcsolódnak, hanem a TDatabase komponenshez. Ezért mindkét esetben a DatabaseName property-nél az imént megadott WebShopDatabases nevet kell választanunk.

Nézzük most, hogyan is történhet az új rekord hozzáadása.

A nyitólapra elhelyezünk egy másik linket is Új termék névvel. Ehhez a <a href='/scripts/ws.exe/newproduct'> linket rendeljük. Amikor erre kattintunk, akkor is a ws.exe lesz meghívva, de most kapunk egy newproduct paramétert. Ehhez már egy új akciót létre tudunk hozni. A WebModule Actions property-jén kattintva felvehetünk egy új akciót. Itt a PahtInfo property-ben adjuk meg a /newproduct értéket. Ettől kezdve, ha a ws.exe után szerepel a /newproduct, akkor ez az akció fog lefutni, vagyis ennek az OnAction eseménye kerül meghívásra.

Itt nincs más teendőnk, mint egy olyan web lapot visszaadni a böngésző felé, melyben egy HTML alapú adatbeviteli ablakot helyezünk el.

Ehhez először is kell egy web lap. Átmenetileg - mivel most nem a külalak, hanem a működőképesség számít - gyorsan összeállítunk egy HTML beviteli ablakot. Ennek kódját egy TPageProducer komponensben tároljuk a HTMLDoc nevű TStrings típusú property-ében.

A HTML kódban az Ok gombhoz a következőt rendeljük:
<form action="/scripts/ws.exe/addnewproduct" method=get>

Ebből látható, hogy az új rekord hozzáadását is a ws.exe programunk fogja lekezelni, de most már egy addnewproduct paraméterünk is lesz.

Ehhez egy újabb akciót készítünk, melynek OnAction eseményénél elvégezzük a kapott adatok feldolgozását, az új rekord felvitelét a tProduct adatbázisba.

Ehhez a TDatabase komponens segítségével új tranzakciót kezdeményezünk a StartTransaction hívásával. Ezután a szokásos módon létrehozunk egy új rekordot a tProduct-nál. Ekkor az OnNewRecord eseménye lefut és az ID mező máris értéket kap.
A rekord további mezőinek az értékadásánál egy apró kis trükköt használunk fel, melynek köszönhetően nem kell minden egyes mezőt begépelnünk.

A HTML lapról egy-egy adatbeviteli mezőnek az értéke meghatározható a Request.QueryFields.Values['NEV']; hívásával, ahol a NEV a HTML kódban lévő ablakazonosító. Például: ÁFA: <input type=text size=32 maxlength=2 name=tax>
Ebben az esetben a NEV azonosító a TAX szöveg lesz. Ez a szöveg viszont pontosan megegyezik a tProduct adatbázis mezőjének nevével.

Mivel mindenhol a mezőnevet választottuk, így a rekord értékadásnál egy ciklussal végig mehetünk az összes kapott paraméteren és ha találunk neki megfelelő nevű adatbázis mezőt, akkor elvégezzük az adattárolást a ciklusmagba.

A ciklus után jöhet a tranzakció lezárás a TDatabase komponens Commit metódusának hívásával.

Ha esetleg hiba történt volna a feldolgozás közben, mely try..except blokk közé került, akkor visszavonjuk a tranzakció kezdete óta történt változásokat a TDatabase komponens Rollback eljárásnak hívásával és a web lapra egy hibaüzenetet küldünk.
procedure TWM1.WM1WebActionItem3Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  i: integer;
  t: TField;
begin
  WSDatabase.StartTransaction;
  try
    tProduct.Append;
    with Request.QueryFields do begin
      for i:=0 to Count-1 do begin
        t:=tProduct.Fields.FindField(Names[i]);
        if Assigned(t) then begin
          t.AsString:=Values[Names[i]];
        end;
      end;
    end;
    tProduct.Post;
    WSDatabase.Commit;
    Response.Content:='ok';
  except
    on E: Exception do begin
      Response.Content:='Hiba!'+E.Message;
      WSDatabase.Rollback;
    end;
  end;
end;
Ezzel a termék adatbázisba történő új rekord felviteli lehetőség biztosított, a rendszer már működőképes, persze még nem nevezhető web áruháznak, igazából még a rendszer szó is kissé túlzásnak tűnhet e három web lapból álló site-nál.


Ha végiggondoljuk a munka jövőbeli részét, akkor láthatjuk, hogy még számtalan adatbázissal kapcsolatban lesz hasonló teendőnk, mint a mostani termékek adatbázisával. Szükség lesz még a vevők nyilvántartására, a megrendelésekre, számlákra, stb. Belátható könnyedén, hogy teljesen felesleges lenne minden adatbázishoz leprogramozni ugyanazt a kódot, mely a karbantartással, egyéb adminisztrációs feladatok ellátásával kapcsolatban felmerül. Éppen ezért a jövő héten kissé már komolyabbra fordítjuk az eddigi munkánkat és új komponenseket készítünk, melyek segítségével már gyerekjáték lesz tetszőleges adatbázisok karbantartása az interneten keresztül.

Internet áruház cikksorozat