Toteutin hetken mielenjohteesta ostoskoriskriptin ja samalla toisen skriptin, jolla tuotteita voi lisätä ostoskoriin (lähinnä ostoskorin testaamisen vuoksi). Koko ns. "järjestelmä" on siinä mielessä tekstitiedostopohjainen, että kaikki tuotteiden tiedot ovat tekstitiedostossa, josta ne aina tarpeen tullen haetaan... Tein ostoskoriin myös oletusmuotoilut CSS:llä ja ne toimii ainakin Chromessa, Firefoxissa ja Operassa. Tyyliä muokkaamalla saa ostoskorista varsin helposti eri näköisen. Koodia muokkaamalla ostoskorista pitäisi varsin vähällä vaivalla saada MySQL:llä toimivan.
Toivon mukaan tästä on jollekin hyötyä!
lisaa_tuote.php
<?php //Aloitetaan sivun puskurointi ob_start(); //Tulostetaan HTML-sivun alkurakenne echo "<html><head><title>Lisää tuote...</title></head><body>"; //-----------------TUOTTEEN ESITTELY--------------- //Avataan tuotetiedosto, mikä sisältää tiedot kaikista tuotteista $tuotteet = file("tuotteet.txt"); //For-rakenteella käytään tuotetiedoston tuotteet läpi for ($i = 0; $i < count($tuotteet); $i++) { //Pilkotataan tuotteiden tiedot ja asetetaan ne omiin muuttujiin $tieto = explode(":",$tuotteet[$i]); $id = $tieto[0]; $tuote = $tieto[1]; $hinta = $tieto[2]; //Tulostetaan tuotteen tiedot ja "lisää ostoskoriin" linkki echo "<p>Tuote: $tuote <br /> Hinta: $hinta €</p>"; echo '<form action="#" method="POST"><p> <input type="hidden" name="id" value="'.$id.'"> <input type="submit" value="Lisää ostoskoriin!" name="act"></p> </form>'; echo "<hr />"; } //-------------TUOTTEEN LISÄÄMINEN SEKÄ PÄIVITTÄMINEN-------------- //Tarkistetaan, että lisättiinkö tuote ostokoriin if (isset($_POST['act'])) { //Tallennetaan muuttujaan POST-taulukon kautta lähetetty tieto $id = $_POST['id']; /* Tarkistetaan, että onko samaa tuotetta jo aijemmin lisätty ostoskoriin, jotta saadaan selville luodaanko uusi eväste vai päivitetäänkö vanhan evästeen määrä-tieto */ if (!isset($_COOKIE['tuote'.$id])) { //Luodaan uusi eväste setcookie('tuote'.$id,$id.'=1',time() + 60*60*24); } else { /* Luetaan evästetättä, pilkotaan tiedot osiin ja tallennetaan omiin muuttujiin sekä korotetaan tuotteen määrää yhdellä */ $cookie = explode("=",$_COOKIE['tuote'.$id]); $maara = $cookie[1] + 1; //Luodaan uusi eväste päivitetyin tiedoin setcookie('tuote'.$id,$id.'='.$maara,time() + 60*60*24); } //Päivitetään sivu header("Location: http://oma_url.../lisaa_tuote.php"); } //------------------------------------------------------------------------- //Tulostetaan HTML-sivun loppurakenne echo "</body></html>"; //Päätetään sivun puskurointi ob_flush(); ?>
ostoskori.php
<?php //Puskuroidaan tiedostoa ob_start(); //Tulostetaan HTML-sivun alkurakenne sekä asetetaan tyylitiedosto echo "<html><head><title>Ostoskori</title></head><body> <link href='style.css' type='text/css' rel='stylesheet'>"; //---------------------------------OSTOSKORI----------------------------------- //Tulostetaan ostoskorin alkurakenne echo "<div class='palkki'><div class='seloste'>Tuote</div> <div class='seloste'>Määrä</div> <div class='seloste'>Hinta</div></div>"; //Avataan tuotetiedosto (sisältää tiedot kaikista tuotteista) $tuotteet = file("tuotteet.txt"); //Käydään foreach-rakenteella evästeet läpi, jotka sisältävät tuotteen id:n ja määrän foreach($_COOKIE as $tuote) { //Luetaan evästettä pilkkomalla id ja määrä omiin muuttujiin $tiedot = explode("=",$tuote); $id = $tiedot[0]; $maara = $tiedot[1]; //For-rakenteella käydään tuotetiedoston kaikki tuotteet läpi for ($i = 0; $i < count($tuotteet); $i++) { /* Pilkotaan tuotetiedoston tiedot omiin muuttujiin sen lisäksi lasketaan tuotteen määrän mukaan kokonaishinta */ $tiedot = explode(":",$tuotteet[$i]); $tuoteID = $tiedot[0]; $tuote = $tiedot[1]; $hinta = $tiedot[2] * $maara; // Tarkistetaa, että vastaako evästeessä oleva id yhtään tuotteen id:tä, if ($id == $tuoteID) { //Lasketaan kaikkien ostoskorin tuotteiden yhteishinta $yht += $hinta; /* Tulostetaan ostoskorissa näkyvä rivi, jossa lukee tuotteen nimi, määrä, hinta sekä linkki, millä tuotteen voi poistaa */ echo "<div class='tuote_palkki'><div class='tuote'>$tuote</div> <div class='tuote'>$maara kpl</div> <div class='tuote'>$hinta €</div> <div class='tuote'><a href='?tuoteID=$tuoteID&poista=true'>Poista</a></div></div>"; } } } /* Tarkistetaan onko yhtään tuotetta lisätty ostoskoriin (eli tarkastetaan onko yhtään evästettä asetettu) */ If (count($_COOKIE) != 0) { //Jos ehto on tosi tulostetaan palkki, jossa lukee tuotteiden yhteishinta echo "<div id='yhteensa'>Yhteensä: $yht €</div>"; } else { //Muuten: tulostetaan teksti, joka ilmoittaa ostoskorin olevan tyhjä echo "<div id='yhteensa'>Ostoskorisi on tyhjä!</div>"; } //Tulostetaan ostoskorin loppurakenne echo "</div><div class='palkki'></div>"; //---------------------------------TUOTTEEN POISTAMINEN--------------------------------------- //Tarkistetaan onko poista-linkkiä painettu if (isset($_GET['poista']) && $_GET['poista'] == true) { //Vastaanotetaan GET-taulukon kautta lähetetty tuotteen id $poistaID = $_GET['tuoteID']; /* Luetaan edellä vastaanotetun id:n avulla oikeaa evästettä ja pilkotaan sen tiedot omiin muuttujiin */ $tiedot = explode("=",$_COOKIE['tuote'.$poistaID]); $id = $tiedot[0]; $maara = $tiedot[1]; /* Selvitetään onko tuotteita ostoskorissa enemmän kuin yksi, jotta tiedetään poistetaanko koko eväste vai päivitetäänkö määrä-tieto */ if ($maara > 1) { //Vähennetään tuotteen määrää yhdellä ja päiviteen eväste luomalla uusi... $maara--; setcookie('tuote'.$id,$id.'='.$maara,time() + 60*60*24); } else { //Tuotteiden ollessa vain yksi, koko eväste poistetaan setcookie('tuote'.$id,'',time() - 60*60*24); } //Päivitetään ostoskori sivu, jotta saadaan tuotteen poisto samantien näkyviin header("Location: http://oma_url...ostoskori.php"); } //--------------------------------------------------------------------------------------------------------------------- //HTML-sivun loppurakenne echo "</body></html>"; //Päätetään tiedoston puskurointi ob_flush(); ?>
style.css
.palkki { border: 2px solid #000; background-color: #941414; width: 400px; height: 25px; margin-bottom: 5px; } .tuote_palkki { width: 404px; min-height: 25px; margin-bottom: 2px; border-bottom: 1px dotted #000; } #yhteensa { border-bottom: 1px solid #000; margin-bottom: 5px; margin-top: 5px; width: 392px; height: 17px; padding-top: 2px; padding-left: 12px; padding-bottom: 5px; font-family: arial; font-size: 12px; font-weight: bold; } .seloste { width: 100px; float: left; font-family: arial; font-size: 12px; font-weight: bold; text-align: center; text-decoration: underline; padding-top: 5px; color: #fff; } .tuote { width: 100px; float: left; font-family: arial; font-size: 12px; text-align: center; padding-top: 5px; }
tuotteet.txt (oletus tuotteita
1:Tietokone:1155 2:Kännykkä:340 3:TV:1500
Missä FireFoxissa?
Asiaan: Tässä nyt on vähän vanhanaikaisesti sekoitettu koodivinkissä sivun rakenne ja toiminnallisuus, mikä tekee kaupan upottamisesta toisenlaiseen rakenteeseen vaivalloisempaa kuin olisi tarvis.
Firefox on selain
XD Niin selain se on. Hmmm tulikohan joku väärinkäsitys?
Tais tulla... Niin sehän ei ole FireFox vaan Firefox (toisin kuin olin tuonne esittelyyn alunperin kirjoittanut)... :D
mun "tuotteet.txt"-tiedostossa on kymmmenen tuotetta. Seitsemän ensimäistä näkyy oikein, mutta sen jälkeen vaan kolme kohdetta ilman tekstiä. Eli näkyy pelkästään "Lisää ostoskoriin!" painiketta. Missäs kiikastaa?
ihan hyvä, innosti minua kokoamaan oman php verkkokauppaskripan myslillä, rasittava bugi tässä on: välillä tuotteet eivät millään poistu ostoskorista :/
Tosi näppärä ja helppo laittaa toimintaan! Demoa täällä:
http://mechax.dy.fi/osto
Voisin sisällyttää ton johonkin sivuun esikatseltavaksi huvin vuoksi.
Tuossa on vaan pieni bugi; Välillä kun on monta tuotetta ostoskorissa ja poistaa ylimmäisen kaikki kappaleet kokonaan niin lähtee kaikki tuotteet ostoskorista :/.
Ei tässä voi tilata tuotteita. ?????
nerootto kirjoitti:
Ei tässä voi tilata tuotteita. ?????
Jotta ohjelmassa olisi mahdollisuus maksaakkin tuote, vaadittaisiin Visalta (tms?) maksullinen systeemi, jolla maksaminen toimisi.
Tuskin tämmöistä sovellusta kumminkaan käytetään kaupalliseen käyttöön, joten tuotteen tilausmahdollisuus ei ole kannattavaa.
Jotta tuotteen maksaminen onnistuu tarvitaan sopimukset eri pankkien kanssa.
Olen jatkanut tätä koodia aika pitkälle. Ostoskorista lähetetään tiedot send.php:seen, joka lähettää tilauksen vastaanottajalle sekä adminille sähköpostiviestin. Enää yksi ongelma, millaisella koodilla saisi koko ostoskorin tyhjennettyä kerralla? Olisi todella tärkeä..
Koodin rakenne on epäselvä, tiedostoja pitäisi olla useampi ja toimintojen pitäisi olla funktioissa. Omatekoiset tiedostomuodot eivät yleensä ole hyväksi, serialize tai json_encode on parempi. Evästeviritelmä on ruma ja estää koodin järkevän uusiokäytön, kannattaisi käyttää vain yhtä evästettä, johon voi jälleen tallentaa joko serialisoitua dataa tai taulukon (tuote kerrallaan, muodossa kori[id]=maara). GET-pyyntöjen käyttö datan muokkaamiseen ei myöskään ole hyvä. HTML ja logiikka pitäisi pitää erillään, ja kaiken kukkuraksi vinkin HTML ei ole edes validia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.