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 '