Esempio n. 1
0
 /**
  * Tallentaa parametrina annetun olio_id:n mukaisen elementin koosteelle, 
  * ellei tällä ole samaa elementtiä (sama olio_id ja olio_tyyppi). 
  * Jos elementti on jo olemassa,
  * ei tee muuta kuin palauttaa ilmoituksen (string).
  * 
  * Tarkistus elementin olemassaolosta tehdään vain, jos toinen parametri
  * on arvoltaan true. Jos kooste on uusi, ei tarkistusta luonnollisesti
  * kannata tehdä.
  * 
  * Asettaa onnistuessaan elementille kaikki olennaiset tiedot, kuten
  * kooste_id:n, järjestysluvun ja näkyvyyden ("koosteissa").
  * 
  * Järjestysluvut tallennetaan uusiksi jokaisella tallennuksella, jotta
  * väliin lisätyt pysyvät oikealla paikallaan.
  * 
  * @param type $olio_id_raaka
  * @param type $tarkista
  * @param type $jluku järjestysluku, joka asetetaan elementille.
  */
 function aseta_jluku_ja_tallenna_elementti_jos_uusi($olio_id_raaka, $tarkista, $jluku)
 {
     $palaute = "";
     $mahd_id = Kooste::$MUUTTUJAA_EI_MAARITELTY;
     $uusi_elem = new Elementti($mahd_id, $this->tietokantaolio);
     $uusi_elem->set_arvo($this->get_id(), Elementti::$sarakenimi_kooste_id);
     // Elementin näkyvyys asetetaan tässä "julkinen". Näkyvyyden merkitystä
     // ei vielä päätetty, eikä sillä vielä ole merkitystä. Viittausolioilla
     // on kuitenkin oma näkyvyytensä, joka ehkä riittää käytännön tarpeisiin.
     // Lähinnä, jos haluaisi piilottaa koosteesta elementin, joka kuitenkin
     // näkyy muualla..
     $uusi_elem->set_arvo(Perusnakyvyys::$JULKINEN, Elementti::$sarakenimi_nakyvyys);
     // Pisteiksi asetetaan nolla:
     $uusi_elem->set_arvo(0, Elementti::$sarakenimi_pisteet);
     // Id pitää parsia ensin esille, jos kyseessä tehtävä:
     // Testattu: php_yleinen/testaus_yleinen/sekalaisia_testeja.php
     if (is_numeric($olio_id_raaka)) {
         $uusi_elem->set_arvo($olio_id_raaka, Elementti::$sarakenimi_olio_id);
         $uusi_elem->set_arvo(Oliotyyppi::$KOKONAISUUS, Elementti::$sarakenimi_oliotyyppi);
     } else {
         if (is_numeric(str_replace("teht_", "", $olio_id_raaka))) {
             // Kysymys tehtävästä
             $lukuarvo = (int) str_replace("teht_", "", $olio_id_raaka);
             $uusi_elem->set_arvo($lukuarvo, Elementti::$sarakenimi_olio_id);
             $uusi_elem->set_arvo(Oliotyyppi::$TEHTAVA, Elementti::$sarakenimi_oliotyyppi);
         } else {
             // Kysymys ratkaisusta
             $lukuarvo = (int) str_replace("ratk_", "", $olio_id_raaka);
             $uusi_elem->set_arvo($lukuarvo, Elementti::$sarakenimi_olio_id);
             $uusi_elem->set_arvo(Oliotyyppi::$RATKAISU, Elementti::$sarakenimi_oliotyyppi);
         }
     }
     // Järjestysluvuissa riittää, että saman koosteen elementeillä ei ole
     // samoja. Samakin kokonaisuus puetaan muissa koosteissa uuteen
     // elementtiin, joten eri koosteiden elementit eivät häiritse toisiaan.
     $uusi_jarjluku = $jluku;
     $uusi_elem->set_arvo($uusi_jarjluku, Elementti::$sarakenimi_jarjestysluku);
     // Tarkistus tehdään vain muokattavaan koosteeseen. Uudessa tallennetaan
     // kaikki.
     if ($tarkista) {
         $hakulause = "SELECT id FROM " . Elementti::$taulunimi . " WHERE " . Elementti::$sarakenimi_kooste_id . "=" . $this->get_id() . " AND " . Elementti::$sarakenimi_olio_id . "=" . $uusi_elem->get_arvo(Elementti::$sarakenimi_olio_id) . " AND " . Elementti::$sarakenimi_oliotyyppi . "=" . $uusi_elem->get_arvo(Elementti::$sarakenimi_oliotyyppi);
         $osumat = $this->tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause);
         // Elementti ei vielä koosteessa:
         if (empty($osumat)) {
             $palaute = $uusi_elem->tallenna_uusi();
             if ($palaute != Kooste::$OPERAATIO_ONNISTUI) {
                 $palaute = Tekstit::$kooste_virheilm_elementtien_tallennus . " " . $uusi_elem->tulosta_virheilmoitukset();
             }
         } else {
             $elem_id = $osumat[0]->id;
             // Haetaan vanha elementti:
             $elem = new Elementti($elem_id, $this->tietokantaolio);
             $elem->set_arvo($jluku, Elementti::$sarakenimi_jarjestysluku);
             $pal = $elem->tallenna_muutokset();
             if ($pal === Elementti::$OPERAATIO_ONNISTUI) {
                 $palaute = Tekstit::$kooste_ilm_elem_jo_koosteessa;
             } else {
                 if ($elem->tulosta_viimeisin_virheilmoitus() === Perustustekstit::$ilm_tiedoissa_ei_muutoksia) {
                     // Kaikki ok, koska usein muutosta ei tarvita.
                     $palaute = Tekstit::$kooste_ilm_elem_jo_koosteessa;
                 } else {
                     $palaute = Tekstit::$kooste_virheilm_elementtien_tallennus . "<br/>" . $elem->tulosta_virheilmoitukset();
                 }
             }
         }
     } else {
         $palaute = $uusi_elem->tallenna_uusi();
         if ($palaute != Kooste::$OPERAATIO_ONNISTUI) {
             $palaute = Tekstit::$kooste_virheilm_elementtien_tallennus . " " . $uusi_elem->tulosta_virheilmoitukset();
         }
     }
     return $palaute;
 }