/**
 * Palauttaa sen lajiluokan nimen, joka vastaa parametrejä. Ellei mitään
 * löydy, palauttaa kysymysmerkkejä.
 * @param <type> $lj_id
 * @param Tietokantaolio $tietokantaolio
 * @param <type> $kielen_nro
 * @return string Palauttaa nimen tai kysymesmerkkejä.
 */
function hae_lajiluokan_nimi($lj_id, $tietokantaolio, $kielen_nro)
{
    // Tässäpä lausetta kerrakseen.
    $hakulause = "SELECT bkuvaukset.nimi AS laji\n                FROM bkuvaukset\n                JOIN blajiluokat\n                ON bkuvaukset.lajiluokka_id = blajiluokat.id\n                WHERE bkuvaukset.kieli= " . $kielen_nro . "\n                AND blajiluokat.id = " . $lj_id . ";";
    $havaintohaku = $tietokantaolio->tee_OMAhaku($hakulause);
    $havaintotaulu = $tietokantaolio->hae_osumarivit_olioina($havaintohaku);
    $nimi = "???";
    if (!empty($havaintotaulu)) {
        $nimi = $havaintotaulu[0]->laji;
        if (!isset($nimi)) {
            $nimi = "???";
        }
    }
    return $nimi;
}
/**
 * Näyttää ylläpitäjälle lomakkeen, josta käyttäjien valtuuksia ja salasanat
 * voidaan muuttaa.
 * @param Tietokantaolio $tietokantaolio
 * @param <type> $muuta_valtuuksia_value
 * @param <type> $muuta_salasana_value
 * @param <type> $poistu_valtuuksista
 * @return string
 */
function nayta_valtuuslomake($tietokantaolio, $muuta_valtuuksia_value, $muuta_salasana_value, $poistu_valtuuksista)
{
    // Haetaan tarvittavat henkilötiedot:
    $hakulause = "SELECT id, kayttajatunnus, etunimi, sukunimi,\n                        valtuudet\n                FROM henkilot";
    $haku = $tietokantaolio->tee_OMAhaku($hakulause);
    $valtuustaulu = $tietokantaolio->hae_osumarivit_olioina($haku);
    $lomakehtml = "<div class='tietolomake'>" . "<p class='keskitys'><b>K&auml;ytt&auml;j&auml;tiedot</b></p>" . "<table summary='uudet_tiedot' align='center' class='tietotaulukko'>" . "<tr><th>Nimi</th><th>K&auml;ytt&auml;j&auml;tunnus</th>" . "<th>K&auml;ytt&ouml;oikeus</th>" . "<th>Toimenpide</th></tr>";
    if (sizeof($valtuustaulu) > 0) {
        foreach ($valtuustaulu as $henkilotiedot) {
            $lomakehtml .= "<tr>";
            $lomakehtml .= "<td>" . $henkilotiedot->etunimi;
            $lomakehtml .= " " . $henkilotiedot->sukunimi . "</td>";
            $lomakehtml .= "<td>" . $henkilotiedot->kayttajatunnus . "</td>";
            $lomakehtml .= "<td>" . Valtuudet::hae_valtuuden_kuvaus($henkilotiedot->valtuudet) . "</td>";
            $lomakehtml .= "<td><form method='post'" . "action='{$_SERVER['PHP_SELF']}?henkilo_id={$henkilotiedot->id}'>" . "<input type='submit' name='toiminta'" . "value='{$muuta_valtuuksia_value}'/>" . "<input type='submit' name='toiminta'" . "value='{$muuta_salasana_value}'/></form></td></tr>";
        }
        $lomakehtml .= "</table>";
        $lomakehtml .= "<form method='post' class='keskitys'" . "action='{$_SERVER['PHP_SELF']}'>" . "<input type='submit' name='toiminta'" . "value='{$poistu_valtuuksista}'/></form>";
        $lomakehtml .= "</div>";
    } else {
        $lomakehtml = "Yht&auml;&auml;n henkil&ouml;&auml; ei l&ouml;ytynyt!";
    }
    return $lomakehtml;
}
/**
 * Poistaa yhden tai useamman tietueen tietokannasta. Poistettavien
 * tunnisteet (esim. id) annetaan parametritaulukossa.
 *
 * @param string $tunnistesarakenimi Sarakkeen nimi, jota vastaavasta
 * tietokantasarakkeesta tunnistetta etsitään.
 * @param array $valinnat
 * @param Tietokantaolio $tietokantaolio
 * @param string $taulun_nimi Sen taulun nimi, josta tietueet poistetaan.
 * @return string Palauttaa viestin suorituksen onnistumisesta, joka
 * näytetään käyttäjälle.
 */
function poista_tietueet($tunnistesarakenimi, &$valinnat, $tietokantaolio, $taulun_nimi)
{
    $vastaus = '';
    $lkm = 0;
    if (!isset($valinnat)) {
        $vastaus = "Poisto ep&auml;onnistui!\n                    Valintataulukko on m&auml;&auml;rittelem&auml;t&ouml;n";
    } else {
        if ($valinnat == "" || sizeof($valinnat) == 0) {
            $vastaus = "Poisto ep&auml;onnistui!\n                    Yht&auml;&auml;n valintaa ei l&ouml;ytynyt!";
        } else {
            foreach ($valinnat as $id) {
                /********************kerkkasten erikoistoiminto********************/
                $emoidkysely = "SELECT emo_id\n                            FROM viestit\n                            WHERE id = '" . $id . "'\n                            AND taso = '2'";
                $emoidhaku = $tietokantaolio->tee_OMAhaku($emoidkysely);
                $emooliotaulu = $tietokantaolio->hae_osumarivit_olioina($emoidhaku);
                if (sizeof($emooliotaulu) > 0) {
                    $emoid = $emooliotaulu[0]->emo_id;
                    if (isset($emoid)) {
                        muuta_kommenttien_lkm(-1, $emoid, $tietokantaolio);
                    }
                }
                /******************************************************************/
                // poista_rivi poistaa korkeintaan yhden tietueen (rajoitettu).
                $poisto = $tietokantaolio->poista_rivi($taulun_nimi, $tunnistesarakenimi, $id);
                if ($poisto == "onnistui") {
                    $lkm++;
                }
            }
            $vastaus = "Tietueita poistettiin onnistuneesti " . $lkm . " kpl.";
        }
    }
    return $vastaus;
}
/**
 * Palauttaa yhden keskustelun html-koodin halutulla tavalla, eli joko
 * näytetään kaikki kommentit tai vain osa ($kiinni = true).
 *
 * @param int $kesk_id Keskustelun id eli aloitusviestin id = kommenttien
 * emo_id.
 * @param bool $auki totuusarvo true, jos kaikki kommentit näytetään, false -
 * vain osa ($kiinni_lkm kappaletta vanhoja + uudet).
 * @param int $kiinni_lkm näin monta vanhaa viestiä näytetään korkeintaan,
 * kun keskustelu on "kiinni"-tilassa.
 * @param int $aikaraja uusien viestien alkuaika sekunteina. Tätä vanhempia
 * näytetään vain $kiinni_lkm kpl.
 * @param Tietokantaolio $tietokantaolio
 * @param bool $kuningas
 *  @param int $oma_id Käyttäjän om id.
 * @return string Palauttaa keskustelun html:n ilman alku- ja päätedivtageja
 * (helpottaa näyttötyylin muuttamista ajaxin avulla).
 */
