/** * 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; }