tuotteet = NULL; } // lisää parametrina tuotavasta taulukosta (tekstitiedoston sisältö) // tuotteet tuotteet-taulukkoon // toinen parametri kertoo onko tuotavassa taulukossa otsikkorivi // lisäykset tehdään vain, jos tuoterivin sisältö on validi public function lisaa_tuotteet($tuotetaulukko,$otsikkorivi) { $i = 0; foreach($tuotetaulukko as $tuoterivi) { if(!$i && $otsikkorivi) { $i++; continue; } if(trim($tuoterivi)!="") { $osat = explode('?',$tuoterivi); $nimi = trim($osat[0]); $hinta = trim($osat[1]); if($nimi!="" && $hinta!="" && is_numeric($hinta) && $hinta>0) { $tuote = new tuote($nimi,$hinta); $this->lisaa_tuote($tuote); } } } } // tekee muutoksia tilattujen tuotteiden määriin // katsoo tarvittavat muutokset $_REQUEST-taulukosta public function tee_muutokset() { foreach($this->tuotteet as $tuote) { if(isset($_REQUEST['lisaa_'.$tuote->id])) { $tuote->lisaa(); } elseif(isset($_REQUEST['poista_'.$tuote->id])) { $tuote->vahenna(); } } } // tulostaa kaikkien tuotteiden rivit verkkokauppaan public function tulosta_rivit() { foreach($this->tuotteet as $tuote) { echo $tuote->tulosta_rivi(); } } // tarkistaa onko textarean syöte tai tiedoston sisältö validi // palauttaa virhetaulukon, joka on tyhjä, jos virheitä ei löydy // käyttää apuna metodia tarkista_rivi, joka // tarkistaa yhden tuoterivin sisällön // toinen parametri kertoo onko syötteessä otsikkorivi public function tarkista_syote($tuoterivit,$otsikkorivi) { $uudet_nimet = array(); $error = array(); $sisaltoa = false; $i = 0; foreach($tuoterivit as $rivi) { if(!$i && $otsikkorivi) { if(trim($rivi)!="Verkkokaupan tuotteet:") { $error[] = "Virheellinen otsikkorivi!"; break; } $i++; continue; } if(trim($rivi)!="") { $sisaltoa = true; break; } } if(!$sisaltoa) { $error[] = 'Syötä vähintään yksi tuote!'; } else { $j = 0; foreach($tuoterivit as $uusi_rivi) { if(!$j && $otsikkorivi) { $j++; continue; } if(trim($uusi_rivi)=="") continue; $virheet = $this->tarkista_rivi(trim($uusi_rivi)); if(count($virheet)<1) { $osat = explode('?',$uusi_rivi); $uudet_nimet[] = trim($osat[0]); } else { foreach($virheet as $virhe) { if(!in_array($virhe,$error)) { $error[] = $virhe; } } } } $temppi = array_unique($uudet_nimet); if(count($temppi)!=count($uudet_nimet)) { $error[] = 'Ei saa olla kahta samaa tuotenimeä!'; } } return $error; } // tarkistaa ladatun tiedoston oikeellisuuden // ei ota kantaa tiedoston sisältöön, vaan kokoon, tyyppiin jne. public function tarkista_tiedosto($tiedosto) { $error = array(); if(!$tiedosto['size']>0) { $error[] = "Tiedostolla ei ollut sisältöä!"; } switch($tiedosto['error']) { case UPLOAD_ERR_OK: break; case UPLOAD_ERR_INI_SIZE: $error[] = "Tiedoston koko ylitti php.inissä määritellyn maksimikoon!"; break; case UPLOAD_ERR_FORM_SIZE: $error[] = "Tiedoston koko ylitti lomakkeella määritellyn maksimikoon!"; break; case UPLOAD_ERR_PARTIAL: $error[] = "Tiedosto siirtyi vain osittain!"; break; case UPLOAD_ERR_NO_FILE: $error[] = "Et valinnut oikeata tiedostoa!"; break; case UPLOAD_ERR_NO_TMP_DIR: $error[] = "Väliaikaiskansio puuttui!"; break; case UPLOAD_ERR_CANT_WRITE: $error[] = "Tiedoston kirjoitus palvelimelle epäonnistui!"; break; default: $error[] = "Tuntematon virhe!"; } if(!count($error)) { if(trim($tiedosto['type'])!="") { if($tiedosto['type']!="text/plain") { $error[] = "Vain tekstitiedostot hyväksytään!"; } } else { $piste = strrpos($tiedosto['tmp_name']); if($piste) { $paate = substr($tiedosto['tmp_name'],$piste); if($paate!="txt") { $error[] = "Virheellinen tiedostopääte!"; } } else { $error[] = "Virheellinen tiedostopääte!"; } } if($tiedosto['size']>10000) { $error[] = "Liian suuri tiedosto!"; } } return $error; } // päivittää oliot textarean sisällön mukaan // ei tee tarkistuksia (ne hoitaa toinen metodi) public function tee_textarean_paivitykset($uudet_arvot) { $uudet_tuotteet = array(); $uudet_nimet = array(); // haetaan sisältö taulukoihin foreach($uudet_arvot as $uusi_arvo) { if(trim($uusi_arvo)!="") { $uudet_tuotteet[] = $uusi_arvo; $palaset = explode('?',$uusi_arvo); if(trim($palaset[0])!="") { $uudet_nimet[] = trim($palaset[0]); } } } // poistot foreach($this->tuotteet as $tuote) { if(!in_array($tuote->nimi,$uudet_nimet)) { $this->poista_tuote($tuote->nimi); } } $nimi = array(); $hinta = array(); // päivitykset ja lisäykset foreach($uudet_tuotteet as $indeksi => $uusi_arvo) { $loytyi = false; $osat = explode('?',$uusi_arvo); $nimi[$indeksi] = trim($osat[0]); $hinta[$indeksi] = trim($osat[1]); foreach($this->tuotteet as $tuote) { if($nimi[$indeksi]==$tuote->nimi) { $loytyi = true; // hinnan muutos if($tuote->hinta != $hinta[$indeksi]) { $tuote->hinta = $hinta[$indeksi]; } break; } } // uuden tuotteen lisäys if(!$loytyi) { $uusi_tuote = new tuote($nimi[$indeksi],$hinta[$indeksi]); $this->lisaa_tuote($uusi_tuote); } } } // järjestää oliotaulukon samaan järjestykseen kuin tekstitiedosto public function jarjesta_tuotteet() { $i = 0; $tuoterivit = file('tiedostot/tuotteet.txt'); $jarjestetyt_tuotteet = array(); $tuotenimet = array(); foreach($tuoterivit as $tuoterivi) { if(!$i) { $i++; continue; } $osat = explode('?',$tuoterivi); if(!in_array(trim($osat[0]),$tuotenimet)) { $tuotenimet[] = trim($osat[0]); foreach($this->tuotteet as $tuote) { if(trim($osat[0])==trim($tuote->nimi)) { $jarjestetyt_tuotteet[] = $tuote; } } } } // muutetaan oliotaulukko osoittamaan järjestettyyn taulukkoon $this->tuotteet = $jarjestetyt_tuotteet; } // tulostaa tilaukset (on painettu tilaa-painiketta) public function tulosta_tilaukset() { foreach($this->tuotteet as $tuote) { if($tuote->maara > 0) { echo htmlentities($tuote->nimi).' '.$tuote->maara.' kpl
'; } } } // kertoo oliko tilauksia public function onko_tilauksia() { foreach($this->tuotteet as $tuote) { if($tuote->maara) return true; } return false; } // lisää tuotteen public function lisaa_tuote($tuote) { if(!$this->onko_olemassa($tuote)) { array_push($this->tuotteet,$tuote); } } // poistaa tuotteen public function poista_tuote($tuote) { foreach($this->tuotteet as $ind => $tuote2) { if($tuote2->nimi==$tuote) { unset($this->tuotteet[$ind]); break; } } } // kertoo onko tietty tuote jo olemassa public function onko_olemassa($tuote) { foreach($this->tuotteet as $tuote2) { if($tuote->nimi==$tuote2->nimi) { return true; } } return false; } // laskee tilattujen tuotteiden yhteishinnan public function laske_hinta() { $summa = 0; foreach($this->tuotteet as $tuote) { $summa += $tuote->hinta*$tuote->maara; } return $summa; } // tarkistaa onko tiedoston yksi rivi (tuotetiedot) validi // palauttaa virheet sisältävän taulukon // taulukko on tyhjä, jos virheitä ei löydy public function tarkista_rivi($rivi) { $error = array(); $osat = explode('?',$rivi); if(count($osat)!=2) { $virhe = 'Väärä syntaksi!'; $error[] = $virhe; } if(trim($osat[0])=="") { $virhe = 'Tyhjä ei kelpaa nimeksi!'; $error[] = $virhe; } if(trim($osat[1])=="") { $virhe = 'Syötä hinta!'; $error[] = $virhe; } elseif(!is_numeric(trim($osat[1]))) { $virhe = 'Syötä hinnaksi numeroita!'; $error[] = $virhe; } elseif(trim($osat[1])<=0) { $virhe = 'Hinta tulee olla positiivinen!'; $error[] = $virhe; } return $error; } } // luokka verkkokaupan tuotteelle class tuote { private $id; private $nimi; private $maara; private $hinta; function __construct($nimi,$hinta) { // seuraava vapaa id otetaan sessioista if(isset($_SESSION['idlaskuri'])) { $this->id = $_SESSION['idlaskuri'] + 1; $_SESSION['idlaskuri']++; } else { $_SESSION['idlaskuri'] = 0; $this->id = 0; } $this->nimi = $nimi; $this->hinta = $hinta; $this->maara = 0; } function __destruct() { $this->id = NULL; $this->nimi = NULL; $this->maara = NULL; $this->hinta = NULL; } public function __set($attribuutti,$arvo) { $this->$attribuutti = $arvo; } public function __get($attribuutti) { return $this->$attribuutti; } public function lisaa() { $this->maara++; } public function vahenna() { if($this->maara) { $this->maara--; } } public function tulosta_rivi() { return ''.htmlentities($this->nimi).''.$this->maara.''. $this->hinta.' €'.$this->maara*$this->hinta. ' €'."\n"; } } ?>