/**
  * 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 kokonaisuudessaan uuden kokonaisuuden tallennuksen tietokantaan.
  * Palauttaa Palauteolio-luokan olion.
  *
  * Järjestysluvuksi kokonaisuus saa id:n. Järjestyslukua voi myöhemmin
  * muuttaa vaihtamalla jonkin toisen kokonaisuuden kanssa, jolloin ei pitäisi
  * tulla päällekkäisyyksiä.
  *
  * @return <type>
  */
 function toteuta_tallenna_uusi(&$palauteolio)
 {
     $parametriolio = $this->get_parametriolio();
     $tallennuskesken = $parametriolio->tallennuskesken;
     $omaid = $parametriolio->get_omaid();
     $oppiaine_kokon = $parametriolio->get_oppiaine_kokon();
     $otsikko_kokon = $parametriolio->get_otsikko_kokon();
     $tiivis_kokon = $parametriolio->get_tiivis_kokon();
     $selitys_kokon = $parametriolio->get_selitys_kokon();
     $taso_kokon = $parametriolio->get_taso_kokon();
     $laajennetun_id_kokon = $parametriolio->get_laajennetun_id_kokon();
     $kieli_id = $parametriolio->get_kieli_id();
     $ylakokonaisuuden_id_kokon = $parametriolio->get_ylakokonaisuuden_id_kokon();
     $jarjestysnro_kokon = $parametriolio->get_jarjestysnro_kokon();
     $nakyvyys_kokon = $parametriolio->nakyvyys_kokon;
     $tietokantaolio = $parametriolio->get_tietokantaolio();
     $palauteolio = new Palaute();
     $linkit = "";
     // Kokonaisuuslinkit
     $sisalto = "";
     $ilmoitus = "";
     $tallennetun_id = "";
     $valikot_nayta = true;
     $kokonaisuusoliot = array();
     $palauteolio->set_virhekoodi(Palaute::$VIRHEKOODI_YLEINEN);
     // Tallennettava kokonaisuus:
     $kokonaisuus = new Kokonaisuusolio(Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY, $this->get_tietokantaolio());
     // Lisätään kokonaisuudelle saadut parametrit:
     $kokonaisuus->set_arvo($omaid, Kokonaisuusolio::$sarakenimi_henkilo_id);
     $kokonaisuus->set_arvo($otsikko_kokon, Kokonaisuusolio::$sarakenimi_otsikko);
     $kokonaisuus->set_arvo($tiivis_kokon, Kokonaisuusolio::$sarakenimi_tiivis);
     $kokonaisuus->set_arvo($selitys_kokon, Kokonaisuusolio::$sarakenimi_selitys);
     $kokonaisuus->set_arvo($taso_kokon, Kokonaisuusolio::$sarakenimi_taso);
     $kokonaisuus->set_arvo($oppiaine_kokon, Kokonaisuusolio::$sarakenimi_oppiaine);
     $kokonaisuus->set_arvo($laajennetun_id_kokon, Kokonaisuusolio::$sarakenimi_laajennetun_id);
     $kokonaisuus->set_arvo($kieli_id, Kokonaisuusolio::$sarakenimi_kieli);
     $kokonaisuus->set_arvo($ylakokonaisuuden_id_kokon, Kokonaisuusolio::$sarakenimi_ylakokonaisuuden_id);
     $kokonaisuus->set_arvo($nakyvyys_kokon, Kokonaisuusolio::$sarakenimi_nakyvyys);
     // Tallennus tietokantaan:
     $palaute = $kokonaisuus->tallenna_uusi();
     // Jos tiedoissa on vikaa, esim. tyhjä otsikko:
     if ($palaute != Kokonaisuusolio::$OPERAATIO_ONNISTUI) {
         $valikot_nayta = false;
         $ilmoitus_kokon = $kokonaisuus->tulosta_virheilmoitukset();
         $uusi = true;
         $id_kokon = -1;
         $sisalto = $this->kokonaisuusnakymat->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, Toimintonimet::$kokonaisuustoiminto, $this, $parametriolio->kaavakieli, Elementti::$MUUTTUJAA_EI_MAARITELTY, Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY);
         $ilmoitus = $ilmoitus_kokon;
     } else {
         $tallennetun_id = $kokonaisuus->get_id_tietokanta();
         /* Asetetaan järjestysluku samaksi kuin kokonaisuuden id. Näin
          * varmistetaan se, ettei tule samoja. */
         $id = $kokonaisuus->get_id();
         $kokonaisuus->set_arvo($id, Kokonaisuusolio::$sarakenimi_jarjestysnro);
         $onnistuiko = $kokonaisuus->tallenna_muutokset();
         if ($onnistuiko == Kokonaisuusolio::$OPERAATIO_ONNISTUI) {
             $ilmoitus = Tekstit::$ilm_kokon_lisays_ok;
             //Aktiivisuusmerkintä:
             $aktiivisuuspalaute = paivita_aktiivisuus($omaid, $tietokantaolio, time(), Aktiivisuus::$UUDEN_KOKONAISUUDEN_TALLENNUS);
             if (!$aktiivisuuspalaute) {
                 $this->lisaa_virheilmoitus(Tekstit::$virheilm_aktiivisuuden_tallennus_eiok);
             } else {
                 $palauteolio->set_virhekoodi(Palaute::$VIRHEKOODI_KAIKKI_OK);
             }
         } else {
             $ilmoitus = Tekstit::$virheilm_kokon_tallennus_ok_jarjnro_eiok . " " . $kokonaisuus->tulosta_virheilmoitukset();
         }
         //=================================================================
         // Asetetaan sessiomuuttujat oikein, jotta näkyy myös
         // luettelossa. Yläkokonaisuus auki (sillä on ainakin yksi lapsi,
         // tämä) ja tämä kiinni (tällä ei voi olla lapsia, koska juuri luotu).
         $muuttujanimi_ylakok = Parametrit::linkkisessiomuuttujan_nimi($ylakokonaisuuden_id_kokon);
         $_SESSION[$muuttujanimi_ylakok] = Kokonaisuusolio::$LINKKI_AUKI;
         $muuttujanimi = Parametrit::linkkisessiomuuttujan_nimi($tallennetun_id);
         $_SESSION[$muuttujanimi] = Kokonaisuusolio::$LINKKI_KIINNI;
         //=================================================================
         $parametriolio->id_kokon = $id;
         $palauteolio2 = new Palaute();
         if ($tallennuskesken) {
             $parametriolio->uusi = false;
             $this->toteuta_nayta_kokonaisuuslomake($palauteolio2);
         } else {
             $palauteolio2 = $this->toteuta_nayta($palauteolio2);
         }
         $sisalto = $palauteolio2->get_sisalto();
         $linkit = $palauteolio2->get_linkkihtml();
     }
     $palauteolio->set_ilmoitus($ilmoitus);
     $palauteolio->set_sisalto($sisalto);
     $palauteolio->set_muokatun_id($tallennetun_id);
     $palauteolio->set_valikkonaytto($valikot_nayta);
     $palauteolio->set_kokonaisuudet($kokonaisuusoliot);
     $palauteolio->nayta_kiintolinkit();
     $palauteolio->set_linkkihtml($linkit);
     $palauteolio->set_naytettava_oliotyyppi(Palaute::$NAYTETTAVA_OLIOTYYPPI_KOKONAISUUS);
     return $palauteolio;
 }
