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