Moikka,
Tarvitsisin apua tapahtumakalenterin kanssa elikkä ongelma on tämä, minulla on koodattuna tapahtumakalenteri, joka vie tapahtumia tietokantaan. Punainen varattu ja vihreä vapaa. Lomake jossa on kaksi teksti inputtia alkupvm ja loppupvm datepickerien kanssa ja lähetä nappi. Nämä toimivat hyvin, nyt on ongelmana se että mitenkä saan kalenteriin puolipäivän merkinnän? Puolipäivä merkintä on kuvana. Eli pitäisi saada niin, että aloitus päivä olisi vihreä-puna ja lopetus päivä olisi puna-vihreä kuva ja sen saisi valinnan kautta eli joko pudotusvalikosta tai checkboxista. Jos pudotusvalikosta valitaan esim. am niin tulee aloituspvm:ksi vihreä-puna kuva. Tuntuuko kellään tutulta? Kalenteri on tehty taulukkoon ja on vuosi näkymä kalenteri eli vuoden kaikki kuukaudet näkyvät alekkain ja niiden perässä päivämäärät. Saa antaa ehdotuksia miten voisi tehdä ja malli esimerkkiä. Tässä koodia:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//FI" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" /> <title>Linear Calendar</title> <link rel="stylesheet" href="calendar.css" /> <script language="JavaScript" src="calendar_eu.js"></script> <style type="text/css"> .alku{ background-image: url(alku1.gif); background-repeat: no-repeat; background-position: top left} .loppu{ background-image: url(loppu1.gif); background-repeat: no-repeat; background-position: top left } </style> </head> <body> <?php setlocale(LC_TIME, "fi_FI"); setlocale(LC_TIME, "fin"); $dbuser="XXXXXX"; $dbpass="XXXXXX"; $host="localhost"; $yhteys=mysql_connect($host, $dbuser, $dbpass) or die(mysql_error()); if (!$yhteys) { die('Could not connect: ' . mysql_error()); } mysql_select_db("XXXXX", $yhteys); $today = date('Y-n-j'); $kk = date('n'); $vuosi = date('Y'); $pv = date('j'); $tapahtumat = mysql_query("SELECT * FROM tapahtuma WHERE loppu1 >= '$today'", $yhteys) or die("Kysely ei onnistunut:". mysql_error()); // loopataan läpi kaikki tapahtumat ja tallennetaan arrayhin $tapahtumalista = array(); while ($row = mysql_fetch_array($tapahtumat)) { $alku = strtotime($row['alko1']); $loppu = strtotime($row['loppu1']); $stat = $row['status']; $tapahtumalista[] = array($alku, $loppu, $stat); } $kk = date('n'); $vuosi = date('Y'); $pv = date('j'); echo '<table width="100%" cellspacing="0" cellpadding="0" style="text-align: center;" border="2px #009 solid";>'; echo "<tr>"; echo "<th>Kuukaudet</th>"; for ($i=1;$i<=5;$i++) echo '<th style="width: 25px;">Ma</th><th style="width: 25px;">Ti</th><th style="width: 25px;">Ke</th><th style="width: 25px;">To</th><th style="width: 25px;">Pe</th><th style="width: 25px;" bgcolor= "#ECECFF">La</th><th style="width: 25px;" bgcolor= "#E2E2EB">Su</th>'; echo '<th style="width: 25px;">Ma</th><th style="width: 25px;">Ti</th>'; echo '<tr>'; for ($i=0; $i<12; $i++) { $aikaleima = mktime(0,0,0,$kk+$i,1,$vuosi); $dayofweek = date('w', $aikaleima); $amountofdays = date('t', $aikaleima); $tyhjia = $dayofweek-1; echo '<td style=\"width: 20px; text-align: center;\" bgcolor="#FEFEFE">'.strftime("%B %Y", $aikaleima).'</td>'; if ($dayofweek == 0) $tyhjia = 6; $tyhjia--; for ($j=-1*$tyhjia; $j<=$amountofdays; $j++) { $tamaPV = mktime(0,0,0,$kk+$i,$j,$vuosi); if ($j == date('j') && $i == 0) { echo '<td bgcolor= "yellow" span style="color: red;">'; } else { $tapahtumat = false; foreach ($tapahtumalista as $tl) { if ($tl[0] <= $tamaPV && $tl[1] >= $tamaPV) $tapahtumat = true; } if ($tapahtumat == true) echo '<td bgcolor="red" />'; else echo '<td bgcolor="#91CD92" />'; } if ($j>0 && ($i>0 || $j>=date('j'))) echo $j; else echo ' '; echo '</td>'; } echo '</tr>'; } echo '</table>'; mysql_close($yhteys); ?> <center><p> Alkaa pvm <input name="alko1" size="12" id="alko1" type="text" /> <script language="JavaScript"> var o_cal = new tcal ({ // lomakkeen nimi 'formname': 'lomake', // kentän nimi 'controlname': 'alko1' }); o_cal.a_tpl.yearscroll = false; o_cal.a_tpl.weekstart = 1; </script> <span style="padding-left: 19px;">Päättyy pvm <input name="loppu1" size="12" id="loppu1" type="text" /> <script language="JavaScript"> var A_CALTPL = { 'months' : ['Tammi', 'Helmi', 'Maalis', 'Huhti', 'Touko', 'Kesä', 'Heinä', 'Elo', 'Syys', 'Loka', 'Marras', 'Joulu'], 'weekdays' : ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'], 'yearscroll': true, 'weekstart': 1, 'centyear' : 70, 'imgpath' : '' } new tcal ({ 'controlname': 'loppu1' }, A_CALTPL); </script> <input style="width: 40;" type="submit" name="submit" value="Lähetä" /> </form> </body> </html>
Kiitoksia etukäteen.
-Maakke
Mod. korjasi kooditagit, ne kuuluvat koko koodin ympärille.
Moikka,
Olisko ketään joka osais ja ehtis auttaa. Mulla ei oikein riitä noi ohjelmointi taidot vielä tämmöiseen. Täs ois vielä jotain pientä tämänkin jälkeen, voisin maksaakkin pientä korvausta PHP-gurulle. Olen etsinyt netistä saman tyylistä, mutta ei löytynyt. Jos ongelma ei auennut kunnolla niin laitan kuvan kyseisestä kalenteripohjasta ja yritän selittää vielä haluamaani, koska näin se ei varmaankaan täysin aukea.
-Maakke
maakke kirjoitti:
Jos ongelma ei auennut kunnolla niin laitan kuvan kyseisestä kalenteripohjasta ja yritän selittää vielä haluamaani, koska näin se ei varmaankaan täysin aukea.
Tee se, minä en ymmärtänyt puoltakaan ensimmäisestä viestistäsi.
Moikka,
Elikkä lisä selvitystä, olen saanut tehtyä niin kuin tuossa koodissa on datepickereillä valitsen tekstikenttään päivämäärät aloitus ja lopetus ja lähetä painikkeella saan vietyä tietokantaan ja valitut päivämäärät tulevat punaisiksi eli varatuiksi, se on ok, mutta haluaisin myös niin että jos valitsee esim. pudotusvalikosta aamupäivä niin se valitsee alkavan varatun ekan päivän eli aloitus päivämäärän ja merkitsee vihreä-puna päivän kuvalla ja jos valitsee iltapäivän pudotusvalikosta niin se valitsee loppuvan varatun päivän ja merkitsee puna-vihreä päivän kuvalla. Eli jotenkin näin taulukko soluissa
f|f|f|f|f|vp|v|v|v|v|pv|f|f|f|f|jne..
vp=vihreäpuna kuva
pv=punavihreä kuva
v=varattu
f=vapaa
Olikohan mitään hyötyä tästä selvennyksestä.
http://www.phpjabbers.com/availability-calendar/ tuolta löytyisi vastaavan tyyppinen kalenteri eli tuo half-day ominaisuus.
-Maakke
maakke kirjoitti:
Olikohan mitään hyötyä tästä selvennyksestä.
Oli, nyt tajusin, mitä haluat. Koodistasi en kylläkään saanut selvää. Helpoin ratkaisu varmasti olisi käyttää valmista kalenterisoftaa. Kokeile vaikka tätä: http://www.ajaxavailabilitycalendar.com/
Tuo kalenterihan koostuu yksittäisistä kuukausi kalenterista, mutta semmoista en halua. Tekemäni kalenteri on vuosi näkymä kalenteri.
|ma|ti|ke|to|pe|la|su|ma|ti|ke|to|pe|la|su|ma|ti... syyskuu 2010 |1| 2| 3| 4| 5| 6| 7| 8| 9| 10|... |30| lokakuu 2010 |1| 2| 3| 4| 5| 6| 7| 8| 9| 10|... |31| marraskuu 2010 |1| 2| 3| 4| 5|... |30| joulukuu 2010 |1| 2| 3| 4|... |31| tammikuu 2011 helmikuu 2011 maaliskuu 2011 huhtikuu 2011 toukokuu 2011 kesäkuu 2011 heinäkuu 2011 elokuu 2011
Vähän tuon tyyppinen, kun päivä on ohi se automaattisesti ottaa päivän pois kalenterista ja kun kuukausi on ohi niin se pyöräyttää kuukauden eteenpäin kummastakin päästä eli kun syyskuu loppuu niin ylhäälle tulee lokakuu ja alhaalle tulee syyskuu. Tää olisi leiskaltaan paljon parempi ja halutumpi. Eikä se ole minun keksintöni haluta tämän tyyppistä kalenteria, jos voisin niin käyttäisin mainitsemaasi tai mainitsemaani kalenteria. Eli nyt olisi hakusessa se mitä mainitsin tuossa aikaisemmin, half-day ominaisuus.
-Maakke
Mod. lisäsi kooditagit
Moikka kaikki,
Eikö kukaan pystyisi auttamaan edes vähän.
-Maakke
maakke kirjoitti:
Eikö kukaan pystyisi auttamaan edes vähän.
En tajua nopealla vilkaisulla oikestaan mitään tuosta koodistasi, eikä välttämättä moni muukaan. Kuten sanoin, joku on varmasti tehnyt tuollaisen valmiiksi. Esimerkiksi Ajax Availability Calendarista saanee pienellä muokaamisella haluamasi näköisen.
Siis täytyy sanoa, että minusta tuo tarvekuvaus on ihan selkeä. En ymmärrä mitä ongelmaa vastanneilla sen kanssa on.
Mutta en toisaalta myöskään ymmärrä että mikä ongelma on. Eli jos oletetaan että olit saanut toimimaan koko päivän varaamisen, niin ei luulis olevan osapäivä kovin vaikea tehdä.
Siis onko ongelma vain se, että pitäisi saada tapahtuman aloitus- ja lopetuspäivälle juuri jokin erilainen graffa?
Lebe80 kirjoitti:
Siis onko ongelma vain se, että pitäisi saada tapahtuman aloitus- ja lopetuspäivälle juuri jokin erilainen graffa?
Ei, vaan päivät pitäisi jakaa kahteen osaan, niin että voisi varata esim. vain puoli päivää.
Eli siis mikä siinä on ongelmana?
Mikä vika esim. tällaisessa olisi:
http://grez.info/putka/maakke/
-tossu- kirjoitti:
Lebe80 kirjoitti:
Siis onko ongelma vain se, että pitäisi saada tapahtuman aloitus- ja lopetuspäivälle juuri jokin erilainen graffa?
Ei, vaan päivät pitäisi jakaa kahteen osaan, niin että voisi varata esim. vain puoli päivää.
Mikset sä voi sitten laittaa ihan tuntejakin (ja muitakin pienempiä yksiköitä) varaukseen mukaan, niin se taipuisikin vähän helpommin haluamaasi ominaisuuteen.
Minusta suurin ongelma näyttää olevan sekava ohjelmointitapa ja loogisen järkeilyn puute. Luultavasti ongelma ratkeaisi lähes itsestään, kunhan koodi kirjoitettaisiin kunnolla: ensin logiikka ja vasta sitten tulostus.
Ennen tulostusta pitää siis koota oikeiden kuukausien kaikkien päivien tiedot taulukkoon. Tämän pitäisi onnistua muutamalla rivillä tuossa tietokantahaun käsittelyn yhteydessä:
<?php // Alustetaan taulukot. $kuukaudet = keksi_jostain_kuukaudet_taulukkoon(); $paivat = array(); foreach ($kuukaudet as $kk) { $paivat[$kk] = array(); for ($pv = 1; $pv <= paivia_kuukaudessa($kk); ++$pv) { $paivat[$kk][$pv] = array(); } } // Haetaan tulokset, merkitään taulukkoon käytetyt ajankohdat. while ($tapahtuma = mysql_fetch_array($haku)) { list($kk0, $pv0) = keksi_kk_ja_pv($tapahtuma["alku"]); $paivat[$kk0][$pv0]["ilta"] = "ilta"; list($kk1, $pv1) = keksi_kk_ja_pv($tapahtuma["loppu"]); $paivat[$kk1][$pv1]["aamu"] = "aamu"; // Täytetään välipäiviltä sekä aamu että ilta. for (jotain, että $kk ja $pv kiertävät kaikki välipäivät) { $paivat[$kk][$pv]["aamu"] = "aamu"; $paivat[$kk][$pv]["ilta"] = "ilta"; } }
Itse tulostuksen ei todellakaan pitäisi olla juuri tämän mutkikkaampi (pari puuttuvaa osaa saat tehdä itse):
<?php foreach ($kuukaudet as $kk) { echo "<tr>"; // Rivin alkuun tulee kuukauden nimi. echo "<td>", hae_nimi($kk), "</td>"; // Sitten tulee tyhjiä soluja kuukauden ensimmäiseen viikonpäivään asti. foreach ($viikonpaivat as $viikonpaiva) { if (hae_ensimmainen_viikonpaiva($kk) == $viikonpaiva) { break; } echo "<td></td>"; } // Sitten tulevat kaikki päivät, joiden tiedot on valmiiksi koottu muuttujaan. foreach ($paivat[$kk] as $pv => $kaytetyt_ajat) { $luokka = implode(" ", $kaytetyt_ajat); echo "<td class='{$luokka}'>", $pv, "</td>"; } echo "</tr>"; }
Varsinaiseen ongelmaan ("mitenkä saan kalenteriin puolipäivän merkinnän") auttaa CSS:
td { width: 16px; height: 16px; background: url('tyhja.png'); } td.aamu { background: url('aamu.png'); } td.ilta { background: url('ilta.png'); } td.aamu.ilta { background: url('taysi.png'); }
Moikka,
No johan rupes löytymään vastauksia, Grez just tuon tyyppistä olin ajatellut, paitsi mulla on vielä datepicker eli valitsen päivät datepickerin avulla ja vien tietokantaan, mutta muuten samanlainen idea eli kun haluan aamu tai iltapäivän varattua niin valitsen esim. vaikkapa radiobuttonin avulla ja painan lähetän. Sullahan valitaan käsin klikkaamalla päivät. Mites tuon koodin kanssa?
Lebe, periaate tässä on että tarvitaan näyttämään varaustilanne onko varattu vai vapaa ja puolipäivät esim. lähtöpäivänä. Ei tarvitse näyttää niin tarkaan.
Metabolix, kokeilen tuota koodia saanko sen toimimaan.
Suuret kiitokset kaikille auttaneille ja vastanneille. Palaan asiaan jos en saa toimimaan.
-Maakke
Äkkiseltään datepicker tuntuis aika turhalta jos kaikki päivät on muutenkin vuosikalenterissa näkyvillä, eli yhdellä klikkauksella saa suoraan oikean päivän...
Juu näin minustakin, mutta jos haluttaisiin datepickerin kanssa niin ei tarvitsisi silloin naputella jokaista erikseen silloin saisi kaikki tapahtumat kerralla ja klikkauksia jäisi pois. Tämähän ei välttämättä ole minusta kiinni...
maakke kirjoitti:
Juu näin minustakin, mutta jos haluttaisiin datepickerin kanssa niin ei tarvitsisi silloin naputella jokaista erikseen
Eihän muutenkaan tarvitse – Grezin koodi ei suinkaan ole maailman ainoa mahdollinen kalenterikoodi. Sitä vuosikalenteria voisi käyttää vaikka niin, että ensimmäinen klikkaus tulkitaan aloituspäiväksi ja toinen lopetuspäiväksi. Uusilla klikkauksilla voisi sitten korjata valintaansa. Näin tapahtuman varaaminen mistä tahansa onnistuisi parhaimmillaan kolmella klikkauksella: alku, loppu, ok.
Itse pitäisin silti tärkeänä, kun tietokanta tukee aikamuotoista kenttää, voisi sitä käyttää hyväksi juurikin tässä (mikä ihmeen puolipäivä olikaan) ominaisuudessa.
Olkoon "aamupäivä" sitten varattuna aina klo 12 asti, ja myöhemmät aloitus-/lopetusajat menevät jo sitten iltapäivän puolelle.
Muutenkin, kun tuosta sitten joskus siirryt toisenlaiseen näyttötapaan, olisi logiikka jo valmiina, ja varsinkaan kun se ei mitään ylimääräistä työtä edes varauskalenteriin tee.
Nimenomaan näin, eikä kyllä tarvitse muuttaa enää tän jälkeen tai sitten tulee kalliiksi. (mikä ihmeen puolipäivä olikaan) ominaisuudessa. Tämä ominaisuus on kuulemma tärkeä, jos esim. varataan mökkiä. Aloitus menee aamupäivän puolelle ja lopetus menee iltapäiväin puolelle. Eli homma menee näin aloitus alkaa ekasta päivästä sitten tulee koko päivä ja sitten lopetus päivä tulee koska päivä loppuu iltapäivästä. Ja datepickerillä valitaan päivät.
Mites tuollaisen kaleterin koodi voisi mennä minkä metabolix mainitsi?
Grez,
Mites sais tuon koodin joka sulla oli siinä http://grez.info/putka/maakke/ sivuilla. Ajattelin et josko tekis niin että joko kirjoitaa käsin tai datepickerillä teksti kenttään ja sitten erikseen valitsee aloitus- ja lopetuspäivän.
Sinänsähän se ei valtavasti eroa tuosta minkä Metabolix kirjoitteli tänne..
Heips,
Olen katsellut tuota Grezin koodia ja tullut siihen tulokseen, että se on hyvä, mutta mites siihen saisi lisäksi esim. datepickerin tai oikeastaan kaksi, jolloin tulisi aloitus päivä ja lopetus päivä. Saisi yhdistettyä nämä kaksi ominaisuutta toisiinsa olisi tosi hyvä eli aloittaisi datepickerillä valitsemaan aloitus ja lopetuspäivät ja lopuksi valitsisi aamu ja iltapäivän ja jos menee käteen valinnat niin vapaalla voisi korjata tilannetta. Datepickerin kätevyys tulisi esille jos tarvitsee varata koko viikon, niin ei tarvitsisi klikata joka päivää erikseen ja jos samaa tarvitsisi tehdä esim. monelle mökille vuoronperään niin aikaa säästyy. Yrittelin saada tuota aikaiseksi mutta en saanut mitään mainittavaa kokoon. Minullahan oli aikaisemmin, tuolla ylhäällä koodi, semmoinen jolla sain datepickerillä vaikkapa viikon varattua, mutta en osaa yhdistää sitä Grezin koodiin. Siitähän ei tarvitsisi ottaa kaikkea, kun perusosahan on Grezin koodista, vain datepicker osuus, eikö niin. Olisko Grezillä tai jollakin muulla ideoita?
-Maakke
Puuh... Käytä nyt jo herran jestas valmista kikkaretta, kun niitäkin on olemassa:
Esim. vaikkapa YUI:n datepickeriä:
http://developer.yahoo.com/yui/examples/
Tuohon joku vaikkapa rastiruutuun periaate molemmille päivämäärille, mikä määrittelee onko nyt sitten se hemmetin puolipäivä.
Muutenkin, tätä aihetta on tullut seurattua ja jotenkin tuntuu että sulla on taustalla tekniikka ihan päin honkia. Eli et osaa käyttää hyväksi tietokannan tai ohjelmointikielen valmiita päivämäärä-funktioita, vaan yrität keksiä pyörää uudelleen tavoilla, joista oikein itsekään et ole saanut selkoa.
Oma neuvo olisi, että unohtaisit heti alkuun jo koko termin Puolipäivän, ja asettaisit sen suoraan järjestelmääsi vaikkapa klo 12:ksi.
Puolipäivä-merkintä asettaisi tapahtuman ajaksi 12:00, muutoin kello olisi 00:00. Päivämäärä valittaisiin datepickerillä.
Tällöin voit automaattisesti siirtää ajan kokonaisuudessaan mihin tahansa järjestelmään niin, ettei sen toiminta häiriinny. Eri asia on se, miten taas tulostat ajan ruudulle. Klo 12 voisi olla tietenkin haluamasi puolikas neliö/kolmio ja klo 00 olisi kalenterissa täysin väritetty ruutu.
Juu tarkoitus olisikin ja tuo kikkare minkä linkin laitoit oli hyvä, mutta siinähän ei ole vuosi näkymää eikä se tee mitä esim Grezin tai minun tekemäni tekee eli se pyöräyttää aina kuukauden loputtua yhden kuukauden eteenpäin jolloin näkymässä näkyy aina vuosi eteenpäin, nyt kysymys kuuluukin miten saisin tuon ympättyä tuon kikkareen esim Grezin koodiin ja sitä kautta mysqllään kumpainenkin. Pitääkö muuten tehdä kaksi taulua? Toinen jos käsin laittaa ja toinen esin tuohon kikkareeseen? Tässä linkissä olisi minun sovellukseni ja jossa olen käyttänyt datepickeriä http://www.laaksontt.net/kalenteri6.php
Ensiksi sinun pitää tosiaan selvittää vähän enemmän, mitä eroa esim. tuolla YUI:n datapickerillä on ja "käsin syöttämisellä", jotta voit järkeillä mitä hyötyä kahdella taululla voisit saavuttaa.
Lisäksi sinun pitää vähän miettiä, miten voisit tietynlaisista lomakekentistä koota tiedon toisenlaiseen muotoon, esim. yhdistelmällä ja pilkkomalla lomakkeella lähetettyjä tietoja.
Eli ei pitäisi olla mitään väliä onko päivämäärän valinta useasta alasvetovalikoista, yhdestä tekstikentästä vaiko jostain ihan muunlaisesta valinnasta.
Tuosta lomakekentistä sen verran, että tosiaan siihen kyllä kävisi pelkät lomakekentät vaikkapa <input name="alko1" size="12" id="alko1" type="text" /> ja minullahan on sitten erikseen insert.php joka kääntää päivämäärän oikeaan muotoon mysql:ää varten. No ainakin sen verran sillä on väliä, ettei nyt viitsisi mitään alasvetovaliokoita laittaa, siinähän tulee klikkauksia vaikka kuinka ja tosi vanhan aikaista melkein sitten vain kirjoittaa lomakekenttään. Ootko Lebe80 käynyt tuolla linkissä katsomassa kalenteria ja kokeillut kuinka kätevä se on? Tuohon ei tarvitsisi saada kuin ne aamupäivä ja iltapäivä graffat valituksi, niin se olisi siinä.
Mikset sitten lisää niitä?
Tota, tota, senhän takia olen kysynyt täältä neuvoja, kun en osaa tai kun en tiedä miten se tehdään.
Halusin ilmoittaa, että Resolved.
Aihe on jo aika vanha, joten et voi enää vastata siihen.