function hae_keskusteluVANHA($kesk_id, $auki, $kiinni_lkm, $aikaraja, $tietokantaolio, $kuningas, $oma_id)
{
    $palaute = "ei_onnistunut";
    $mj = "";
    // html-koodi
    $on_piilotettavia = false;
    // Näytetäänkö kaikki kommentit?
    // Haetaan ensin keskustelun aloitusviesti:
    $aloitusviesti = $tietokantaolio->hae_eka_osuma_oliona("viestit", "id", $kesk_id);
    // Ellei tämä onnistunut, ei tehdä mitään. Muuten jatketaan.
    if ($aloitusviesti != "tuntematon") {
        // Haetaan kaikki kommentit (joista vain osa näytetään, mutta
        // on hyvä tietää kommenttien kokonaislkm):
        $hakulause1 = "SELECT viestit.*\n                    FROM viestit\n                    WHERE emo_id = '" . $kesk_id . "'\n                    ORDER by tallennushetki_sek ASC";
        $viestihaku1 = $tietokantaolio->tee_OMAhaku($hakulause1);
        $viestitaulu1 = $tietokantaolio->hae_osumarivit_olioina($viestihaku1);
        $kommenttien_lkm = sizeof($viestitaulu1);
        // Muodostetaan uusi taulukko, johon kopioidaan aloitusviesti ja
        // sopiva määrä kommentteja oikeassa järjestyksessä:
        $kesk_viestit = array();
        array_push($kesk_viestit, $aloitusviesti);
        // Jos näytetään kaikki, kopsataan kaikki. Muuten vain sopiva osa.
        if ($auki) {
            foreach ($viestitaulu1 as $v) {
                array_push($kesk_viestit, $v);
            }
        } else {
            // Ei näytetä kaikkia:
            // Haetaan ensin ensimmäisen uuden viestin sijainnin indeksin:
            $eka_uusi_taulukkoid = -1;
            for ($i = 0; $i < sizeof($viestitaulu1); $i++) {
                $v = $viestitaulu1[$i];
                // Otetaan id ylös vain 1. kerran:
                if ($v->tallennushetki_sek > $aikaraja && $eka_uusi_taulukkoid == -1) {
                    $eka_uusi_taulukkoid = $i;
                }
            }
            // Sitten päästään kopioimaan kommentteja:
            $alkuindeksi = 0;
            // Jos vanhoja enemmän kuin näytetään:
            if ($eka_uusi_taulukkoid > $kiinni_lkm) {
                $alkuindeksi = $eka_uusi_taulukkoid - $kiinni_lkm;
                $on_piilotettavia = true;
            }
            for ($i = $alkuindeksi; $i < sizeof($viestitaulu1); $i++) {
                $v2 = $viestitaulu1[$i];
                array_push($kesk_viestit, $v2);
            }
        }
        // Nyt meillä on aloitusviesti ja kommentit samassa taulukossa
        // oikeassa järjestyksessä ja päästään muotoilemaan viestien html:ää.
        for ($i = 0; $i < sizeof($kesk_viestit); $i++) {
            $nyk_olio = $kesk_viestit[$i];
            // Haetaan lähettäjän tiedot:
            $lahettaja = $tietokantaolio->hae_eka_osuma_oliona("henkilot", "id", $nyk_olio->henkilo_id);
            $on_valintaruutu = false;
            // Muokkauksen/poiston salliminen. Kuninkaalla kaikki valta.
            if ($lahettaja !== "tuntematon" && $lahettaja->id === $oma_id && $nyk_olio->kommenttien_lkm < '1' || $kuningas) {
                // Valintaruutu sisältää vastaavan
                // tietokantarivin id:n, jotta se valittu rivi löydetään.
                $on_valintaruutu = true;
            }
            // Muotoillaan lähettäjä mahdollistaen sen, että sitä ei löytynyt.
            if ($lahettaja !== "tuntematon") {
                $lahettaja = $lahettaja->etunimi;
            }
            // Luodaan uusi viestiolio (=taulukon eka viesti)):
            if ($i == 0) {
                $viesti = new Viesti($nyk_olio, false);
            } else {
                $viesti = new Viesti($nyk_olio, true);
            }
            $mj .= $viesti->palauta_html($on_valintaruutu, $lahettaja, $kommenttien_lkm, $on_piilotettavia, $auki);
        }
        $palaute = $mj;
    }
    return $palaute;
}
Example #5
0
 /**
  * Hakee tietyn kauden havainnot tietokannasta ja palauttaa ne 
  * (Havainto-luokan oliot) taulukossa.
  * Yläluokka ja kieli ja näyttötapa saadaan parametrioliosta.
  * 
  * <p>Vaativuus: Yleisen haun jälkeen jokaisen havainnon luonnin yhteydessä
  * tehdään tietokantahaku. Jos havaintoja on esim. tuhansia, voi tämä
  * viedä resurssia aika paljon. Tämä ei oikeastaan olisi tarpeellista, koska
  * havainto-olion tiedot on jo kertaalleen haettu. Pitäisikö havainnon
  * luomiseen tehdä vaihtoehto "älä koske tietokantaan?". Ainakin jos alkaa
  * tökkimään.</p>
  * 
  * @param \Tietokantaolio $tietokantaolio 
  * @param \Parametrit $parametriolio 
  */
 public static function hae_soveliaat($tietokantaolio, $parametriolio)
 {
     // Muotoillaan yläluokan lause:
     $ylaluokka_id = $parametriolio->ylaluokka_id_lj;
     if (isset($ylaluokka_id) && is_numeric($ylaluokka_id) && $ylaluokka_id > 0) {
         $ylaluokkaehto = "blajiluokat.ylaluokka_id = {$ylaluokka_id}";
     } else {
         $ylaluokkaehto = "blajiluokat.ylaluokka_id <> -1";
     }
     // Tarkistetaan, haetaanko vuoden, määrän tai jonkin muun ehdon mukaan:
     $max_lkm = $parametriolio->max_lkm_hav;
     if ($parametriolio->havaintojen_nayttomoodi == Havaintojen_nayttomoodi::$nayta_uusimmat) {
         $ehtolause = "WHERE (bkuvaukset.kieli= " . Kielet::$SUOMI . "\n                        AND {$ylaluokkaehto})\n                        ORDER by vuosi DESC, kk DESC, paiva DESC, laji\n                        LIMIT " . $max_lkm;
         $nayttoilmoitus = $parametriolio->max_lkm_hav . Bongaustekstit::$max_nayttoilm_bongaussivu1;
     } else {
         if ($parametriolio->havaintojen_nayttomoodi == Havaintojen_nayttomoodi::$nayta_vuoden_mukaan) {
             $ehtolause = "WHERE (bkuvaukset.kieli= " . Kielet::$SUOMI . "\n                        AND {$ylaluokkaehto}\n                        AND vuosi = {$parametriolio->nayttovuosi_hav})\n                        ORDER by vuosi DESC, kk DESC, paiva DESC, laji";
             $nayttoilmoitus = $parametriolio->nayttovuosi_hav;
         } else {
             $ehtolause = "WHERE (bkuvaukset.kieli= " . Kielet::$SUOMI . "\n                        AND {$ylaluokkaehto})\n                        ORDER by vuosi DESC, kk DESC, paiva DESC, laji\n                        LIMIT 10";
             $nayttoilmoitus = "???";
         }
     }
     $hakulause = "SELECT \n                        bhavainnot.id AS hav_id,\n                        bkuvaukset.nimi AS laji,\n                        bhavainnot.vuosi AS vuosi,\n                        bhavainnot.kk AS kk,\n                        bhavainnot.paiva AS paiva,\n                        bhavainnot.henkilo_id AS henkilo_id\n                FROM blajiluokat\n                JOIN bkuvaukset\n                ON bkuvaukset.lajiluokka_id = blajiluokat.id\n                JOIN bhavainnot\n                ON bhavainnot.lajiluokka_id = blajiluokat.id\n                {$ehtolause}\n               ";
     $havaintohaku = $tietokantaolio->tee_OMAhaku($hakulause);
     $havaintotaulu_kaikki = $tietokantaolio->hae_osumarivit_olioina($havaintohaku);
     //============= SUODATUS ALKU ======================================
     $havaintotaulu = array();
     $suodattimet = Suodatin::hae_suodattimet($parametriolio->omaid, $tietokantaolio);
     foreach ($havaintotaulu_kaikki as $osuma) {
         $henkilo_id = $osuma->henkilo_id;
         if (!Suodatin::henkilo_suodatetaan_kevyt($henkilo_id, $parametriolio->omaid, $suodattimet)) {
             array_push($havaintotaulu, $osuma);
         }
     }
     //============= SUODATUS LOPPU =====================================
     $oliotaulu = array();
     // Tämä sisältää Havainto-oliot.
     if (!empty($havaintotaulu)) {
         foreach ($havaintotaulu as $tk_hav) {
             $uusi = new Havainto($tietokantaolio, $tk_hav->hav_id);
             if ($uusi->olio_loytyi_tietokannasta) {
                 array_push($oliotaulu, $uusi);
             }
         }
     }
     return $oliotaulu;
 }
