tyyppi = $tyyppi; } // destruktori function __destruct() { $this->tyyppi = NULL; $this->lista_alkiot = NULL; } // metodi palauttaa listan tyypin public function anna_tyyppi() { return $this->tyyppi; } // metodi lisää alkion, jos sitä ei ollut olemassa public function lisaa_alkio($alkio) { if(!$this->onko_olemassa($alkio->anna_arvo())) { array_push($this->lista_alkiot, $alkio); return true; } return false; } // metodi lisää alkion, olemassaoloa ei tarkisteta public function lisaa_alkio_temp($alkio) { if(array_push($this->lista_alkiot, $alkio)) { return true; } else { return false; } } // metodi poistaa alkion taulukosta public function poista_alkio($arvo) { foreach($this->lista_alkiot as $indeksi => $alkio) { if($alkio->anna_arvo() == $arvo) { unset($this->lista_alkiot[$indeksi]); return true; } } return false; } // metodi päivittää parametrina tuodun alkion // myös uusi arvo tuodaan parametrina // paivitys voi olla myös lisäys // tarkistuksia ei tehdä, koska listan ehjyys tarkistetaan erikseen // lisays tehdään silloin, jos paivitettävää alkiota ei löydy public function paivita_alkio($paivitettava,$uusi_arvo) { foreach($this->lista_alkiot as $indeksi => $alkio) { if($alkio->anna_arvo() == $paivitettava) { $this->lista_alkiot[$indeksi]->aseta_arvo($uusi_arvo); return true; } } $uusi_alkio = new lista_alkio($uusi_arvo); return $this->lisaa_alkio_temp($uusi_alkio); } // metodi muuttaa listan tyyppiä public function muuta_tyyppi($uusi_arvo) { $this->tyyppi = $uusi_arvo; } // metodi tarkistaa alkion olemassaolon public function onko_olemassa($alkion_arvo) { foreach($this->lista_alkiot as $alkio) { if($alkio->anna_arvo() == $alkion_arvo) return true; } return false; } // metodi tarkistaa onko lista-alkioiden taulukko ehjä // etsitään siis mahdollisia päällekkäisyyksiä public function tarkista_ehjyys() { $alkuperaiset_arvot = $this->anna_arvot(); // array_unique palauttaa taulukon, josta on poistettu // mahdolliset dublikaattiarvot $temppitaulukko = array_unique($alkuperaiset_arvot); // array_diff_assoc palauttaa taulukon, jossa on parametrina // tuotavien taulukoiden arvot, jotka eroavat toisistaan $muuttunut2 = array_diff_assoc($alkuperaiset_arvot,$temppitaulukko); // lasketaan eroavaisuustaulukon kenttien määrä $muuttunut = count($muuttunut2); // jos löytyi yksikin, niin eroavaisuutta oli, eli taulukko ei ole ehjä if($muuttunut>0) { return false; } else { return true; } } // kahden alkion järjestämisen hoitava metodi // muutetaan kaikki pieniksi kirjaimiksi, niin se ei tuota ongelmia private function jarjesta($a,$b) { if(strtolower($a->anna_arvo()) == strtolower($b->anna_arvo())) { return 0; } return (strtolower($a->anna_arvo()) < strtolower($b->anna_arvo())) ? -1 : 1; } // metodi järjestää listan usort-funktion avulla, // joka osaa käsitellä myös olioita ja jolle saa // antaa oman järjestämismetodin public function jarjesta_lista() { return usort($this->lista_alkiot,array("Lista","jarjesta")); } // metodi palauttaa taulukkona kaikkien lista-alkioiden sisällöt public function anna_arvot() { $arvotaulukko = array(); foreach($this->lista_alkiot as $alkio) { $arvo = $alkio->anna_arvo(); array_push($arvotaulukko,$arvo); } return $arvotaulukko; } // metodi tulostaa listan sisällön public function tulosta_lista() { echo "<$this->tyyppi>\n"; foreach($this->lista_alkiot as $alkio) { $alkio->tulosta(); echo "\n"; } echo "tyyppi>\n"; } } // luokka lista-alkiolle, sisältää lista-alkion sisällön class lista_alkio { // attribuutit private $arvo; // konstruktori function __construct($arvo) { $this->arvo = $arvo; } // destruktori function __destruct() { $this->arvo = NULL; } // palauttaa lista-alkion sisällön public function anna_arvo() { return $this->arvo; } // asettaa lista-alkiolle sisällön public function aseta_arvo($arvo) { $this->arvo = $arvo; } // tulostaa lista-alkion public function tulosta() { echo "
  • ".$this->arvo."
  • "; } } ?> '."\n"; ?> VT4

    Viikkotehtävä 4, taso 5

    Edellisen kierroksen listan tulostaminen\n"; // luodaan uusi olio hidden-kenttien arvojen perusteella $lista = new lista($_REQUEST['h_tyyppi']); foreach($_REQUEST['h_alkio'] as $arvo) { if($arvo!="") { $alkio = new lista_alkio($arvo); $lista->lisaa_alkio($alkio); } } $lista->tulosta_lista(); } ?>

    Listan luominen

    Valitse listan tyyppi

    muuta_tyyppi($_REQUEST['tyyppi']); } // poistot ensin, niin eivät sotke päivityksiä foreach($_REQUEST['alkio'] as $indeksi => $arvo) { $onnistui = false; // jos arvo on tyhjä, mutta vastaava hidden-kenttä ei, tulee tehdä poisto if($arvo=="" && $_REQUEST['h_alkio'][$indeksi]!="") { $onnistui = $lista->poista_alkio($_REQUEST['h_alkio'][$indeksi]); // if(!$onnistui) { echo "

    VIRHE POISTOSSA!

    \n"; } } } // päivitykset tämän jälkeen transaktiotyyppisesti // ensin tehdään klooni oliosta $vanha_tyyppi = $lista->anna_tyyppi(); $vanhat_arvot = $lista->anna_arvot(); $lista_temp = new lista($vanha_tyyppi); foreach($vanhat_arvot as $arvo) { $lista_alkio = new lista_alkio($arvo); $lista_temp->lisaa_alkio_temp($lista_alkio); $lista_alkio = NULL; } // muutokset tehdään kloonille foreach($_REQUEST['alkio'] as $indeksi => $arvo) { $onnistui = false; // jos arvot ovat erit tulee tehdä päivitys // päivitys voi olla myös uuden lisäys, jos alkuperäinen arvo oli tyhjä if($arvo!=$_REQUEST['h_alkio'][$indeksi] && $arvo!="") { $onnistui = $lista_temp->paivita_alkio($_REQUEST['h_alkio'][$indeksi],$arvo); // if(!$onnistui) { echo "

    VIRHE PÄIVITYKSESSÄ!

    \n"; } } } // tarkistetaan löytyykö kloonilistasta päällekkäisyyksiä $ehja = $lista_temp->tarkista_ehjyys(); if($ehja) { // kloonilista ok, joten voidaan laittaa oikea lista osoittamaan kloonilistaan $lista = $lista_temp; } else { // echo "

    VIRHE PÄIVITYKSESSÄ!

    \n"; } // tässä tapauksessa listaa ei löytynyt, mutta löytyy kuitenkin // listan tyyppi, eli sivulla ollaan toista kertaa // tällöin luodaan lista } elseif(isset($_REQUEST['tyyppi'])) { $toka = true; $lista = new lista($_REQUEST['tyyppi']); for($i=1; $i<=count($_REQUEST['alkio']); $i++) { if($_REQUEST['alkio'][$i]!="") { $alkio = new lista_alkio($_REQUEST['alkio'][$i]); $lista->lisaa_alkio($alkio,$i); } } } // tulostetaan listan tyyppi. Jos lista oli olemassa, niin kysytään arvo oliolta echo 'anna_tyyppi() == "ul")) { echo 'checked="checked" '; } echo '/>

    '."\n"; echo '

    '; echo 'anna_tyyppi() == "ol") { echo 'checked="checked" '; } echo '/>

    '."\n"; // hidden-kenttä myös, jos ollaan lomakkeella vähintään toista kertaa if($lahetetty) { echo '

    '."\n"; } ?>

    Anna arvot lista-alkioille

    jarjesta_lista(); $alkiot = $lista->anna_arvot(); // katotaan montako alkiota listassa on $maara = count($alkiot); } // jos alkioita vähintään vakion verran, niin laitetaan yksi ylimääräinen if($maara>=KENTTIEN_MAARA) { $maara = $maara+1; } else { $maara = KENTTIEN_MAARA; } // määrää ei suoraan vakiosta, jotta osataan tarvittaessa tulostaa ylimääräisiä kenttiä for($i=1; $i<$maara+1; $i++) { echo '

    '; echo '

    '."\n"; // ekaa kertaa lukuun ottamatta tulostetaan myös vastaava hidden-kenttä if($lahetetty) { echo '

    '."\n"; } } ?>

    Muutetun listan tulostaminen\n"; } else { echo "

    Ensimmäisen listan tulostaminen

    \n"; } $lista->tulosta_lista(); } ?>