Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Kalenteri

erakko- [20.01.2009 20:54:24]

#

Olen tekemässä kalenteria, johon voi MySQL:n kanssa lisätä varauksia tietyille päiville. Ajattelin ensin saada kalenterin kunnolla toimimaan ennenkuin MySQLiä rupean räveltämään sinne. Noniin, alla on siis koodi...

	<?php
        //nykyinen vuosi
	$n_year = date("Y");
        //nykyinen kuukausi
	$n_month = date("m");
        //tehdää kuukaudelle teksti joka näytetään boldattuna kalenterin yläpuolella
	switch($n_month)
	{
		case 1:
			$name_of_month = "Tammikuu";
			break;
		case 2:
			$name_of_month = "Helmikuu";
			break;
		case 3:
			$name_of_month = "Maaliskuu";
			break;
		case 4:
			$name_of_month = "Huhtikuu";
			break;
		case 5:
			$name_of_month = "Toukokuu";
			break;
		case 6:
			$name_of_month = "Kes&auml;kuu";
			break;
		case 7:
			$name_of_month = "Hein&auml;kuu";
			break;
		case 8:
			$name_of_month = "Elokuu";
			break;
		case 9:
			$name_of_month = "Syyskuu";
			break;
		case 10:
			$name_of_month = "Lokakuu";
			break;
		case 11:
			$name_of_month = "Marraskuu";
			break;
		case 12:
			$name_of_month = "Joulukuu";
			break;
	}
        //nykyinen päivä
	$n_day = date("d");
        //funktio, jolle annetaan arvo, jonka avulla otetaan viikonpäivä selville, ja palautetaan sen suomenkielinen lyhenne
	function name_of_day($name_of_day)
	{
		switch($name_of_day)
		{
			case '0':
				$name_of_day = "Ma";
				break;
			case '1':
				$name_of_day = "Ti";
				break;
			case '2':
				$name_of_day = "Ke";
				break;
			case '3':
				$name_of_day = "To";
				break;
			case '4':
				$name_of_day = "Pe";
				break;
			case '5':
				$name_of_day = "La";
				break;
			case '6':
				$name_of_day = "Su";
				break;
		}
		return $name_of_day;

	}
        //nykyisen kuukauden päivät
	$days_in_this_month = date("t");
        //tulostetaan nykyinen kuukausi ja vuosi
	echo "<center><b>$name_of_month $n_year</b></center>";
	echo "<table border='0' align='center'><tr>";
        //tulostetaan jokaisen viikonpäivän lyhenne
	for($i = 0; $i < 7; $i++)
	{
		$name_of_day = name_of_day($i);
		echo "<td><small>$name_of_day</small></td>";

	}
	echo "</tr>";
        //mennään silmukkaan, joka toistuu 5 kertaa, sillä 5*7 = 35 ja kuukaudessa on maksimissaan 31 päivää
	for($i = 0; $i < 5; $i++)
	{
                //muunnetaan käsittelyssä oleva päivämäärä merkkijonoksi ($o lisääntyy alempana)
		$b = strtotime(date("$o.m.Y"));
                //otetaan $b:stä käsittelyssä olevan päivämäärän viikonpäivän numero
		$a = date("w", $b);
                //otetaan $b:n kuukaudesta päivien määrä
		$days_in_this_month = date("t", $b);
		echo "<tr>";
                //viikko-silmukka
		for($n = 1; $n <= 7; $n++)
		{
                        //jos viikonpäivä on isompi kuin $a, joka on viikonpäivän numero käsittelyssä olevasta päivämäärästä, jos ei, tulostetaan tyhjä taulukon solu
			if($n >= $a)
			{
                                //lisätään päivämäärää
				$o++;
                                //jos päivämäärä on pienempi tai yhtäkuin nykyisen kuukauden päivät...
				if($o <= $days_in_this_month)
				{
                                        //...ja jos päivä on sama kuin nykyinen päivä....
					if($o == $n_day)
					{
                                                //...tulostetaan lihavoitu luku
						echo "<td width='60' height='60'><b>$o</b></td>";
					}
					else
					{
                                                //...tulostetaan normaali luku
						echo "<td width='60' height='60'>$o</td>";
					}
				}
				else
				{
					break;
				}
			}
			else
			{
				echo "<td width='60' height='60'></td>";
			}
		}
		echo "</tr>";
	}
	echo "</table>";
