/** * 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äyttäjätiedot</b></p>" . "<table summary='uudet_tiedot' align='center' class='tietotaulukko'>" . "<tr><th>Nimi</th><th>Käyttäjätunnus</th>" . "<th>Käyttö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ään henkilöä ei lö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äonnistui!\n Valintataulukko on määrittelemätön"; } else { if ($valinnat == "" || sizeof($valinnat) == 0) { $vastaus = "Poisto epäonnistui!\n Yhtään valintaa ei lö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; }
/** * 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äonnistui!"; } if ($todellinen_poistomini2) { $ilmoitus .= " minikuva2"; } else { $ilmoitus .= " Virhe: minikuvan2 poisto epäonnistui!"; } if ($todellinen_poistomini3) { $ilmoitus .= " ja minikuva3 JESS!"; } else { $ilmoitus .= " Virhe: minikuvan3 poisto epä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ö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ä uudelleen!"; } } else { $ilmoitus = "Ei valtuuksia kuvan poistoon!"; } return $ilmoitus; }