예제 #1
0
 /**
  * Tallentaa arvot tietokantaan eli muuttaa jo olemassaolevaa tietokantariviä.
  * Se, onko arvoja muutettu, tarkistetaan ensin, eikä tallennukseen mennä,
  * ellei vähintään yhtä arvoa ole muutettu (id:tä ei lasketa). Samalla 
  * tarkistetaan myös, että olio ylipäätään on tietokannassa.
  * 
  * Virhetilanteessa lähetetään ilmoituksiin kuvaus, joka on suoraan
  * näytettävissä käyttäjälle.
  * 
  * Palauttaa onnistumisen
  * mukaan joko ::$OPERAATIO_ONNISTUI tai ::$VIRHE. Viimeksi
  * mainitussa tapauksessa kannattaa tarkistaa tarkemmat kommentit olion
  * virheilmoituksista.
  * 
  * @return type 
  */
 public function tallenna_muutokset()
 {
     $palaute = Malliluokkapohja::$VIRHE;
     $max_muutosrivilkm = 1;
     // Luodaan uusi, koska id:llä voi periaatteessa olla muutettu arvo!
     $tietokantasoluehto = new Tietokantasolu(Malliluokkapohja::$SARAKENIMI_ID, Tietokantasolu::$mj_tyhja_EI_ok);
     // Otetaan varmasti oikea id mukaan:
     $tietokantasoluehto->set_arvo_kevyt($this->id_tietokanta);
     if ($tietokantasoluehto instanceof Tietokantasolu) {
         // Haetaan vertailuolio (Tietokantarivi) tietokannasta, johon
         // tämän olion tietokantarivin arvoja voidaan
         // verrata ja muutokset huomata. Huomaa, että seuraava toimii vain,
         // ellei alkuperäinen id ole muuttunut! Siksi erillinen muuttuja
         // "id_tietokanta", jota ei voi muuttaa!
         $on_muutoksia = false;
         $alkup_tietokantarivi = $this->hae_tietokantarivi_tietokannasta($this->id_tietokanta);
         $arvot_kunnossa = true;
         // Vain true päästää tallentamaan.
         // Ellei tietoja löydy tai niitä ei ole muokattu (id:tä ei lasketa),
         // tai jos muokattu on ei-määritelty,
         // ei yritetä tallentaa, vaan heitetään virheilmoitus.
         if ($alkup_tietokantarivi instanceof Tietokantarivi) {
             foreach ($alkup_tietokantarivi->get_tietokantasolut() as $solu) {
                 if ($solu instanceof Tietokantasolu && $solu->get_sarakenimi() != Malliluokkapohja::$SARAKENIMI_ID) {
                     // Haetaan tietokantasolu, jota on voitu muokata:
                     $mahd_muokattu_solu = $this->get_tietokantasolu($solu->get_sarakenimi());
                     // Jos havaitaan kunnollinen muokkaus, palautetaan true.
                     if ($mahd_muokattu_solu->tiedot_ok() && $solu->get_arvo() != $mahd_muokattu_solu->get_arvo()) {
                         $on_muutoksia = true;
                         $mahd_muokattu_solu->set_on_muokattu(true);
                     } else {
                         if (!$mahd_muokattu_solu->tiedot_ok()) {
                             // Arvo saa olla määrittelemätön, muttei väärä!
                             if ($mahd_muokattu_solu->get_arvo() == Pohja::$ARVO_VAARANTYYPPINEN) {
                                 $arvot_kunnossa = false;
                                 $this->lisaa_virheilmoitus($mahd_muokattu_solu->get_sarakenimi() . Perustustekstit::$muuttujan_arvo_vaarantyyppinen);
                                 // Tyhjä silloin kun ei sallittu:
                             } else {
                                 if ($mahd_muokattu_solu->get_arvo() == Pohja::$ARVO_TYHJA) {
                                     $arvot_kunnossa = false;
                                     $this->lisaa_virheilmoitus($mahd_muokattu_solu->get_sarakenimi() . Perustustekstit::$muuttujan_arvo_tyhja);
                                 }
                             }
                         } else {
                             // Arvoa ei muutettu, eli ei tarvitse sitä tallentaa.
                             $mahd_muokattu_solu->set_on_muokattu(false);
                         }
                     }
                 }
             }
             if ($on_muutoksia && $arvot_kunnossa) {
                 $tallennuspalaute = $this->tietokantaolio->update_rivi($this->tietokantarivi, $tietokantasoluehto, $max_muutosrivilkm);
                 // Jos onnistui:
                 if ($tallennuspalaute === Tietokantaolio::$HAKU_ONNISTUI) {
                     $palaute = Malliluokkapohja::$OPERAATIO_ONNISTUI;
                     // Tämä on tärkeä, jotta olio vastaa todellisuutta:
                     $this->paivita_olion_tiedot_tietokannasta();
                     //========= testausta ==================================
                     $this->lisaa_kommentti($this->tietokantaolio->tulosta_kaikki_ilmoitukset());
                     //========= testausta ==================================
                 } else {
                     $this->lisaa_virheilmoitus(Perustustekstit::$malliluokkapohja_virheilm_muutostallennuksen_tietokantavirhe . " " . $this->tietokantarivi->toString());
                     //echo $this->tietokantaolio->tulosta_virheilmoitukset();
                 }
             } else {
                 if (!$arvot_kunnossa) {
                     $this->lisaa_virheilmoitus(Perustustekstit::$Tietoja_ei_tallennettu);
                 } else {
                     // Käyttäjälle asti tuleva ilmoitus -> käännösmahdollisuus:
                     $this->lisaa_virheilmoitus(Perustustekstit::$ilm_tiedoissa_ei_muutoksia);
                 }
                 // Varmuuden vuoksi palautetaan id:n arvo oikeaksi,
                 // jos joku törppö on yrittänyt muuttaa (muut arvot ovat
                 // vanhoja):
                 $this->set_id($this->get_id_tietokanta());
             }
         } else {
             $this->lisaa_virheilmoitus(Perustustekstit::$ilm_tietoja_ei_tietokannassa);
         }
     } else {
         $this->lisaa_virheilmoitus("Virhe muokkaustallennuksessa: " . "id-tietokantasolua ei löytynyt!");
     }
     return $palaute;
 }