Arhiva za januar, 2010

Ispis i update datuma prvog i poslednjeg dana u nedelji u PHP-u.

utorak, 19. januar 2010.

Pisao sam o sajtu za Anin fitness klub. Iako je završen, shvatili smo da je poprilično dosadno da svakog ponedeljka  ručno menjamo raspored termina treninga. A i ne možemo uvek biti tačni, već često kasnimo, pa datum promenimo u ponedeljak uveče, što zaista deluje neprofesionalno. Zato smo došli na ideju da napišemo skriptu koja će raditi to umesto nas, i tačno na vreme. :)

Aleksandar Saša Babić je preuzeo odgovornost na sebe i napisao odlično parčence koda. :)   Zato reših da ga podelim ovde sa svima, uz njegovu saglasnost naravno, a to će ujedno i biti drugi mini mini php tutorial na blogu (podsetnik:  link ka prvom).

Zadatak: Napraviti skriptu koja će ispisivati datum ponedeljka, datum nedelje, a kada se ta nedelja završi, skripta treba automatski da promeni datum i ponedeljka i nedelje, tako da raspored bude uvek up-to-date!


Ideja: Ceo problem se rešava utvrđivanjem da li je trenutni dan ponedeljak ili ne. Zato, ukoliko je dan kada korisnik poseti sajt ponedeljak, skripta će preko funkcije gettime() ispisati današnji datum, a ako tad nije ponedeljak, već neki drugi dan, skripta će uzeti datum ponedeljka iz te, tekuće nedelje.

Koji je danas dan? Pozivanjem funkcije getdate() možemo to saznati. Ona vraća niz koji se sastoji od sledećih podataka:
Array
(
[seconds] => 40
[minutes] => 58
[hours] => 21
[mday] => 17
[wday] => 2 //dan u nedelji !
[mon] => 6
[year] => 2003
[yday] => 167
[weekday] => Tuesday
[month] => June
[0] => 1055901520
)

Evo i koda:

<?php
$danas = getdate();
//ukoliko je getdate vratio vrednost 1 za wday, to znači da je ponedeljak(0 je nedelja, 1 ponedeljak, 2 utorak...), pa ćemo zato iskoristiti taj datum
//ukoliko nije 1 (to znači da nije ponedeljak, pa ćemo zato uzeti poslednji (vremenski najbliži) ponedeljak, last monday
//moramo iskoristiti i strtotime (ova f-ja ce string last monday prebaciti u timestamp).
$ponedeljak = ($danas['wday'] == 1) ? $danas[0] : strtotime('last monday');
//timestamp ponedeljka pa jos dodajemo 60sekundi X 60 minuta X 24h X 6dana, tj. vreme da bismo dobili nedelju
$nedelja = $ponedeljak + (60*60*24*6);
?>
<h2>Raspored (<?php echo date('d.m.Y', $ponedeljak); ?> do <?php echo date('d.m.Y', $nedelja); ?> </h2>

Pre svega, želeo bih da objasnim da linija:

$ponedeljak = ($danas['wday'] == 1) ? $danas[0] : strtotime('last monday');

vrši isti posao kao i ovih par:

<?php
 if ($danas['wday'] == 1) {
 $ponedeljak = $danas[0];
 } else {
 $ponedeljak = strtotime('next sunday');
 }
?>

Naravno, prvi oblik je mnogo kraći, pa je zato praktičniji. On zapravo znači sledeće:

$variable = (statement) ? "return if true" : "return if false";

Kada smo odredili vrednosti za naše promenljive, ostalo je još da ih konvertujemo u vreme koje čovek može da razume, s obzirom da one prikazuju timestamp.

Timestamp je vreme koje je prošlo od ponoći 1. januara 1970.  u sekundama. Primera radi, 18. januara 2010. u 01.45h $ponedeljak  ima vrednost 1263772800 (toliko sekundi je prošlo od 1. januara 1970).

Konverziju ćemo uraditi funkcijom date(‘d.m.Y’, $neko-vreme), gde je:
d – dan, m-mesec, Y-godina. Naravno, evo kako izgleda konvertovani $ponedeljak: 18.01.2010.

Time smo postigli ono što smo želeli – skripta sama piše i menja datum.