/**
 * Toteuttaa kuvan tietojen tallennuksen tietokantaan ja kuvan tallennuksen
 * tallennuskansioon. Kuvan tiedot tarkistetaan.
 *
 * Tallentaa kuvan ja palauttaa taulukon, jonka ensimmäinen alkio on
 * palautte tallennuksen onnistumisesta ('onnistui' tai virheilmoitus) ja toinen
 * tallennetun kuvan id:n, jotta uusi kuva osataan näyttää heti. Kolmas alkio
 * taulukossa on tallennetun kuvan tiedosto-osoite.
 *
 * @param Parametrit $parametriolio
 * @return Palaute $palauteolio
 */
function toteuta_tallenna_kuva($parametriolio)
{
    $id_kokon = $parametriolio->id_kokon;
    $id_teht = $parametriolio->id_teht;
    $id_ratk = $parametriolio->id_ratk;
    $omaid = $parametriolio->get_omaid();
    $kuvaotsikko_kuva = $parametriolio->kuvaotsikko_kuva;
    $kuvaselitys_kuva = $parametriolio->kuvaselitys_kuva;
    $vuosi_kuva = $parametriolio->vuosi_kuva;
    $kk_kuva = $parametriolio->kk_kuva;
    $paiva_kuva = $parametriolio->paiva_kuva;
    $nayttokokoindeksi_kuva = $parametriolio->nayttokokoindeksi_kuva;
    $tietokantaolio = $parametriolio->get_tietokantaolio();
    $kokonaisuuskontrolleri = new Kokonaisuuskontrolleri($tietokantaolio, $parametriolio);
    $tehtavakontrolleri = new Tehtavakontrolleri($tietokantaolio, $parametriolio);
    $ratkaisukontrolleri = new Ratkaisukontrolleri($tietokantaolio, $parametriolio);
    //$latauskansio_os Antaa sen kansion suhteellisen tiedostopolun,
    // jonne ladattu tiedosto on tarkoitus siirtää pysyvää sijoitusta varten.
    $latauskansio_os = $parametriolio->latauskansio_os;
    //"selitys"/"tiivis"/"manuaali"/"tehtava"/"ratkaisu"
    $kohde_kuva = $parametriolio->kohde_kuva;
    $palauteolio = new Palaute();
    $palauteolio2 = new Palaute();
    /* tallenna_kuva-metodin palaute */
    $palauteolio_kokon = new Palaute();
    $pal_olio = new Palaute();
    $palauteolio_tehtavat = new Palaute();
    $sisalto = "";
    $id_kuva = "";
    /* Tallennetun kuvan tunniste. */
    $uusi = true;
    $linkit = "";
    // Liittyy tehtäviin esim.
    // Huom! alla olevaan ei tulekaan kuvan id, vaan isäntäolion id!
    $muokatun_id = Kokonaisuusolio::$kokon_ei_maaritelty;
    /* Tarkistetaan, onko latauksia tullut palvelimelle: */
    if (!array_key_exists(Kuvat::$kuvalatauksen_name, $_FILES)) {
        $ilmoitus_kuva = 'Ei latauksia havaittu!';
        $sisalto = nayta_kuvalomake_uusi($kohde_kuva, $omaid, $uusi, $ilmoitus_kuva, $tietokantaolio, $id_kuva, $id_kokon, $id_teht, $id_ratk, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $nayttokokoindeksi_kuva);
        $palauteolio->set_ilmoitus($ilmoitus_kuva);
        $palauteolio->set_sisalto($sisalto);
    } else {
        $ladattu_kuva = $_FILES[Kuvat::$kuvalatauksen_name];
        // Ilmeisesti koko on valmiiksi tavuina (täsmää kuvan omin. kans):
        //$info = getImageSize($ladattu_kuva['tmp_name']);
        $ilmoitus = "Tiedoston nimi: " . $ladattu_kuva['name'] . " (" . round($ladattu_kuva['size'] / 1024) . " kt)" . "<br/> Tyyppi: " . $ladattu_kuva['type'] . "<br />";
        //"<br/> Tmp-nimi: ".$ladattu_kuva['tmp_name'].
        //"<br/> Virheviesti: ".$ladattu_kuva['error'].
        //"<br/> Kuvan tyyppi: ".$info[2];
        $tarkistus = tarkista_kuvatiedot($ladattu_kuva, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $uusi);
        // Jos korjaamista, näytetään lomake uudelleen:
        if ($tarkistus != Palautteita::$lomaketiedot_ok) {
            $ilmoitus_kuva = $tarkistus;
            $sisalto = nayta_kuvalomake_uusi($kohde_kuva, $omaid, $uusi, $ilmoitus_kuva, $tietokantaolio, $id_kuva, $id_kokon, $id_teht, $id_ratk, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $nayttokokoindeksi_kuva);
        } else {
            // Tallenna_kuva palauttaa olion, joka sisältää kolme
            // tietoa; palautteen (ilmoitus), tallennetun kuvan id:n (2), joka
            // voi olla tyhjä virheen sattuessa ja kuvaosoitteen (3).
            $palauteolio2 = tallenna_kuva($kohde_kuva, $id_kokon, $id_teht, $id_ratk, $omaid, $ladattu_kuva, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $nayttokokoindeksi_kuva, $tietokantaolio, $latauskansio_os);
            if ($palauteolio2->get_ilmoitus() == Tietokantaolio::$HAKU_ONNISTUI) {
                $ilmoitus = Tekstit::$ilm_kuva_uusi_tallennus_ok;
                $id_kuva = $palauteolio2->get_muokatun_id();
                $linkit = "";
                // Lisälinkkejä, esim. tehtävissä.
                /* Palautetaan se näkymä, jonka parissa on tehty töitä: */
                if ($kohde_kuva === Kuvat::$kohde_kokonaisuus_tiivistelma || $kohde_kuva === Kuvat::$kohde_kokonaisuus_selitys) {
                    if ($kohde_kuva == Kuvat::$kohde_kokonaisuus_selitys) {
                        $selitys_auki_id = $id_kokon;
                    } else {
                        $selitys_auki_id = "";
                    }
                    $parametriolio->selitys_auki_id = $selitys_auki_id;
                    $kokonaisuuskontrolleri->toteuta_nayta($palauteolio_kokon);
                    $sisalto = $palauteolio_kokon->get_sisalto();
                    $linkit = $palauteolio_kokon->get_linkkihtml();
                    $muokatun_id = $id_kokon;
                } else {
                    if ($kohde_kuva === Kuvat::$kohde_kokonaisuus_tiivis_manuaali || $kohde_kuva === Kuvat::$kohde_kokonaisuus_selitys_manuaali) {
                        $kohteena_tiivis = $kohde_kuva === Kuvat::$kohde_kokonaisuus_tiivis_manuaali;
                        if ($kohteena_tiivis) {
                            $sarakenimi = "tiivis";
                        } else {
                            $sarakenimi = "selitys";
                        }
                        // Haetaan ajantasalla olevat tiedot tietokannasta.
                        /* Muutettavat tiedot alla, jotka siis pitää asettaa:
                           * $muutosarvot = array(time(),
                                  $oppiaine_kokon,
                                  $otsikko_kokon,
                                  $tiivis_kokon,
                                  $selitys_kokon,
                                  $taso_kokon,
                                  $jarjestysnro,
                                  $laajennetun_id_kokon,
                                  $kieli_id,
                                  $ylakokonaisuuden_id);
                           */
                        $taulunimi = "kokonaisuudet";
                        $sarakenimi = "id";
                        $hakuarvo = $id_kokon;
                        $kokonaisuus = $tietokantaolio->hae_eka_osuma_oliona($taulunimi, $sarakenimi, $hakuarvo);
                        if ($kokonaisuus != Tietokantaolio::$HAKU_PALAUTTI_TYHJAN) {
                            $parametriolio->oppiaine_kokon = $kokonaisuus->oppiaine;
                            $parametriolio->otsikko_kokon = $kokonaisuus->otsikko;
                            $parametriolio->tiivis_kokon = $kokonaisuus->tiivis;
                            $parametriolio->selitys_kokon = $kokonaisuus->selitys;
                            $parametriolio->taso_kokon = $kokonaisuus->taso;
                            $parametriolio->jarjestysnro_kokon = $kokonaisuus->jarjestysnro;
                            $parametriolio->laajennetun_id_kokon = $kokonaisuus->laajennetun_id;
                            $parametriolio->ylakokonaisuuden_id_kokon = $kokonaisuus->ylakokonaisuuden_id;
                        }
                        // Haetaan kokonaisuuden tiivistelmä/selitys:
                        if ($kohteena_tiivis) {
                            $vanha = $parametriolio->tiivis_kokon;
                        } else {
                            $vanha = $parametriolio->selitys_kokon;
                        }
                        // Haetaan tallennettu kuva tietokannasta:
                        if ($tietokantaolio instanceof Tietokantaolio) {
                            $taulunimi = "kuvat";
                            $sarakenimi = "id";
                            $hakuarvo = $id_kuva;
                            $tk_olio = $tietokantaolio->hae_eka_osuma_oliona($taulunimi, $sarakenimi, $hakuarvo);
                            if ($tk_olio != Tietokantaolio::$HAKU_PALAUTTI_TYHJAN) {
                                $kuva = new Kuva($tk_olio, $tietokantaolio);
                            }
                            $kuvahtml = $kuva->nayta_pelkka_kuva($latauskansio_os);
                            // Uusi on vanha + kuvahtml:
                            $uusi = $vanha . "\n" . $kuvahtml;
                            if ($kohteena_tiivis) {
                                $parametriolio->tiivis_kokon = $uusi;
                            } else {
                                $parametriolio->selitys_kokon = $uusi;
                            }
                            $kokonaisuuskontrolleri->toteuta_tallenna_muokkaus($palauteolio_kokon);
                        }
                        $sisalto = $palauteolio_kokon->get_sisalto();
                        $muokatun_id = $id_kokon;
                    } else {
                        if ($kohde_kuva === Kuvat::$kohde_tehtava) {
                            $tehtavakontrolleri->toteuta_nayta_tehtavat($palauteolio_tehtavat);
                            $linkit = $palauteolio_tehtavat->get_linkkihtml();
                            $sisalto = $palauteolio_tehtavat->get_sisalto();
                            $muokatun_id = $id_teht;
                        } else {
                            if ($kohde_kuva === Kuvat::$kohde_ratkaisu) {
                                $ratkaisukontrolleri->toteuta_nayta($pal_olio);
                                $sisalto = $pal_olio->get_sisalto();
                                $muokatun_id = $id_ratk;
                            } else {
                                $sisalto = "kohde_kuva?? (toteuta_tallenna_kuva)";
                            }
                        }
                    }
                }
            } else {
                $ilmoitus .= $palauteolio2->get_ilmoitus() . " ja " . $palauteolio_kokon->get_ilmoitus();
                $ilmoitus_kuva = $palauteolio2->get_ilmoitus();
                $sisalto = nayta_kuvalomake_uusi($kohde_kuva, $omaid, $uusi, $ilmoitus_kuva, $tietokantaolio, $id_kuva, $id_kokon, $id_teht, $id_ratk, $kuvaotsikko_kuva, $kuvaselitys_kuva, $vuosi_kuva, $kk_kuva, $paiva_kuva, $nayttokokoindeksi_kuva);
            }
        }
    }
    $palauteolio->set_ilmoitus($ilmoitus);
    $palauteolio->set_sisalto($sisalto);
    $palauteolio->set_muokatun_id($muokatun_id);
    /* Kuvan suhteellinen osoite (kutsuvasta ohjelmanosasta). */
    $palauteolio->set_oma($palauteolio2->get_oma());
    /* Linkit (esim. tehtävät) */
    $palauteolio->set_linkkihtml($linkit);
    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;
 }
 /**
  * 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&auml;v&auml; -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;
 }
 /**
  * Näyttää kaikkien nykyiseen kieleen (kaikki tasot ja oppiaineet) liittyvien
  * kokonaisuuksien otsikoiden, joista klikkaamalla pääsee tarkastelemaan 
  * kokonaisuutta. 
  * 
  * Näytetään julkiset ja omat yksityiset kokonaisuudet. Tulevaisuudessa
  * voi lisätä tarvittaessa mahdollisuuden antaa oikeuksia muille.
  * 
  * IDEA: toisen koosteen kloonaaminen voisi olla sallittavaa. Tällöin voi 
  * kloonista tehdä omanlaisen, mutta toisen tekemä jää ennalleen.
  * 
  * @param Palaute $palauteolio
  */
 public function toteuta_nayta_koosteet(&$palauteolio)
 {
     $koosteet = array();
     $omaid = $this->get_kayttaja()->get_id();
     $kieli = $this->get_parametriolio()->kieli_id;
     $oppiaine = $this->get_parametriolio()->oppiaine_kokon;
     $taso = $this->get_parametriolio()->taso_kokon;
     // Järjestäminen ei oikein onnistu täällä erikoisen nimenrakennuksen
     // takia (kielien, tasojen ja oppiaineiden nimet mukana, joita ei ole
     // tietokannassa).
     $hakulause = "SELECT kt.id from " . Kooste::$taulunimi . " AS kt" . " JOIN " . Henkilo::$taulunimi . " AS hlot" . " ON kt." . Kooste::$sarakenimi_henkilo_id . "=hlot.id" . " WHERE kt." . Kooste::$sarakenimi_nakyvyys . "=" . Nakyvyys::$JULKINEN . " OR kt." . Kooste::$sarakenimi_henkilo_id . "=" . $omaid . " ORDER BY hlot." . Henkilo::$sarakenimi_sukunimi . "," . " kt." . Kooste::$sarakenimi_organisaatio;
     $osumat = $this->get_tietokantaolio()->tee_omahaku_oliotaulukkopalautteella($hakulause);
     foreach ($osumat as $kooste_tk_olio) {
         $kooste = new Kooste($kooste_tk_olio->id, $this->get_tietokantaolio());
         // Jos löytyi tietokannasta, lisätään koosteisiin:
         if ($kooste->olio_loytyi_tietokannasta) {
             array_push($koosteet, $kooste);
         }
     }
     //============ luodaan koosterivit (yksi rivi - yksi kooste): ==========
     $rivit = array();
     foreach ($koosteet as $kooste) {
         if ($kooste instanceof Kooste) {
             $nayttopainike = "";
             $muokkauspainike = "";
             $poistopainike = "";
             $tekija_id = $kooste->get_arvo(Kooste::$sarakenimi_henkilo_id);
             $tekija = new Henkilo($tekija_id, $this->get_tietokantaolio());
             $org = $kooste->get_arvo(Kooste::$sarakenimi_organisaatio);
             if (!empty($org)) {
                 $org .= "_";
             }
             $nimike = $tekija->get_arvo(Henkilo::$sarakenimi_sukunimi) . "_" . $org . Kielet::hae_kielen_nimi_lyhennos($kooste->get_arvo(Kooste::$sarakenimi_kieli)) . "_" . strtoupper(Oppiaineet::hae_oppiaineen_nimi2($kooste->get_arvo(Kooste::$sarakenimi_oppiaine))) . "_" . Koulutasot::hae_koulutason_nimi($kooste->get_arvo(Kooste::$sarakenimi_taso), false) . "_" . $kooste->get_arvo(Kooste::$sarakenimi_nimi) . " ";
             //========= Näyttöpainike ====================================
             $nayttopainike = $this->koostenakymat->luo_koosteen_nayttopainike($kooste);
             //========= Muokkauspainike ja Poistopainike vain tietyille ====
             // Täällä tarkistetaan oikeudet eka:
             $user = $this->get_kayttaja();
             if ($user->olio_loytyi_tietokannasta) {
                 if ($tekija_id + 0 === $user->get_id() + 0 || $user->get_arvo(Henkilo::$sarakenimi_valtuudet) + 0 === Valtuudet::$HALLINTA) {
                     $muokkauspainike = $this->koostenakymat->luo_koosteen_muokkauspainike($kooste);
                     $poistopainike = $this->koostenakymat->luo_koosteen_poistopainike($kooste);
                 }
             }
             if ($kooste->getNakyvyys() + 0 === Nakyvyys::$JULKINEN) {
                 $on_julkinen = true;
             } else {
                 $on_julkinen = false;
             }
             $rivi = $this->koostenakymat->luo_koosterivi($nimike, $nayttopainike, $muokkauspainike, $poistopainike, $on_julkinen);
             array_push($rivit, $rivi);
             //==============================================================
         }
     }
     $tuloste = $this->koostenakymat->nayta_koosteet($rivit);
     //======================================================================
     // Luodaan paluu-painike:
     $paluupainike = $this->koostenakymat->create_button_gobacktoarticles();
     // Luodaan Uusi kooste -painike, jos käyttäjä kirjautunut ja hänellä
     // koostevaltuudet:
     $uusikoostepainike = "";
     if (Henkilo::on_kirjautunut($omaid, $this->get_tietokantaolio())) {
         if ($this->get_kayttaja()->get_arvo(Henkilo::$sarakenimi_valtuudet) >= Valtuudet::$KOOSTE_LISAYS) {
             $uusikoostepainike = $this->koostenakymat->create_button_new_summary();
         }
     }
     $palauteolio->set_sisalto($tuloste);
     $palauteolio->set_linkkihtml($paluupainike . $uusikoostepainike);
     $palauteolio->set_nayttotapa(Html_koodi::$sidenav_fixed);
     $palauteolio->set_valikkonaytto(false);
 }