/**
 * Poistaa yhden kuvan, sen pikkukuvat ja siihen liittyvät kuva_albumi_linkit
 * tai bkuvalinkit.
 *
 * Lisäys 15.1.2012: Poistaa myös kuvaan liittyvät pikakommentit!
 *
 * Palauttaa viestin onnistumisesta.
 *
 * @param <type> $oma_id
 * @param <type> $id_kuva
 * @param Tietokantaolio $tietokantaolio
 * @param <type> $kokoelmanimi
 * @return string Palauteviesti
 */
function poista_kuva($oma_id, $id_kuva, $tietokantaolio, $kokoelmanimi)
{
    // Haetaan kuvan src poistoa varten:
    $hakulause = "SELECT src, tiedostonimi, henkilo_id\n                FROM kuvat\n                WHERE id = {$id_kuva}";
    $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause);
    $osumataulukko = $tietokantaolio->hae_osumarivit_olioina($hakutulos);
    if (sizeof($osumataulukko) == 0) {
        $src = "";
        $tiedostonimi = "";
        $henkilo_id = "";
    } else {
        $src = $osumataulukko[0]->src;
        $tiedostonimi = $osumataulukko[0]->tiedostonimi;
        $henkilo_id = $osumataulukko[0]->henkilo_id;
    }
    // Varmistus: kuvan poistoon pitää olla kuvan tallentaja tai hallitsija-
    //valtuudet:
    $taulunimi = "henkilot";
    $sarakenimi = "id";
    $hakuarvo = $oma_id;
    $henkilo_olio = $tietokantaolio->hae_eka_osuma_oliona($taulunimi, $sarakenimi, $hakuarvo);
    if ($henkilo_olio != Tietokantaolio::$HAKU_PALAUTTI_TYHJAN) {
        $valtuus = $henkilo_olio->valtuudet;
    } else {
        $valtuus = Valtuudet::$RAJOITETTU;
    }
    if ($oma_id == $henkilo_id || $valtuus == Valtuudet::$HALLINTA) {
        // POistetaan kuvatiedot tietokannasta:
        $taulu = "kuvat";
        $taulun_sarake = "id";
        $hakuarvo = $id_kuva;
        $ilmoitus = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo);
        // Määritellään pikkukuvien kansio-osoite:
        $pikkukuvien_kansio = Kuva::$kansion_os_kuvat_pikkukuvat;
        if ($kokoelmanimi == Kuva::$KUVAT_BONGAUS) {
            $pikkukuvien_kansio = Kuva::$kansion_os_bongauskuvat_pikkukuvat;
        }
        // Jos kuvan poisto onnistui, poistetaan myös orvoiksi jääneet linkit:
        if ($ilmoitus == "onnistui") {
            $osoite_minikuva1 = $pikkukuvien_kansio . "/" . Kuva::$pikkukuva1_nimen_osa . $tiedostonimi;
            $osoite_minikuva2 = $pikkukuvien_kansio . "/" . Kuva::$pikkukuva2_nimen_osa . $tiedostonimi;
            $osoite_minikuva3 = $pikkukuvien_kansio . "/" . Kuva::$pikkukuva3_nimen_osa . $tiedostonimi;
            // Tämä tuhoaa tiedoston lopullisesti:
            $todellinen_poisto = unlink($src);
            $todellinen_poistomini1 = unlink($osoite_minikuva1);
            $todellinen_poistomini2 = unlink($osoite_minikuva2);
            $todellinen_poistomini3 = unlink($osoite_minikuva3);
            // Aktiivisuusmerkintä:
            $viimeksi_aktiivi = time();
            $aktiivisuuslaji = Aktiivisuus::$KUVAN_POISTO;
            paivita_aktiivisuus($oma_id, $tietokantaolio, $viimeksi_aktiivi, $aktiivisuuslaji);
            // Varmistetaan poistot:
            if ($todellinen_poisto) {
                $ilmoitus = "Kuvan poisto ok!";
            } else {
                $ilmoitus = "Virhe kuvan poistossa! Kuvan tiedot poistettu\n                    tietokannasta, mutta kuvatiedoston poisto ei onnistunut. ";
            }
            if ($todellinen_poistomini1) {
                $ilmoitus .= " Poistettu: minikuva1";
            } else {
                $ilmoitus .= " Virhe: minikuvan1 poisto ep&auml;onnistui!";
            }
            if ($todellinen_poistomini2) {
                $ilmoitus .= " minikuva2";
            } else {
                $ilmoitus .= " Virhe: minikuvan2 poisto ep&auml;onnistui!";
            }
            if ($todellinen_poistomini3) {
                $ilmoitus .= " ja minikuva3 JESS!";
            } else {
                $ilmoitus .= " Virhe: minikuvan3 poisto ep&auml;onnistui!";
            }
            //=============== PIkakommenttien poisto ===========================
            // Luodaan Kontrolleri_pikakommentit-olio, joka huolehtii
            //orpojen pikakommenttien poistosta (parametriolio tarvitaan siihen):
            $paraolio = new Parametrit($kokoelmanimi, $oma_id, $tietokantaolio);
            $kontrolleri = new Kontrolleri_pikakommentit($tietokantaolio, $paraolio, "");
            if ($kokoelmanimi == Kuva::$KUVAT_ALBUMIT) {
                $kohde_tyyppi = Pikakommentti::$KOHDE_KUVA_TAVIS;
                $kohde_id = $id_kuva;
            } else {
                if ($kokoelmanimi == Kuva::$KUVAT_BONGAUS) {
                    $kohde_tyyppi = Pikakommentti::$KOHDE_KUVA_BONGAUS;
                    $kohde_id = $id_kuva;
                }
            }
            $poistettu_lkm = $kontrolleri->poista_pikakommentit($tietokantaolio, $kohde_tyyppi, $kohde_id);
            if ($poistettu_lkm == 0) {
                $ilmoitus .= "<br /> Poistettavia pikakommentteja ei l&ouml;ytynyt.";
            } else {
                $ilmoitus .= "<br /> Pikakommentit (" . $poistettu_lkm . " kpl) poistettu.";
            }
            //==================================================================
            // Haetaan ja poistetaan linkit. Kerrallakin voisi poistaa delete-
            // lauseella, mutta se tuntuu vähän uskaliaalta. Näin ainakin poisto
            // pysyy hanskassa, eikä nopeudella lie tässä niin väliä.
            if ($kokoelmanimi == Kuva::$KUVAT_ALBUMIT) {
                $taulunimi = "kuva_albumi_linkit";
            } else {
                if ($kokoelmanimi == Kuva::$KUVAT_BONGAUS) {
                    $taulunimi = "bkuvalinkit";
                } else {
                    $taulunimi = "tuntematon";
                    $ilmoitus .= " VIRHE linkkien poistossa! Kokoelmanimi '" . $kokoelmanimi . "' tuntematon!";
                }
            }
            if ($taulunimi != "tuntematon") {
                $hakulause = "SELECT id\n                    FROM {$taulunimi}\n                    WHERE kuva_id = {$id_kuva}";
                $hakutulos = $tietokantaolio->tee_OMAhaku($hakulause);
                $linkit = $tietokantaolio->hae_osumarivit_olioina($hakutulos);
                $poistetut_linkit_lkm = 0;
                foreach ($linkit as $linkki) {
                    $taulu = $taulunimi;
                    $taulun_sarake = "id";
                    $hakuarvo = $linkki->id;
                    $ilm = $tietokantaolio->poista_rivi($taulu, $taulun_sarake, $hakuarvo);
                    if ($ilm == "onnistui") {
                        $poistetut_linkit_lkm++;
                    }
                }
                $ilmoitus .= "<br /> Linkit (" . $poistetut_linkit_lkm . " kpl) poistettu.";
            }
        } else {
            $ilmoitus = " Virhe kuvan poistossa! Yrit&auml; uudelleen!";
        }
    } else {
        $ilmoitus = "Ei valtuuksia kuvan poistoon!";
    }
    return $ilmoitus;
}