Exemple #3
0
/**
 * 
 * @param Palaute $palauteolio
 * @param Parametrit $parametriolio
 * @param Koostekontrolleri $koostekontrolleri
 * @param Tehtavakontrolleri $tehtavakontrolleri
 * @param Ratkaisukontrolleri $ratkaisukontrolleri
 * @param Kokonaisuuskontrolleri $kokonaisuuskontrolleri
 */
function nayta_urlin_mukaan(&$palauteolio, &$parametriolio, &$koostekontrolleri, &$tehtavakontrolleri, &$ratkaisukontrolleri, &$kokonaisuuskontrolleri)
{
    $palauteolio->set_oma(Yleiset_arvot::$toimintaa_ei_maaritelty);
    $palauteolio->set_naytto_urlin_mukaan(true);
    // Mietittävää: kielen, oppiaineen ja tason määritykset voisi laittaa
    // toteuta-metodeiden sisälle, jottei niitä tarvita roskaamaan urlia.
    // Lähinnä koosteiden kohdalla pitää
    // miettiä, koska tällä hetkellä kaikki näkyy kaikille, eli siis
    // niiden näkyvyyttä ei ole rajoitettu kielen, oppiaineen tai tason
    // perusteella. Mahdollisesti kielen perusteella näin voisi tehdäkin,
    // vaikka muut jättäisi ennalleen.
    // Huomaa myös, että urlissa voi olla pelkästään kielen, aineen ja
    // tason arvot, jolloin pitäisi osata näyttää ensimmäinen vastaava
    // kokonaisuus.
    // Otetaan kuitenkin parametrinolion arvo mukaan [, jos se on jokin muu
    // oletus "kokonaisuus"] (esim kun urlin perusteella tullaan):
    //if($parametriolio->naytettava != Palaute::$NAYTETTAVA_OLIOTYYPPI_KOKONAISUUS){
    $palauteolio->set_naytettava_oliotyyppi(Oliotyyppi::muunna_palauteolion_arvoksi($parametriolio->naytettava));
    //}
    // Alla pitäisi riittää palauteolion arvo. Se ohjaa nykyisin
    // näytettävää oliota. Muu-arvo (vähän kuin ei-määr) viittaa siihen,
    // ettei url määritä näytettävää oliota, joten pitää "arvata" se muuten.
    if ($palauteolio->get_naytettava_oliotyyppi() != Palaute::$NAYTETTAVA_OLIOTYYPPI_MUU) {
        if ($palauteolio->get_naytettava_oliotyyppi() === Palaute::$NAYTETTAVA_OLIOTYYPPI_TEHTAVA) {
            $tehtavakontrolleri->toteuta_nayta_tehtavat($palauteolio);
        } else {
            if ($palauteolio->get_naytettava_oliotyyppi() === Palaute::$NAYTETTAVA_OLIOTYYPPI_RATKAISU) {
                $ratkaisukontrolleri->toteuta_nayta($palauteolio);
            } else {
                if ($palauteolio->get_naytettava_oliotyyppi() === Palaute::$NAYTETTAVA_OLIOTYYPPI_KOOSTE) {
                    // Haetaan kooste kieltä, tasoa ja oppiainetta varten:
                    $kooste = $koostekontrolleri->get_olio();
                    if ($kooste->olio_loytyi_tietokannasta) {
                        $kieli = $kooste->get_arvo(Kooste::$sarakenimi_kieli);
                        $oppiaine = $kooste->get_arvo(Kooste::$sarakenimi_oppiaine);
                        $taso = $kooste->get_arvo(Kooste::$sarakenimi_taso);
                        // Kokonaisuusarvot ohjaavat eniten sovellusta:
                        aseta_kieli_taso_ja_oppiaine($kieli, $oppiaine, $taso, $parametriolio);
                        Kielet::kaanna($kieli);
                        $koostekontrolleri->toteuta_nayta($palauteolio);
                    } else {
                        $koostekontrolleri->toteuta_nayta_koosteet($palauteolio);
                        $palauteolio->set_ilmoitus(Tekstit::$kooste_koostetta_ei_ole_tai_ei_voida_nayttaa);
                    }
                } else {
                    if ($palauteolio->get_naytettava_oliotyyppi() === Palaute::$NAYTETTAVA_OLIOTYYPPI_KOOSTE_TULOSTUS) {
                        $koostekontrolleri->toteuta_nayta_tulostus($palauteolio);
                    } else {
                        if ($palauteolio->get_naytettava_oliotyyppi() === Palaute::$NAYTETTAVA_OLIOTYYPPI_KOOSTE_ELEMRYHMA) {
                            // Haetaan kooste kieltä, tasoa ja oppiainetta varten:
                            $kooste = $koostekontrolleri->get_olio();
                            if ($kooste->olio_loytyi_tietokannasta) {
                                $kieli = $kooste->get_arvo(Kooste::$sarakenimi_kieli);
                                $oppiaine = $kooste->get_arvo(Kooste::$sarakenimi_oppiaine);
                                $taso = $kooste->get_arvo(Kooste::$sarakenimi_taso);
                                // Kokonaisuusarvot ohjaavat eniten sovellusta:
                                aseta_kieli_taso_ja_oppiaine($kieli, $oppiaine, $taso, $parametriolio);
                                Kielet::kaanna($kieli);
                                $koostekontrolleri->toteuta_nayta($palauteolio);
                            } else {
                                $koostekontrolleri->toteuta_nayta_koosteet($palauteolio);
                                $palauteolio->set_ilmoitus(Tekstit::$kooste_koostetta_ei_ole_tai_ei_voida_nayttaa);
                            }
                        } else {
                            // default:
                            $kokonaisuuskontrolleri->toteuta_nayta($palauteolio);
                        }
                    }
                }
            }
        }
        //======================================================================
        //======================================================================
        // Kun näytettävää oliota ei urlissa, tarkistetaan mahdolliset
        // id-arvot. Jos jokin määritelty, mennään sinne sitten!
    } else {
        // Tarkistetaan, onko kooste-id:tä:
        if ($parametriolio->kooste_id != Kooste::$MUUTTUJAA_EI_MAARITELTY || $parametriolio->elemryhma_id != Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY) {
            $nayta_kooste = true;
            if ($parametriolio->elemryhma_id != Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY) {
                $nayta_kooste = false;
            }
            // Haetaan kooste kieltä, tasoa ja oppiainetta varten:
            // Huomaa, että ei välttämättä Kooste-olio!
            $kooste = $koostekontrolleri->get_olio();
            if ($kooste instanceof Kooste && $kooste->olio_loytyi_tietokannasta) {
                $kieli = $kooste->get_arvo(Kooste::$sarakenimi_kieli);
                $oppiaine = $kooste->get_arvo(Kooste::$sarakenimi_oppiaine);
                $taso = $kooste->get_arvo(Kooste::$sarakenimi_taso);
                // Kokonaisuusarvot ohjaavat eniten sovellusta:
                aseta_kieli_taso_ja_oppiaine($kieli, $oppiaine, $taso, $parametriolio);
                Kielet::kaanna($kieli);
                // NÄytetään joko kooste tai elementtiryhmä:
                if ($nayta_kooste) {
                    $koostekontrolleri->toteuta_nayta($palauteolio);
                } else {
                    $koostekontrolleri->toteuta_nayta_elementtiryhma($palauteolio);
                }
            } else {
                $koostekontrolleri->toteuta_nayta_koosteet($palauteolio);
                $palauteolio->set_ilmoitus(Tekstit::$kooste_koostetta_ei_ole_tai_ei_voida_nayttaa);
            }
            // Huomaa järjestys: ensin tarkistetaan ratkaisu, sitten teht ja
            // vasta lopuksi kokonaisuus (jonka id tahtoo kummitella muistissa).
        } else {
            if ($parametriolio->id_teht != Tehtava::$MUUTTUJAA_EI_MAARITELTY) {
                // Näytetään yksi tehtävä:
                $tehtavakontrolleri->toteuta_nayta($palauteolio);
            } else {
                if ($parametriolio->id_ratk != Ratkaisu::$MUUTTUJAA_EI_MAARITELTY) {
                    $ratkaisukontrolleri->toteuta_nayta($palauteolio);
                } else {
                    if ($parametriolio->id_kokon != Kokonaisuusolio::$kokon_ei_maaritelty) {
                        $kokonaisuuskontrolleri->toteuta_nayta($palauteolio);
                        // Ellei näytettävää oliota, viedään oppiaineen mukaisesti:
                    } else {
                        if ($parametriolio->oppiaine_kokon != Kokonaisuusolio::$MUUTTUJAA_EI_MAARITELTY) {
                            $kokonaisuuskontrolleri->toteuta_nayta($palauteolio);
                        } else {
                            $kokonaisuuskontrolleri->toteuta_nayta($palauteolio);
                        }
                    }
                }
            }
        }
    }
}
 /**
  * Toteuttaa yhden koosteen tai elementtiryhmän näyttämisen tulostusmuodossa.
  * @param Palaute $palauteolio
  */
 public function toteuta_nayta_tulostus(&$palauteolio)
 {
     $html = "";
     $nayta_elementtiryhma = false;
     $elementtiryhma = Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY;
     $param = $this->get_parametriolio();
     $tietokantaolio = $this->get_tietokantaolio();
     // Tämä toimii jos joko id_kooste tai id_elemryhma on määritelty
     // parametreissa.
     $kooste = $this->get_olio();
     // Haetaan mahdollinen elementtiryhmä:
     if ($param->elemryhma_id != Elementtiryhma::$MUUTTUJAA_EI_MAARITELTY) {
         $elemryhma_id = $param->elemryhma_id;
         $elementtiryhma_cand = new Elementtiryhma($elemryhma_id, $tietokantaolio);
         if ($elementtiryhma_cand->olio_loytyi_tietokannasta) {
             $nayta_elementtiryhma = true;
             $elementtiryhma = $elementtiryhma_cand;
         }
     }
     $omaid = $this->get_parametriolio()->get_omaid() + 0;
     // Ratkaisukontrollerissa on valmiina ratkaisujen näyttöoikeusseulonta.
     $ratkaisukontrolleri = new Ratkaisukontrolleri($this->get_tietokantaolio(), $this->get_parametriolio());
     $tehtavalaskuri = 0;
     $elemryhmapainikkeet = "";
     if ($kooste instanceof Kooste) {
         // Tarkistetaan, onko käyttäjällä edes oikeuksia nähdä koostetta:
         /*======================== käyttäjän oikeudet ========*/
         $kohdeoikeudet_kooste = $kooste->hae_kayttajan_oikeudet($omaid);
         /*====================================================*/
         // Jos riittävät oikeudet, näytetään ja muuten ei.
         if ($kohdeoikeudet_kooste >= Lisavaltuudet::$SAA_NAHDA_EI_MUOKATA_EI_POISTAA) {
             if ($nayta_elementtiryhma) {
                 $elementit = $elementtiryhma->hae_elementit();
             } else {
                 $elementit = $kooste->hae_elementit();
             }
             // Laskurit otsikkonumerointia varten:
             $laskuri_kokon = 0;
             $laskuri_teht = 0;
             $laskuri_ratk = 0;
             foreach ($elementit as $elementti) {
                 if ($elementti instanceof Elementti) {
                     // Kerätään tähän yhden elementin koodi:
                     $elem_html = "";
                     $viittausolio = $elementti->hae_viittausolio();
                     $kohdeoikeudet = $elementti->hae_kayttajan_oikeudet_viittausolioon($omaid) + 0;
                     $minimioikeus = Lisavaltuudet::$SAA_NAHDA_EI_MUOKATA_EI_POISTAA;
                     // Jos vähintään näkeminen sallittu:
                     if ($kohdeoikeudet >= $minimioikeus) {
                         if ($viittausolio instanceof Kokonaisuusolio) {
                             $laskuri_kokon++;
                             $viittausolio->setOtsikkomerkinta($laskuri_kokon . ": ");
                             // Selitys_auki pitää asettaa elementin
                             // tallennettavaksi ominaisuudeksi tms, jotta
                             // sitä voi säätää. Nyt vain ei  näytetä.
                             //$selitys_auki = true;
                             $selitys_auki = false;
                             $elem_html .= $this->get_kokonaisuusnakymat()->luo_koostenakyma_tulostus($elementti, $viittausolio, $this->get_parametriolio(), $selitys_auki, $kohdeoikeudet);
                         } else {
                             if ($viittausolio instanceof Tehtava) {
                                 $laskuri_teht++;
                                 $id_teht = $viittausolio->getId();
                                 $viittausolio->setOtsikkomerkinta(Tekstit::$Tehtava . " " . $laskuri_teht);
                                 $painikkeet = "";
                                 $elem_html .= $this->get_tehtavanakymat()->luo_koostenakyma_tulostus($elementti, $viittausolio, $painikkeet);
                                 // Haetaan tehtävän ratkaisut ja liitetään
                                 // tehtävään mukaan:
                                 $ratkaisut = $ratkaisukontrolleri->hae_ratkaisut($id_teht);
                                 $this->merkitse_ratkaisujen_otsikkonumerot($ratkaisut, $viittausolio);
                                 $elem_html .= $this->luo_tehtavan_ratkaisut_koodi($ratkaisut, true, $omaid, $elementti);
                             } else {
                                 // Viittausoliossa jotakin kummaa.
                             }
                         }
                         $html .= Html::luo_div($elem_html, array(Attr::classs("kooste_elementti_tulostus")));
                     }
                 }
             }
             $koostekoodi = $this->koostenakymat->nayta_tulostusnakyma(Html::luo_div($html, array(Attr::id(Koostenakymat::$kooste_elementti_id))), $kooste, $elementtiryhma);
         } else {
             // Ellei oikeuksia koosteen katselemiseen.
             $koostekoodi = Html::luo_otsikko(Tekstit::$kooste_ilm_nayttoon_ei_oikeuksia, array(), 4);
         }
     }
     $kooste_id = $kooste->get_id();
     // Nykyinen kooste.
     $painikkeet = $this->get_koostenakymat()->luo_paluu_tulostusnaytosta_painike($kooste, $elementtiryhma) . $this->get_koostenakymat()->luo_koosteen_ratkaisunayttopainikkeet("elemtehtavan_ratkaisut_tulostus") . $elemryhmapainikkeet;
     $palauteolio->set_sisalto($koostekoodi);
     $palauteolio->set_linkkihtml($painikkeet);
     $palauteolio->set_naytettava_oliotyyppi(Palaute::$NAYTETTAVA_OLIOTYYPPI_KOOSTE_TULOSTUS);
     $palauteolio->set_nayttotapa(Html_koodi::$sisaltoelem_tulostus);
 }
 /**
  * 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;
 }