/** * Tyhjentää tietokannasta testihenkilöt ja lisävaltuudet (jotka * poistuvat cascade-ominaisuuden vuoksi testihenkilön mukana tietokannasta). */ public function tee_loppusiivous() { $this->lisaa_kommentti("======================== SIIVOUS ALKAA ======================="); $poisto_lkm = $this->tietokantaolio->poista_kaikki_rivit("henkilot", Henkilo::$sarakenimi_syntymavuosi, Kayttajatestaus::$testi_svuosi); // Poistetaan testikokonaisuus, jonka poisto poistaa siihen liittyvät // tehtävät ja ratkaisut: if ($this->testikokonaisuus instanceof Kokonaisuusolio) { $poisto_kokon = $this->testikokonaisuus->poista(); if ($poisto_kokon == Kokonaisuusolio::$OPERAATIO_ONNISTUI) { $poisto_kokon_lkm = 1; } else { $poisto_kokon_lkm = 0; } } else { $poisto_kokon_lkm = 0; } // Poistetaan testiratkaisut: $poisto_lkm_ratkaisut = $this->tietokantaolio->poista_kaikki_rivit("Ratkaisut", "ratkaisu", Kayttajatestaus::$testi_ratkaisu); if ($poisto_lkm_ratkaisut == 0) { $poisto_kommentti_ratkaisut = ""; // Kaikki kunnossa: } else { $poisto_kommentti_ratkaisut = "Virhe: ratkaisuja poistettu" . $poisto_lkm_ratkaisut . " kpl, vaikka piti poistua itse!"; } // Yritetään vielä poistaa testilisävaltuudet, joita ei pitäisi löytyä: $poisto_lkm_valtuudet = $this->tietokantaolio->poista_kaikki_rivit("Lisavaltuudet", Lisavaltuudet::$sarakenimi_henkilo_id, $this->testihenkilo->get_id()); if ($poisto_lkm_valtuudet == 0) { $this->lisaa_kommentti("Siivous suoritettu onnistuneesti. \n Poistettu " . $poisto_lkm . " henkilöä" . " ja " . $poisto_kokon_lkm . " kokonaisuutta. " . " Lisävaltuudet poistettu automaattisesti. " . $poisto_kommentti_ratkaisut); } else { $this->lisaa_virheilmoitus("Virhe siivouksessa! \n Poistettu " . $poisto_lkm . " henkilöä" . " ja " . $poisto_lkm_ratkaisut . " ratkaisua, mutta " . "myös " . $poisto_lkm_ratkaisut . " lisävaltuutta," . " vaikka niiden pitäisi itsestään poistua!"); } $this->lisaa_kommentti("======================== SIIVOUS TEHTY ========================"); }
/** * Palauttaa html-lomakkeen, jonka avulla voidaan tallentaa uuden * kokonaisuuden tiedot tietokantaan tai muokata vanhoja. Lomakkeen html-id on * 'kokonaisuuslomake'. * * @param <type> $id_kokon * @param <type> $omaid * @param <type> $uusi * @param <type> $ilmoitus_kokon * @param Tietokantaolio $tietokantaolio * @param <type> $oppiaine_kokon * @param <type> $otsikko_kokon * @param <type> $tiivis_kokon * @param <type> $selitys_kokon * @param <type> $taso_kokon * @param <type> $jarjestysnro_kokon * @param <type> $laajennetun_id_kokon * @param <type> $ylakokonaisuuden_id_kokon * @param <type> $kieli_id * @param <type> $toiminnan_name_arvo * @param Kokonaisuuskontrolleri $kokonaisuuskontrolleri Tämä vähän * suurellinen, mutten äkkiä parempaa keinoa keksinyt (15.1.2015) * @param int $kaavakieli viittaa käytettävään matematiikan kaavakieleen * (28.11.2015) * @param Elementti $elementti on Elementti-luokan olio, johon tämä * kokonaisuus kuuluu, tai sitten Elementti::$MUUTTUJAA_EI_MAARITELTY, * ellei tulla koosteesta. * (20.2.2016) * @return <type> */ function nayta_kokonaisuuslomake($id_kokon, $omaid, $uusi, $ilmoitus_kokon, $tietokantaolio, &$oppiaine_kokon, &$otsikko_kokon, &$tiivis_kokon, &$selitys_kokon, &$taso_kokon, &$jarjestysnro_kokon, &$laajennetun_id_kokon, &$ylakokonaisuuden_id_kokon, &$kieli_id, &$nakyvyys_kokon, $toiminnan_name_arvo, $kokonaisuuskontrolleri, $kaavakieli, $elementti, $elemryhma) { $mj = ""; // Lomakkeen html-koodi. $otsikon_maxpituus = 150; $submitnappi = ""; $perunappi = ""; $uusi_kuva_tiivis = ""; $uusi_kuva_seli = ""; $tulo_koosteesta = false; // True, if coming from Kooste (Package). $kokonaisuus = ""; // Tämä haetaan tietokannasta. /*$uusi_kuva_tiivis = ""; $uusi_kuva_seli = "";*/ $submit_kesken_nappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_KESKEN_KOKON_VALUE . "' " . "title='" . Painikkeet::$TALLENNA_KESKEN_KOKON_TITLE . "'/>"; $esikatselunappi = "<button type='button' " . "onclick='nayta_kokonaisuuden_esikatselu(" . $id_kokon . ")'" . "title='" . Painikkeet::$ESIKATSELU_TITLE . "'/>" . Painikkeet::$ESIKATSELU_VALUE . "</button>"; $elementtitiedot = ""; // urliin lisättävät koosteen ja elementin idt if ($uusi) { $submitnappi = "<input type='submit'\n name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_UUSI_KOKON_VALUE . "'/>"; $perunappi = "<input type='submit'\n name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_UUDEN_KOKON_TALLENNUS_VALUE . "'/>"; } else { // Haetaan ajantasalla olevat tiedot tietokannasta. Aiemmin // tiedot tuotiin kiinteästi painikelomakkeeseen, mutta tällöin // tämän jälkeen olioon tehdyt muutokset eivät näkyneet, jos // alkoi tehdä muutoksia olioon. $kokonaisuus = new Kokonaisuusolio($id_kokon, $tietokantaolio); if ($kokonaisuus->olio_loytyi_tietokannasta) { $oppiaine_kokon = $kokonaisuus->getOppiaine(); // Alla ovat tärkeitä, jotta esim. JS-koodi toimii, eikä // ala kehittämään mitään ylimääräistä muokatessa. Huom: // stripslash pilaa latex-koodin, eikä ilm tarpeellinen. $otsikko_kokon = htmlspecialchars($kokonaisuus->getOtsikko(), ENT_QUOTES, "UTF-8", true); $tiivis_kokon = htmlspecialchars($kokonaisuus->getTiivis(), ENT_QUOTES, "UTF-8", true); $selitys_kokon = htmlspecialchars($kokonaisuus->getSelitys(), ENT_QUOTES, "UTF-8", true); /*$otsikko_kokon = stripslashes($kokonaisuus->getOtsikko()); $tiivis_kokon = stripslashes($kokonaisuus->getTiivis()); $selitys_kokon = stripslashes($kokonaisuus->getSelitys());*/ $taso_kokon = $kokonaisuus->getTaso(); $jarjestysnro_kokon = $kokonaisuus->getJarjestysnro(); $laajennetun_id_kokon = $kokonaisuus->getLaajennetun_id(); $ylakokonaisuuden_id_kokon = $kokonaisuus->getYlakokonaisuuden_id(); $nakyvyys_kokon = $kokonaisuus->getNakyvyys(); $submitnappi = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_VALUE . "'" . "title='" . Painikkeet::$TALLENNA_MUOKKAUS_KOKON_TITLE . "'/>"; $perunappi = "<input type='submit'\n name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$PERU_KOKON_MUUTOSTEN_TALLENNUS_VALUE . "'/>"; //============================================================== // Täällä katsotaan, onko käyttäjä tulossa koosteesta ja // mahdollistetaan kätevä paluu takaisin.======================= if ($elementti instanceof Elementti) { $kooste_id = $elementti->get_arvo(Elementti::$sarakenimi_kooste_id); $elem_id = $elementti->get_id(); //$koostenakymat = new Koostenakymat(); //$perunappi = $koostenakymat-> // nayta_inputpainike_paluu_koosteeseen_no_form(); $elementtitiedot = "&" . Koostekontrolleri::$kooste_name_id . "=" . $kooste_id . "&" . Koostekontrolleri::$elementti_name_id . "=" . $elem_id; $tulo_koosteesta = true; } if ($elemryhma instanceof Elementtiryhma) { $elemryhma_id = $elemryhma->get_id(); $elementtitiedot .= "&" . Koostekontrolleri::$elemryhma_name_id . "=" . $elemryhma_id . "&"; $tulo_koosteesta = true; } //========= Kuvan lisäyspainikkeet: paluu vanhaan ideaan =========== /* Uuden kuvan lisäyspainike tiivistelmään*/ $uusi_kuva_tiivis = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_TIIVIS_KOKON_TITLE . "'/>"; /* Uuden kuvan lisäyspainike selitykseen:*/ $uusi_kuva_seli = "<input type='submit'" . "name='{$toiminnan_name_arvo}'" . "value='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_VALUE . "'" . "title='" . Painikkeet::$LISAA_KUVA_MANUAALI_SELITYS_KOKON_TITLE . "'/>"; //================================================================== } else { $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt); return $this->tulosta_virheilmoitukset() . $perunappi; } } // End of päivitetään vanhaa. // NÄkyvyysvalikko: ==================================================== $oletusarvo = $nakyvyys_kokon; $nakyvyydet = new Nakyvyys(); $select_maaritteet = array(Attr::name(Kokonaisuuskontrolleri::$kokon_name_nakyvyys), Attr::title(Tekstit::$nakyvyys_valikko_otsikko_title)); $option_maaritteet = array(); $nakyvyysvalikko = $nakyvyydet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $oletusarvo, Tekstit::$nakyvyys_valikko_otsikko); //====================================================================== // Ilmoitus otetaan mukaan, jos ei tyhjä: if ($ilmoitus_kokon != "") { $ilmoitus_kokon = "<span class='kokonaisuuslomakeilmoitus'>" . $ilmoitus_kokon . "</span><br />"; } $oppiainehtml = Tekstit::$oppiainevalikko_otsikko . ": <b>" . Oppiaineet::hae_oppiaineen_nimi($oppiaine_kokon) . "</b>"; $koulutasohtml = Tekstit::$tasovalikko_otsikko . ": <b>" . Koulutasot::hae_koulutason_nimi($taso_kokon, false) . "</b>"; // Kielivalintavalikko: VALINTA POISTETTU toimintavaikeuksien takia! //$kielivalintahtml = nayta_kielivalikko($kieli_id); $kielivalintahtml = Tekstit::$kielivalikko_otsikko . ": <b>" . Kielet::hae_kielen_nimi($kieli_id) . "</b>"; // Ylempi kokonaisuustaso $ylakokonvalikko = $this->nayta_ylakokonaisuusvalikko($id_kokon, $tietokantaolio, $ylakokonaisuuden_id_kokon, $oppiaine_kokon, $kieli_id, $taso_kokon, $uusi, $omaid, $kokonaisuuskontrolleri); // Tekstinmuokkaus tiivistelmää varten: $muokattavan_elementin_id_tii = "tiivis_tekstiruutu"; $alasvetovalikon_id = "merkit1_tiivis"; $tekstityokaluolio = new Tekstityokalupalkki($muokattavan_elementin_id_tii, $alasvetovalikon_id); // Nykyään nämä toimii sekä tiivistelmälle että selitykselle. // Lomake osaa huomata, kunpaa ollaan muokkaamassa: $tekstimuokkauspainikkeet = $tekstityokaluolio->luo_painikkeet(Tekstityokalupalkki::$PERUSPAINIKKEET_JA_MATEMAATTISET, $kaavakieli); // Tekstinmuokkaus selitystä varten: $muokattavan_elementin_id_sel = "selitys_tekstiruutu"; // Kaavakielivalikko:================================================== $kaavakielet = new Kaavakieli(); $select_maaritteet = array(Attr::onchange("muuta_kaavakieli", array("this.value", Yleiset_arvot::$kaavakieli_name, $muokattavan_elementin_id_tii, $alasvetovalikon_id))); $option_maaritteet = array(); $kaavakielivalikko = $kaavakielet->luo_pudotusvalikko($select_maaritteet, $option_maaritteet, $kaavakieli, Tekstit::$kaavakieli_otsikko); //===================================================================== if ($uusi) { // Ellei id-kokon-arvoa määritellä täällä, tulee sessiomuuttujasta vanha. $id_kokon = Kokonaisuusolio::$kokon_ei_maaritelty; } // Vanha ylakokon_id otetaan talteen, jotta lapsiasiat pysyvät // oikealla tolalla. Haetaan mahdollisimman tuoreet tiedot. $ylakokonaisuuden_id_vanha = $ylakokonaisuuden_id_kokon; if ($kokonaisuus instanceof Kokonaisuusolio) { $ylakokonaisuuden_id_vanha = $kokonaisuus->getYlakokonaisuuden_id(); } /*lisaaTagit(elementin_id, elementin_tunnus, class_arvo, id_arvo*/ // Sitten palat yhteen: $mj = "<form align='left' method='post' id='kokonaisuuslomake'" . "action='index.php?id_kokon=" . $id_kokon . "&ylakokonaisuuden_id_vanha=" . $ylakokonaisuuden_id_vanha . "&taso_kokon=" . $taso_kokon . "&kieli_id=" . $kieli_id . "&uusi=" . $uusi . $elementtitiedot . "'/>" . $ilmoitus_kokon . "<b>" . Tekstit::$kokonlomake_ohje . "</b>" . $esikatselunappi . "<table summary='uudet_tiedot'>" . "<tr><td>" . Tekstit::$kokonlomake_otsikko . ": </td><td><input type='text'\n size='55' maxlength='{$otsikon_maxpituus}'" . "name='otsikko_kokon' value='{$otsikko_kokon}'" . "id='otsikkotekstikentta'" . "title='" . Tekstit::$kokonlomake_otsikkotitle . "'/>" . "</tr>" . "<tr><td></td>" . "<td>" . " " . $ylakokonvalikko . " " . $nakyvyysvalikko . "</td>" . "</tr>" . "<tr><td></td><td>" . $kaavakielivalikko . " " . $oppiainehtml . " " . $koulutasohtml . " " . $kielivalintahtml . "</td></tr>" . "<tr><td></td><td colspan='2'>" . $tekstimuokkauspainikkeet . "</td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_tiivis . ":</td>" . "<td colspan='2'><textarea cols='80' rows='18' maxlength = '10000'\n id='" . $muokattavan_elementin_id_tii . "' name='tiivis_kokon' \n onfocus='kirjoituskentta_onfocus(\"tiivis_tekstiruutu\")'>" . $tiivis_kokon . "</textarea></td></tr>" . "<tr><td>" . Tekstit::$kokonlomake_selitys . ":</td>" . "<td colspan='2'><textarea cols='80' rows='9' maxlength = '10000'\n id='" . $muokattavan_elementin_id_sel . "' name='selitys_kokon'\n onfocus='kirjoituskentta_onfocus(\"selitys_tekstiruutu\")'>" . $selitys_kokon . "</textarea></td></tr>" . "<tr><td></td><td align='left'>" . $submitnappi . $submit_kesken_nappi . $uusi_kuva_tiivis . $uusi_kuva_seli . $perunappi . "</td></tr>" . "</table>" . "</form>"; return $mj; }
/** * Metodi, joka tallentaa muokatun kokonaisuuden tiedot tietokantaan. * Palauttaa arvon Malliluokkapohja::$VIRHE, jos tallennus epäonnistuu, * muuten arvon Malliluokkapohja::$OPERAATIO_ONNISTUI. * * Ajaa Malliluokkapohjan vastaavan metodin yli. * * Seuraavat arvot asetetaan täällä automaattisesti, joten niistä ei * tarvitse muualla huolehtia: * * ed_muutos_sek * * luomishetki_sek-arvoa ei ole syytä muuttaa, vaikka sitä ei estetä täällä. * * Huolehtii myös isikokonaisuuksien on_lapsia-arvojen päivittämisestä silloin, kun * isikokonaisuutta vaihdetaan. Tällöin sekä uuden että vanhan isi- * kokonaisuuden on_lapsia-arvot tarkistetaan ja päivitetään. * * @return int Palauttaa normaalin Malliluokkapohja::$VIRHE tai * Malliluokkapohja::$OPERAATIO_ONNISTUI -arvon. * */ function tallenna_muutokset() { $this->set_arvo(time(), Kokonaisuusolio::$sarakenimi_ed_muutos_sek); // Haetaan tietokannassa olevan olion ylakokonaisuuden_id, koska tämän // olion arvoja on jo saatettu muuttaa: $vanha = new Kokonaisuusolio($this->get_id(), $this->tietokantaolio); $ylakokonaisuuden_id_vanha = $vanha->getYlakokonaisuuden_id(); $tallennus = parent::tallenna_muutokset(); if ($tallennus === Malliluokkapohja::$OPERAATIO_ONNISTUI) { // Päivitetään on_lapsia, jos kokonaisuus on linkitetty johonkin muuhun: $ylakokonaisuuden_id = $this->getYlakokonaisuuden_id(); if ($ylakokonaisuuden_id != $ylakokonaisuuden_id_vanha) { // Jos uusi yläkokonaisuus on olemassaolevan kokonaisuus, // varmistetaan, että sillä on lapsia. if ($ylakokonaisuuden_id > 0) { $ylakok = new Kokonaisuusolio($ylakokonaisuuden_id, $this->tietokantaolio); if ($ylakok->olio_loytyi_tietokannasta) { $on_lapsia = 1; $onnistuminen = $ylakok->tallenna_on_lapsia_muutos_kokon($on_lapsia); if ($onnistuminen === Kokonaisuusolio::$VIRHE) { $this->lisaa_virheilmoitus(Tekstit::$virheilm_kokon_muutostallennus_lapsimuutos_eiok); } } else { $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt); } } // Mahdollinen entinen yläkokonaisuus pitää myös tarkistaa, onko // sillä vielä lapsia vai ei. Mutta vain jos id > 0, koska // muuten kokonaisuudella ei ennen ollut yläkokonaisuuksia. if ($ylakokonaisuuden_id_vanha > 0) { $ylakok_vanha = new Kokonaisuusolio($ylakokonaisuuden_id_vanha, $this->tietokantaolio); if ($ylakok_vanha->olio_loytyi_tietokannasta) { if ($ylakok_vanha->on_lapsia_kokon()) { $on_lapsia = 1; } else { $on_lapsia = 0; } $onnistuminen = $ylakok_vanha->tallenna_on_lapsia_muutos_kokon($on_lapsia); if ($onnistuminen === Kokonaisuusolio::$VIRHE) { $this->lisaa_virheilmoitus(Tekstit::$virheilm_kokon_muutostallennus_lapsimuutos_eiok); } } else { $this->lisaa_virheilmoitus(Tekstit::$ilm_kokon_ei_loytynyt); } } } } return $tallennus; }
/** * Hakee kaikki yhteen kokonaisuuteen liittyvät tehtävät ja palauttaa ne * kauniisti html-koodina palauteoliossa. * * @param Palaute $palauteolio */ function toteuta_nayta_tehtavat(&$palauteolio) { $parametriolio = $this->get_parametriolio(); $id_kokon = $parametriolio->id_kokon; $omaid = $parametriolio->get_omaid(); $kayttajan_valtuudet = $parametriolio->get_valtuudet(); $tietokantaolio = $parametriolio->get_tietokantaolio(); $tehtava_html = ""; $sisalto = ""; $palaa_nappi = ""; /* Paluu kokonaisuuksiin. */ $uusi_teht_nappi = ""; // Asetetaan kieli, taso ja oppiaine tehtävän perusteella, kun urlista // tullaan: if ($palauteolio->naytto_urlin_mukaan()) { $parametriolio->set_naytto_urlin_mukaan(true); // Isäntäkokonaisuus haetaan tietokannasta, jos teht_id kunnollinen: $teht = $this->get_olio(); if ($teht instanceof Tehtava && $teht->olio_loytyi_tietokannasta) { $kokon_id = $teht->getKokon_id(); $kokon = new Kokonaisuusolio($kokon_id, $tietokantaolio); // Jos löytyi, asetetaan kieli, taso ja oppiaine, jottei tarvita // urlissa: if ($kokon instanceof Kokonaisuusolio && $kokon->olio_loytyi_tietokannasta) { // Asetetaan nämä, voipi olla tarvetta: $parametriolio->id_kokon = $kokon_id; aseta_kieli_taso_ja_oppiaine($kokon->getKieli(), $kokon->getOppiaine(), $kokon->getTaso(), $parametriolio); // Tekstien käännös. Kielet::kaanna($parametriolio->get_kieli_id()); } } } /* Uusia tehtäviä voivat lisätä (valtuuksiltaan) vähintään muokkaajat. * Kannattaa kyllä olla varovainen, jos muuttaa valtuuksia.. */ if ($kayttajan_valtuudet >= Valtuudet::$TEHTAVA_LISAYS) { try { $onsubmit_funktionimi = "nayta_tehtavalomake"; $onsubmit_parametrit = array($id_kokon); /* */ $form_maaritteet = array('method' => 'post', 'class' => 'rinnakkain', 'action' => "{$_SERVER['PHP_SELF']}?" . "id_kokon=" . $id_kokon . "&" . "uusi=1"); $input_maaritteet = array('name' => Toimintonimet::$tehtavatoiminto, 'value' => Painikkeet::$tehtava_uusi_value); $uusi_teht_nappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } catch (Exception $poikkeus) { $sisalto .= "Uusi tehtävä -painike: " . $poikkeus->getMessage(); } } try { $onsubmit_funktionimi = "nayta_kokonaisuudet"; $onsubmit_parametrit = ""; /* Ei parametreja */ $form_maaritteet = array('method' => 'post', 'class' => 'rinnakkain', 'action' => "{$_SERVER['PHP_SELF']}?" . "id_kokon={$id_kokon}"); $input_maaritteet = array('name' => Toimintonimet::$kokonaisuustoiminto, 'value' => Painikkeet::$palaa_kokonaisuuksiin); $palaa_nappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } catch (Exception $poikkeus) { $sisalto .= "Palaa-painike: " . $poikkeus->getMessage(); } $sisalto .= $uusi_teht_nappi; // Haetaan tehtävät: $tehtavat = $this->hae_tehtavat(); if (empty($tehtavat)) { $palauteolio->set_ilmoitus(Tekstit::$tehtava_ilm_ei_loytynyt); $palauteolio->set_linkkihtml($palaa_nappi); } else { $laskuri = 0; // Tehtävän nro foreach ($tehtavat as $tehtava) { if ($tehtava instanceof Tehtava) { $laskuri++; $tehtava->setNro($laskuri); $painikkeet = $this->luo_tehtavapainikkeet($tehtava->getId()); // Jos on kirjautunut käyttäjä, näytetään väripallolla, onko // yksityinen vai julkinen: if ($kayttajan_valtuudet >= Valtuudet::$TEHTAVA_LISAYS) { if ($tehtava->getNakyvyys() + 0 === Nakyvyys::$YKSITYINEN) { $tehtava->setNakyvyysmerkkiPrivate(); } else { $tehtava->setNakyvyysmerkkiPublic(); } } $sisalto .= $this->tehtavanakymat->tulosta_tehtava($tehtava, $omaid, $painikkeet); } } // Haetaan tehtävälinkit, jos tehtäviä löytynyt. Lisätään // myös paluupainike linkkien eteen. $linkkihtml = $this->hae_tehtavalinkit($parametriolio); if ($linkkihtml === Tekstit::$tehtava_ilm_ei_loytynyt) { $palauteolio->set_linkkihtml($palaa_nappi); } else { $palauteolio->set_linkkihtml($palaa_nappi . $linkkihtml); } } /* Tämä ottaa palauteolion samalla käyttöön */ $palauteolio->set_sisalto($sisalto); // Haetaan kokonaisuuden tiedot: $kokon = new Kokonaisuusolio($id_kokon, $tietokantaolio); if ($kokon->olio_loytyi_tietokannasta) { $kokon_otsikko = $kokon->getOtsikko(); } else { $kokon_otsikko = "?"; } /* Lisätään otsikkotieto: */ $palauteolio->set_otsikkotarkennus($kokon_otsikko); $palauteolio->set_naytettava_oliotyyppi(Palaute::$NAYTETTAVA_OLIOTYYPPI_TEHTAVA); // Kieli- yms valikot pois näkyvistä: $palauteolio->set_valikkonaytto(false); // Fixed linkit -näkymä: $palauteolio->set_nayttotapa(Html_koodi::$sisaltoelem_fixed); return $palauteolio; }
/** * Toteuttaa kokonaisuuden poistotoiminnon ellei kokonaisuudella ole lapsia. * Jos on, käsketään poistamaan ensin lapset. Jos kokonaisuus poistetaan, * tarkistetaan sen mahdollisen yläkokonaisuuden lapsekkuus. * * HUOM! On_lapsia kenttä tietokannassa aiheutti tästä aika monimutkaisen. * Ajattelin sen kuitenkin kannattavan, koska se vähentää suuresti * tietokantahakuja usein toistuvissa hauissa. * * Yllä mainitusta syystä on olennaisen tärkeää käyttää tätä metodia * kokonaisuuden poistamiseen. * * @return Palaute $palauteolio */ function toteuta_poista(&$palauteolio) { $parametriolio = $this->get_parametriolio(); $onnistuminen = Palaute::$VIRHEKOODI_YLEINEN; $id_kokon = $parametriolio->get_id_kokon(); $tietokantaolio = $parametriolio->get_tietokantaolio(); $palauteolio = new Palaute(); $palaute = ""; // Tämä tulee palauteolion sisällöksi. $poistettava = new Kokonaisuusolio($id_kokon, $tietokantaolio); //================== Edellisen kokonaisuuden id_n haku ================= // Kun kokonaisuus poistetaan, pitää sitä edeltävän kokonaisuuden id // hakea, jotta se näätetään ensi kerralla. Ellei edellistä ole, // näytetään seuraava. $ed_id = Kokonaisuusolio::$kokon_ei_maaritelty; $oppiaineindeksi = $parametriolio->oppiaine_kokon; $taso = $parametriolio->taso_kokon; $kieli_id = $parametriolio->kieli_id; $omaid = $parametriolio->get_omaid(); $ylakokonaisuuden_id = -1; // 1. tason kokonaisuudet - ei yläkokonaisuutta. $otsikkomerkinta_alussa = ""; $otsikkotaso_alussa = Kokonaisuusolio::$otsikkotaso_oletus; $kokonaisuustaulukko = array(); // Seuraava on aina taulukko (array), joka voi olla tyhjä: $kokonaisuusoliot = $this->hae_kokonaisuusoliopuu($kokonaisuustaulukko, $otsikkomerkinta_alussa, $otsikkotaso_alussa, $kieli_id, $oppiaineindeksi, $taso, $ylakokonaisuuden_id, $tietokantaolio, $omaid); // ASetetaan edellisten ja seuraavien kokonaisuuksien id:t: $this->aseta_ed_ja_seur_idt_kokonaisuuksiin($kokonaisuusoliot); if (!empty($kokonaisuusoliot)) { foreach ($kokonaisuusoliot as $kokonolio) { if ($kokonolio instanceof Kokonaisuusolio && $kokonolio->get_id() == $id_kokon) { $ed_id = $kokonolio->getEdellisenId_kaikista(); if ($ed_id == Kokonaisuusolio::$kokon_edellista_ei_ole) { $ed_id = $kokonolio->getSeuraavanId_kaikista(); } } } } //========================================================================= if ($poistettava->olio_loytyi_tietokannasta) { // Poistometodi tarkastaa, onko lapsia ja huolehtii on_lapsia-arvoista. $palaute = $poistettava->poista(); if ($palaute === Malliluokkapohja::$OPERAATIO_ONNISTUI) { // Poistetaan mahdolliset tyhjään osoittavat kooste-elementit: if (Elementti::poista_elementit($tietokantaolio, Oliotyyppi::$KOKONAISUUS, $id_kokon) === Malliluokkapohja::$OPERAATIO_ONNISTUI) { $palaute = Tekstit::$ilm_kokon_poisto_ok; //Aktiivisuusmerkintä: $aktiivisuuspalaute = paivita_aktiivisuus($omaid, $tietokantaolio, time(), Aktiivisuus::$KOKONAISUUDEN_POISTO); if (!$aktiivisuuspalaute) { $this->lisaa_virheilmoitus(Tekstit::$virheilm_aktiivisuuden_tallennus_eiok); } else { $onnistuminen = Palaute::$VIRHEKOODI_KAIKKI_OK; } } else { $palaute = Tekstit::$kooste_virheilm_elementtien_poistosiivous_ei_ok; } } else { $palaute = Tekstit::$virheilm_kokonaisuuden_poisto; } } else { $palaute = Tekstit::$ilm_kokon_poisto_eiok_kokonaisuutta_ei_loytynyt; } $parametriolio->set_id_kokon($ed_id); // Jotta osaa näyttää edellisen. $this->toteuta_nayta($palauteolio); $palauteolio->set_ilmoitus($palaute); $palauteolio->set_virhekoodi($onnistuminen); $palauteolio->set_valikkonaytto(true); $palauteolio->nayta_kiintolinkit(); return $palauteolio; }
} else { if ($type === Oliotyyppi::$KOKONAISUUS) { $kokon = new Kokonaisuusolio($id, $tietokantaolio); $html = $kokonnakymat->tulosta_esikatselu($kokon, $parametriolio); } else { $html = "Unknown type=" . $type . " and id=" . $id; } } //echo $output = str_replace(array("\r\n", "\r", "\n"), "", $html); return $html; } //========================================================================== //========================================================================== if ($kysymys == "nayta_kokonesikatselu") { // Luodaan uusi Kokonaisuusolio tietojen perusteella: $kokon = new Kokonaisuusolio(Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY, $tietokantaolio); $kokon->setOtsikkotaso(2); $kokon->set_id($parametriolio->id_kokon); $html = $kokonaisuusnakymat->tulosta_esikatselu($kokon, $parametriolio); echo $html; } else { if ($kysymys == "nayta_tehtavan_esikatselu") { $otsikko = $parametriolio->otsikko_teht; $tehtavananto = $parametriolio->tehtavananto_teht; $vaikeustaso = $parametriolio->vaikeustaso_teht; // Luodaan uusi Tehtäväolio tietojen perusteella: $kuvakansion_os = Kuvat::$latauskansion_osoite; $tk_tehtava = ""; $teht = new Tehtava(Tehtava::$MUUTTUJAA_EI_MAARITELTY, $tietokantaolio); // HUOM! Normaali set_arvo-metodi aiheuttaa sitkeät \n -merkit esikatseluun! $teht->set_arvo_kevyt($otsikko, Tehtava::$sarakenimi_otsikko);
/** * Palauttaa yhden koostelomakkeessa otsikon "valitut elementit" alla * olevan valinnan html-koodin. Valinnalle annetaan id arvoksi vastaavan * olion id, jonka eteen on lisatty teksti "elemval_kokon_", "elemval_teht_" * tai "elemval_ratk_", jotta oikea olio pystytään löytämään (id:t voivat * olla samoja eri olioilla). * * HUOM! Jos parametri $divi_tagit_mukaan on arvoltaan false, ei * div-tageja liitetä sisällön ympärille. Tätä tarvitaan, kun ajaxin kautta * tuodaan koodia sisään. * * * @param type $oliotyyppi * @param type $id_olio * @param type $divi_tagit_mukaan * @param Tietokantaolio $tietokantaolio * @return type */ public function luo_valitut_elem_divi($oliotyyppi, $id_olio, $divi_tagit_mukaan, $tietokantaolio) { // Every div containing a choice has this same class value: $class_name = "chosen_elements_div"; if ($oliotyyppi + 0 === Oliotyyppi::$KOKONAISUUS) { $olio = new Kokonaisuusolio($id_olio, $tietokantaolio); $otsikko = Tekstit::$Kokonaisuus_short . " " . $olio->getOtsikko(); } else { if ($oliotyyppi + 0 === Oliotyyppi::$TEHTAVA) { $olio = new Tehtava($id_olio, $tietokantaolio); $otsikko = Tekstit::$Tehtava_short . ": " . $olio->getOtsikko(); } else { if ($oliotyyppi + 0 === Oliotyyppi::$RATKAISU) { $olio = new Ratkaisu($id_olio, $tietokantaolio); $otsikko = Tekstit::$Ratkaisu_short . " :" . $olio->getVastaus(); } else { $otsikko = Tekstit::$tuntematon; $olio = null; } } } $valittuelem_id = $this->luo_valitun_elementin_id($olio); $valittuelem_valintaruutu = $this->luo_valittujen_elem_listan_valintaruutu($olio); if ($divi_tagit_mukaan) { $palaute = Html::luo_div($otsikko . $valittuelem_valintaruutu, array(Attr::id($valittuelem_id), Attr::classs($class_name), Attr::onclick("kooste_set_elem_place", array($valittuelem_id)))); } else { $palaute = $otsikko . $valittuelem_valintaruutu; } return $palaute; }
/** * Etsii tietokannasta ja palauttaa olion näkyvyysarvon. Oletuspalautusarvo * on Nakyvyys::$YKSITYINEN. Muita arvoja tutkitaan vain, jos kyseinen * olio löytyy tietokannasta. * @param type $kohdeolio_id * @param type $kohdeoliotyyppi * @param type $tietokantaolio */ public static function hae_nakyvyys($kohdeolio_id, $kohdeoliotyyppi, $tietokantaolio) { $nakyvyys = Nakyvyys::$YKSITYINEN; if ($kohdeoliotyyppi + 0 === Oliotyyppi::$KOKONAISUUS) { $kohde = new Kokonaisuusolio($kohdeolio_id, $tietokantaolio); if ($kohde->olio_loytyi_tietokannasta) { $nakyvyys = $kohde->getNakyvyys(); } } else { if ($kohdeoliotyyppi + 0 === Oliotyyppi::$TEHTAVA) { $kohde = new Tehtava($kohdeolio_id, $tietokantaolio); if ($kohde->olio_loytyi_tietokannasta) { $nakyvyys = $kohde->getNakyvyys(); } } else { if ($kohdeoliotyyppi + 0 === Oliotyyppi::$RATKAISU) { $kohde = new Ratkaisu($kohdeolio_id, $tietokantaolio); if ($kohde->olio_loytyi_tietokannasta) { $nakyvyys = $kohde->getNakyvyys(); } } else { if ($kohdeoliotyyppi + 0 === Oliotyyppi::$KOOSTE) { $kohde = new Kooste($kohdeolio_id, $tietokantaolio); if ($kohde->olio_loytyi_tietokannasta) { $nakyvyys = $kohde->get_arvo(Kooste::$sarakenimi_nakyvyys); } } else { if ($kohdeoliotyyppi + 0 === Oliotyyppi::$ELEMENTTI) { $kohde = new Elementti($kohdeolio_id, $tietokantaolio); if ($kohde->olio_loytyi_tietokannasta) { $nakyvyys = $kohde->get_arvo(Elementti::$sarakenimi_nakyvyys); } } else { } } } } } return $nakyvyys; }
/** * Hakee kaikki yhteen tehtävään liittyvät ratkaisut ja palauttaa ne * kauniisti html-koodina palauteoliossa. * * @param Palaute $palauteolio */ function toteuta_nayta(&$palauteolio) { $parametriolio = $this->get_parametriolio(); $id_kokon = $parametriolio->id_kokon; $id_teht = $parametriolio->id_teht; $omaid = $parametriolio->get_omaid(); $kayttajan_valtuudet = $parametriolio->get_valtuudet(); $tietokantaolio = $parametriolio->get_tietokantaolio(); $kuvakansion_os = Kuvat::$latauskansion_osoite; $paluunappi = ""; /* Palauttaa käyttäjän tehtävänäkymään. */ $ratkaisu_html = ""; $uusi_ratkaisu_nappi = ""; /* */ $tehtavanakymat = new Tehtavanakymat(); /***************************************************************************/ // Haetaan ensin tehtävä, jotta sen voi nähdä samalla: ********************/ $tehtava_html = ""; $teht = new Tehtava($id_teht, $tietokantaolio); if (!$teht->olio_loytyi_tietokannasta) { $tehtava_html = Tekstit::$tehtava_ilm_ei_loytynyt; } else { $tehtava_html .= $tehtavanakymat->tulosta_tehtava_ilman_painikkeita($omaid, $teht); } /**************************************************************************/ // Asetetaan kieli, taso ja oppiaine kokonaisuuden perusteella, kun urlista // tullaan. Ratkaisun avulla löydetään tehtävä ja sen avulla kokonaisuus: if ($palauteolio->naytto_urlin_mukaan()) { $parametriolio->set_naytto_urlin_mukaan(true); // Isäntäkokonaisuus haetaan tietokannasta, jos ratk_id kunnollinen: $ratk = $this->get_olio(); if ($ratk instanceof Ratkaisu && $ratk->olio_loytyi_tietokannasta) { $teht_id = $ratk->getTeht_id(); $teht = new Tehtava($teht_id, $tietokantaolio); if ($teht->olio_loytyi_tietokannasta) { $kokon_id = $teht->getKokon_id(); } // Lopulta päästään käsiksi kokonaisuuteen: $kokon = new Kokonaisuusolio($kokon_id, $tietokantaolio); // Jos löytyi, asetetaan kieli, taso ja oppiaine, jottei tarvita // urlissa: if ($kokon instanceof Kokonaisuusolio && $kokon->olio_loytyi_tietokannasta) { // Asetetaan nämä, voipi olla tarvetta: $parametriolio->id_kokon = $kokon_id; $parametriolio->id_teht = $teht_id; aseta_kieli_taso_ja_oppiaine($kokon->getKieli(), $kokon->getOppiaine(), $kokon->getTaso(), $parametriolio); // Tekstien käännös. Kielet::kaanna($parametriolio->get_kieli_id()); } } } //===================================================================== try { $paluunappi = $this->tehtavanakymat->button_gobackto_all_exercises($id_teht); } catch (Exception $poikkeus) { $tehtava_html .= "Palaa-painike: " . $poikkeus->getMessage(); } // Uusia ratkaisuja saavat tehdä ne, jotka lisätä tehtäviäkin: if ($kayttajan_valtuudet >= Valtuudet::$TEHTAVA_LISAYS) { // Uusi_ratkaisu_painike: $onsubmit_funktionimi = "nayta_ratkaisulomake"; $onsubmit_parametrit = array($id_teht); /* Tehtävän id */ $form_maaritteet = array('method' => 'post', 'class' => 'rinnakkain', 'action' => "{$_SERVER['PHP_SELF']}?" . "id_teht=" . $id_teht . "&id_kokon=" . $id_kokon . "&uusi=1"); $input_maaritteet = array('name' => Toimintonimet::$tehtavatoiminto, 'value' => Painikkeet::$ratkaisu_uusi_value); $uusi_ratkaisu_nappi = Html::luo_submit_painike_onsubmit_toiminnolla($onsubmit_funktionimi, $onsubmit_parametrit, $form_maaritteet, $input_maaritteet); } $ratkaisu_html .= $paluunappi . $tehtava_html; $ratkaisu_html .= "<h3>" . Tekstit::$ratkaisu_ratkaisut_valiotsikko . "</h3>"; $ratkaisu_html .= $uusi_ratkaisu_nappi; $ratkaisut = $this->hae_ratkaisut($id_teht); if (empty($ratkaisut)) { $palauteolio->set_ilmoitus(Tekstit::$ratkaisu_ilm_ei_loytynyt); } else { foreach ($ratkaisut as $ratkaisu) { if ($ratkaisu instanceof Ratkaisu) { // Jos on kirjautunut käyttäjä, näytetään väripallolla, onko // yksityinen vai julkinen: if ($kayttajan_valtuudet >= Valtuudet::$TEHTAVA_LISAYS) { if ($ratkaisu->getNakyvyys() + 0 === Nakyvyys::$YKSITYINEN) { $ratkaisu->setNakyvyysmerkkiPrivate(); } else { $ratkaisu->setNakyvyysmerkkiPublic(); } } $painikkeet = $this->luo_ratkaisupainikkeet($ratkaisu->getId()); $ratkaisu_html .= $this->ratkaisunakymat->tulosta_ratkaisu($id_kokon, $ratkaisu, $omaid, $painikkeet); } else { $this->lisaa_virheilmoitus(Tekstit::$ratkaisu_ilm_ei_loytynyt); } } } /* Tämä ottaa palauteolion samalla käyttöön */ $palauteolio->set_sisalto($ratkaisu_html); $palauteolio->set_naytettava_oliotyyppi(Palaute::$NAYTETTAVA_OLIOTYYPPI_RATKAISU); // Kieli- yms valikot pois näkyvistä: $palauteolio->set_valikkonaytto(false); return $palauteolio; }
/** * Hakee testikokonaisuudet tietokannasta ja palauttaa niiden muotoillun * html:n. Ylimmän tason testin id on $testiylakokon_id ja se otetaan mukaan * näytettäviin kokonaisuuksiin. * @param <type> $testiylakokon_id * @param Parametrit $parametriolio * @param $parametriolio * @param Parametrit $parametriolio * @return string palauttaa kokonaisuus-html:n. */ function nayta_testikokonaisuudet($testiylakokon_id) { $parametriolio = $this->parametriolio; $tietokantaolio = $this->tietokantaolio; // Haetaan ylin kokonaisuus (joka ei tule automaattisesti: $hakulause = "SELECT * FROM kokonaisuudet\n WHERE (id=" . $testiylakokon_id . ")"; $osumat = $tietokantaolio->tee_OMAhaku_oliotaulukkopalautteella($hakulause); $omaid = $parametriolio->get_omaid(); $kokonaisuustaulukko = array(); $ekakokonaisuus = ""; if (!empty($osumat)) { // Haetaan tiedot tietokannasta ja luodaan Kokonaisuusluokan olio $kokon = new Kokonaisuusolio($osumat[0]->id, $tietokantaolio); $otsikkomerkinta = "Testi"; $otsikkotaso = 1; $ed_id = -1; $seur_id = -1; if (!$kokon->olio_loytyi_tietokannasta) { $this->lisaa_virheilmoitus("Metodi nayta_testikokonaisuudet: " . " Kokonaisuuden haku tietokannasta " . " ja Kokonaisuusolion luominen ei onnistunut"); } else { // Asetetaan tarvittavat tiedot: $kokon->setOtsikkomerkinta($otsikkomerkinta); $kokon->setOtsikkotaso($otsikkotaso); $kokon->setEdellisenId_taso($ed_id); $kokon->setSeuraavanId_taso($seur_id); $this->lisaa_kommentti("Kokonaisuuden haku tietokannasta " . " ja Kokonaisuusolion luominen OK."); // Lisätään juurikokonaisuus eli ylin taulukon alkuun: array_push($kokonaisuustaulukko, $ekakokonaisuus); } } $sisalto = ""; $otsikkomerkinta_alussa = "1"; $otsikkotaso_alussa = 1; // Seuraava on aina taulukko (array), joka voi olla tyhjä: $this->kokonaisuuskontrolleri->hae_kokonaisuusoliopuu($kokonaisuustaulukko, $otsikkomerkinta_alussa, $otsikkotaso_alussa, $parametriolio->kieli_id, $parametriolio->oppiaine_kokon, $parametriolio->taso_kokon, $parametriolio->ylakokonaisuuden_id_kokon, $parametriolio->get_tietokantaolio(), $omaid); if (empty($kokonaisuustaulukko)) { $sisalto .= "Testikokonaisuuksia ei loytynyt!<br/>"; } foreach ($kokonaisuustaulukko as $kok) { $selitys_auki_id = $parametriolio->get_selitys_auki_id(); if ($kok instanceof Kokonaisuusolio) { /* Tarkistetaan mahdollinen näytettävä selitys: */ if (is_numeric($selitys_auki_id) && $selitys_auki_id != Kokonaisuusolio::$SELITYS_KIINNI_ID) { if ($selitys_auki_id == $kok->get_id()) { $selitys_auki = true; } else { $selitys_auki = false; } } else { $selitys_auki = false; } $sisalto .= $this->kokonaisuusnakymat->tulosta_kokonaisuus($kok, $parametriolio, $parametriolio->selitys_auki_id); } else { $sisalto .= "Virhe oliotyypissa (metodi: nayta_testikokonaisuudet)! <br/>"; } } return $sisalto; }
static function hae_tehtavat_koostelomake($id_kokon, $tietokantaolio, $omaid) { $kokon = new Kokonaisuusolio($id_kokon, $tietokantaolio); $teht = array(); $on_kirjautunut = false; if (Henkilo::on_kirjautunut($omaid, $tietokantaolio)) { $on_kirjautunut = true; } if (!$on_kirjautunut) { $teht = Tehtava::hae_kokonaisuuden_julkiset_tehtavat($id_kokon, $tietokantaolio); } else { $ehdokkaat = Tehtava::hae_kokonaisuuden_tehtavat($id_kokon, $tietokantaolio); foreach ($ehdokkaat as $tehtava) { if ($tehtava instanceof Tehtava) { if ($tehtava->getNakyvyys() + 0 === Nakyvyys::$JULKINEN) { array_push($teht, $tehtava); } else { if ($tehtava->getNakyvyys() + 0 === Nakyvyys::$VAIN_KOOSTEESSA || $tehtava->getNakyvyys() + 0 === Nakyvyys::$YKSITYINEN) { // Jos näkyvyys ei ole julkinen, tarkistetaan olion // kohdeoikeudet. /*======================== käyttäjän oikeudet ====*/ $kohdeoikeudet = Henkilo::hae_kayttajan_kohdeoikeudet($kokon->getHenkiloId(), $omaid, Oliotyyppi::$TEHTAVA, $kokon->get_id(), $tietokantaolio); /*===============================================*/ // Jos on vähintään muokkausoikeudet, näytetään // linkki sopivasti muotoiltuna: if ($kohdeoikeudet >= Lisavaltuudet::$SAA_NAHDA_EI_MUOKATA_EI_POISTAA) { array_push($teht, $tehtava); } } else { // Vain otsikkollisia ei näytetä, koska ei järkeä. } } } } } return $teht; }