?>

Ja nyt itse ongelmaan. Siis, nyt jos tuon koodin laittaa php-tiedostoon ja katsoo, näkee tammikuun 2009 kalenterin, nykyisen päivän vahvistettuna. Jopa päivät osuvat viikonpäivien kohtaan. Mutta sitten, siirretään tietokoneen kelloa kuukaudella eteenpäin, ja mitä näemmekään, kalenteri näyttää aivan väärin. Helmikuun ensimmäisen päivänhän tulisi olla sunnuntai, ei torstai kuten tammikuussa, eikä kalenterissa tunneta kahta tyhjää päivää keskellä viikkoa.

Itse olen nyt pähkäillyt ainakin päivän että miten sen saisi näyttämään joka kuukaudelle oikein, mutta ainoastaan tammikuu näkyy oikein. Jatkan vielä pähkäilyä, mutta toivon että joku voisi tässä asiassa auttaa :)

Pyydän anteeksi jos koodini näyttää epäselvältä, koitan kommentoida selityksiä.

Lebe80 [20.01.2009 21:30:02]

#

Kuukaudet ja päivät kannattaa pistää johonkin array-muuttujaan, jolloin ei tarvi millään if-else switch-caseilla leikkiä.

erakko- [20.01.2009 21:57:52]

#

Ilmoitan vielä että tällä hommalla on pienoinen kiire, en panosta ketään, mutta toivon kovasti että apua löytyisi nopeasti.

Teinpä huvikseen vielä yhden testin. Siinä käytiin for-silmukalla 7 päivää läpi, tyyliin näin:

<?php
for($i = 0; $i < 7; $i++)
{
    $paivays = strtotime(date("{$i}.m.Y"));
    $viikonpaiva = date("w", $paivays);
    echo $viikonpaiva."<br>";
}
?>

Tämä toimi oikein, se antoi oikean viikonpäivän, jopa samalle päivämäärälle kuin mitä käyn läpi tällä kalenterikoodilla, johon se jostain syystä tulee väärin. Mietin vain, että mistä se voi mennä sekaisin, että antaa joka ikisillä kerralla neljän, eli torstain vastaukseksi...

trilog [20.01.2009 22:09:24]

#

erakko- kirjoitti:

Mutta sitten, siirretään tietokoneen kelloa kuukaudella eteenpäin, ja mitä näemmekään, kalenteri näyttää aivan väärin.

Oletko siis palvelimen vai koneen, jolla katselet sivua kelloa siirtänyt?

Lebe80 kirjoitti:

Kuukaudet ja päivät kannattaa pistää johonkin array-muuttujaan, jolloin ei tarvi millään if-else switch-caseilla leikkiä.

Laitetaan vielä esimerkki tuosta 'name_of_day' -funktiosta:

<?php
function name_of_day($nod) {
    $values = array('ma','ti','ke','to','pe','la','su');
    return (isset($values[$nod]) ? $values[$nod] : False);
}
?>

Samaa voi soveltaa muihinkin.

erakko- [20.01.2009 22:25:08]

#

trilog kirjoitti:

Oletko siis palvelimen vai koneen, jolla katselet sivua kelloa siirtänyt?

Koneen.

Jälleen edennyt hieman lisää. Huomasin, että 1-9 lukujen edessä on oltava nolla ($o muuttujassa siis), ja nyt sen lisättyä loput päivistä näkyvät oikein (kuulostaa ehkä oudolta mutta näin se vaan on :/). Ainoastaan kuukauden ensimmäisen viikon 1-4 päivää (aina torstai-sunnuntai) pysyvät edelleen samoina. Jokin tuntuu ensimmäisellä rivillä sekoittavan viikonpäivän, pitää vain keksiä että mikä...

Metabolix [20.01.2009 22:41:12]

#

Toivottavasti tiedät, että PHP-skriptien aikatietoihin ei vaikuta kuin palvelimen kello.

Annan saman ohjeen kuin edellisessä vastaavassa ketjussa: käsittele aikoja sisäisesti vain aikaleimoina ja tee tarvittavat muunnokset niissä yksittäisissä kohdissa, joissa dataa pitää tulostaa tai lukea. Siellä tulikin jo todistettua, että aikaleimasta tulee aivan oikeita päiviä ja viikkoja. Voit helposti soveltaa ongelmaasi sinne lähettämääni koodia.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta