/** * Toteuttaa koosteen kahden peräkkäisen elementin järjestyksen vaihdon. * Kyseisten elementtien jarjestysluku-muuttujien arvot vaihdetaan keskenään. * Näyttää lopuksi koosteen normaalinäkymän. * * @param Palaute $palauteolio */ public function toteuta_vaihda_elem_jarjestus(&$palauteolio) { $ilm = ""; // Haetaan kyseiset vaihdettavat elementit: $nyk_id = $this->get_parametriolio()->elementti_id; $alemman_id = $this->get_parametriolio()->kooste_seur_elem_id; $ylemman_id = $this->get_parametriolio()->kooste_ed_elem_id; $nyk_elem = new Elementti($nyk_id, $this->get_tietokantaolio()); // Nykyinen vaihdetaan joko ylä- tai alapuolella olevan kanssa: if ($alemman_id != Elementti::$MUUTTUJAA_EI_MAARITELTY) { $elem_toka = new Elementti($alemman_id, $this->get_tietokantaolio()); } else { $elem_toka = new Elementti($ylemman_id, $this->get_tietokantaolio()); } if ($nyk_elem->olio_loytyi_tietokannasta && $elem_toka->olio_loytyi_tietokannasta) { $nyk_jarjluku = $nyk_elem->get_arvo(Elementti::$sarakenimi_jarjestysluku); $tokan_jarjluku = $elem_toka->get_arvo(Elementti::$sarakenimi_jarjestysluku); // Vaihdetaan. Tässä pitää vähän temppuilla, koska tietokanta ei // salli kahta samaa jarjestyslukua missään vaiheessa. Siksi // vaihdetaan ensin yhden arvo sellaiseen, mitä ei pitäisi olla // millään elementillä (-1). $temp_val = -1; $nyk_elem->set_arvo($temp_val, Elementti::$sarakenimi_jarjestysluku); $tallennus = $nyk_elem->tallenna_muutokset(); if ($tallennus === Elementti::$OPERAATIO_ONNISTUI) { $elem_toka->set_arvo($nyk_jarjluku, Elementti::$sarakenimi_jarjestysluku); $nyk_elem->set_arvo($tokan_jarjluku, Elementti::$sarakenimi_jarjestysluku); // Ja oikeassa järjestyksessä: $tallennus1 = $elem_toka->tallenna_muutokset(); $tallennus2 = $nyk_elem->tallenna_muutokset(); // Jos tallennus ok: if ($tallennus1 === Elementti::$OPERAATIO_ONNISTUI && $tallennus2 === Elementti::$OPERAATIO_ONNISTUI) { $ilm = Tekstit::$kooste_ilm_elemjarjmuutos_ok; } else { $ilm = Tekstit::$kooste_virheilm_elemjarjmuutos_eiok . "<br/>" . $nyk_elem->tulosta_virheilmoitukset() . "<br/>" . $elem_toka->tulosta_virheilmoitukset(); } } else { $ilm = Tekstit::$kooste_virheilm_elemjarjmuutos_eiok . "<br/>" . $nyk_elem->tulosta_virheilmoitukset(); } } else { // Elementtiä tai toista ei löytynyt: $ilm = Tekstit::$kooste_virheilm_elementti_ei_kunnollinen; } $this->toteuta_nayta($palauteolio); $palauteolio->set_ilmoitus($ilm); }
/** * 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; }