Crearea unui calendar in PHP
Salut tuturor, astazi va voi arata cum sa creati un calendar simplu in PHP folosind stilul de programare orientat pe obiecte.
Avem nevoie de doua fisiere:
- Calendar.php - in acest fisier vom crea clasa Calendar folosita de noi.
- index.php - in acest fisier vom testa totul.
Calendar.php
<?php
class Calendar extends DateTime
{
}
Dupa cum putem vedea, in prima instanta aceasta clasa se foloseste de mostenire pentru a avea acces la metodele si proprietatile clasei DateTime.
Obiectul DateTime
ne faciliteaza lucru cu data si timpul, oferind o interfata foarte simpla.
<?php
class Calendar extends DateTime
{
/**
* @var $year integer
*/
protected $year;
/**
* @var $month integer
*/
protected $month;
/**
* @var $daysOfTheWeek array
*/
protected $daysOfTheWeek = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
];
/**
* @var $daysInMonth integer
*/
protected $daysInMonth = 0;
/**
* @var $weeks array
*/
protected $weeks = [];
}
Proprietatea $year
este folosita pentru a stoca anul ales de noi in format numeric.
Proprietatea $month
este folosita pentru a stoca luna aleasa de noi in format numeric.
Vrem sa afisam toate zielele din luna aleasa de noi, din anul specificat.
Proprietatea $daysOfTheWeek
este o matrice ce stocheaza ca elemente numele fiecarei zi a saptamanii ( acesta este calendarul folosit in USA, astfel, duminica apare ca prima zi )
In proprietatea $daysInMonth
vom stoca numarul total de zile din luna specificata.
Proprietatea $weeks
va fi folosita pentru a stoca ca elemente alte matrici ce contin ca elemente zilele lunii, fiind maxim 7 valori ( zile ) pe matrice.
<?php
class Calendar extends DateTime
{
/**
* @var $year integer
*/
protected $year;
/**
* @var $month integer
*/
protected $month;
/**
* @var $daysOfTheWeek array
*/
protected $daysOfTheWeek = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
];
/**
* @var $daysInMonth integer
*/
protected $daysInMonth = 0;
/**
* @var $weeks array
*/
protected $weeks = [];
/**
* @param $month integer
*/
public function setMonth($month)
{
$this->month = $month;
}
/**
* @return integer
*/
public function getMonth()
{
return $this->month;
}
/**
* @param $year integer
*/
public function setYear($year)
{
$this->year = $year;
}
/**
* @return integer
*/
public function getYear()
{
return $this->year;
}
/**
* @param $daysOfTheWeek array
*/
public function setDaysOfTheWeek(array $daysOfTheWeek)
{
$this->daysOfTheWeek = $daysOfTheWeek;
}
/**
* @return array
*/
public function getDaysOfTheWeek()
{
return $this->daysOfTheWeek;
}
}
Dat fiind faptul ca proprietatile noastre au modificatorul de access protected
, ceea ce inseamna ca nu pot fi accesate din exteriorul clasei, am creat aceste metode numite metode de atribuire si preluare a valorilor proprietatilor ( setters and getters ).
Acest concept este cunoscut sub numele de INCAPSULARE
si prespune ca modificare si preluarea valorilor proprietatilor sa se faca doar prin intermediul metodelor.Evident, proprietatile trebuie sa aiba un modificator de acces diferit de public
astfel incat acestea sa nu poata fi accesate din exteriorul clasei.
Fiind un tutorial cat mai simplu, nu vom face verificarile necesare, de exemplu, trebuie sa ne asiguram ca atat luna cat si anul au valori numerice intregi etc.
<?php
class Calendar extends DateTime
{
/**
* @var $year integer
*/
protected $year;
/**
* @var $month integer
*/
protected $month;
/**
* @var $daysOfTheWeek array
*/
protected $daysOfTheWeek = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
];
/**
* @var $daysInMonth integer
*/
protected $daysInMonth = 0;
/**
* @var $weeks array
*/
protected $weeks = [];
/**
* @param $month integer
*/
public function setMonth($month)
{
$this->month = $month;
}
/**
* @return integer
*/
public function getMonth()
{
return $this->month;
}
/**
* @param $year integer
*/
public function setYear($year)
{
$this->year = $year;
}
/**
* @return integer
*/
public function getYear()
{
return $this->year;
}
/**
* @param $daysOfTheWeek array
*/
public function setDaysOfTheWeek(array $daysOfTheWeek)
{
$this->daysOfTheWeek = $daysOfTheWeek;
}
/**
* @return array
*/
public function getDaysOfTheWeek()
{
return $this->daysOfTheWeek;
}
public function create()
{
// se creaza un obiect DateTime pentru data specificata
$date = $this->setDate($this->year, $this->month, 1);
// folosind noul obiect DateTime preluam numarul de zile pentru luna specificata
$this->daysInMonth = $date->format('t');
// preluam in format numeric ziua din saptamana in care luna incepe
$dayWhenMonthStarts = $date->format('N');
// stocam in aceasta matrice valori '' ce semnifica zilele din saptamana pana in ziua in care luna incepe
$days = array_fill(0, $dayWhenMonthStarts, '');
// adaugam in $days toate zilele lunii
for ($x = 1; $x <= $this->daysInMonth; $x++) {
$days[] = $x;
}
// impartim matricea $days in matrici ce au maximum 7 elemente, reprezetand saptamanile
$this->weeks = array_chunk($days, 7);
}
/**
* @return array
*/
public function getWeeks()
{
return $this->weeks;
}
}
In continuare, in ultima metoda adaugata, parcurgem pasii necesari pentru ca in final sa construim o matrice ce contine ca elemente alte matrici ce au maximum 7 valori, fiecare valoare reprezetand o zi din luna speficiata.
-
$date = $this->setDate($this->year, $this->month, 1);
- Pe acest rand folosind metodasetDate()
a claseiDateTime
vom construi un obiectDateTime
prin specificarea anului$this->year
, lunii$this->month
si o anumita zi din luna, in cazul nostru chiar prima zi1
.Acest nou obiect,DateTime
, ce reprezinta data specificata, este atribuit variabilei$date
. -
$this->daysInMonth = $date->format('t');
- Folosind variabila$date
accesam metodaformat()
a obiectuluiDateTime
specificand un anumit formatt
.Formatam data specificata mai sus astfel incat sa primim ca raspuns numarul de zile al lunii, acelt
reprezetand acest format. -
$dayWhenMonthStarts = $date->format('N');
- Folosind un nou formatN
primim ca raspuns numeric in ce zi din saptamna incepe luna.De aceea atunci cand am creat un nou obiectDateTime
folosind metodasetDate()
, am specificat ziua1
( ne intereseaza pe cat "cade" 1 ) -
$days = array_fill(0, $dayWhenMonthStarts, '');
- In variabila$days
vom stoca o matrice ce are ca elemente valori''
ce reprezinta zilele din saptamna pana in ziua in care luna incepe.Functiaarray_fill(index, elements, value)
creaza o matrice specificand index-ul de la care sa porneasca, cate elemente sa adauge si valoarea acelor elemente. - In contiuare, folosind o structura repetitiva
for
, adaugam in variabila$days
, ce este o matrice, fiecare zi a lunii sub forma de elemente in aceasta matrice.
for ($x = 1; $x <= $this->daysInMonth; $x++) {
$days[] = $x;
}
$this->weeks = array_chunk($days, 7);
- Folosind functiaarray_chunk(array, elements)
vom imparti matricea$days
in alte matrici, fiecare matrice avand maxim 7 elemente, fiecare element reprezetand o zi din luna.Vom stoca noua matrice in proprietatea$weeks
.
Dupa cum putem observa, am mai adaugat si metoda getWeeks()
, metoda ce returneaza continutul proprietatii $weeks
.
Cam atat cu aceasta clasa, evident ea poate fi cu mult imbunatatita.
In continuare, ne vom concentra pe fisierul index.php
<?php
// includem clasa Calendar
require 'Calendar.php';
// cream un obiect din acesta clasa
$calendar = new Calendar();
// setam anul dorit
$calendar->setYear(2017);
// setam luna dorita
$calendar->setMonth(2);
// cream calendarul
$calendar->create();
?>
<!DOCTYPE html>
<html>
<head>
<title>PHP - Calendar</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<table class="table table-bordered">
<tr>
<?php foreach ($calendar->getDaysOfTheWeek() as $day): ?>
<th>
<?php echo $day; ?>
</th>
<?php endforeach;?>
</tr>
<?php foreach ($calendar->getWeeks() as $week): ?>
<tr>
<?php foreach ($week as $day): ?>
<td>
<?php echo $day; ?>
</td>
<?php endforeach; ?>
</tr>
<?php endforeach;?>
</table>
</div>
</body>
</html>
Dupa cum putem observa, folosim bootstrap 4, fiind un framework CSS.Am creat un element HTML, table
, structurat pe randuri si coloane.Folosindu-ne de metodele obiectului Calendar
am populat acest tabel.
Aceasta este produsul final a ceea ce am realizat.Putem observa calendarul pentru luna curenta.
Pentru a afisa calendarul in limba romana, trebuie facute anumite modificari.In primul rand, zilele saptamanii trebuie adaugate in limba romana, incepand cu ziua luni.Apoi, in metoda create()
trebuie sa modificam
$dayWhenMonthStarts = $date->format('N');
cu
$dayWhenMonthStarts = $date->format('N') - 1;
Facem acest lucru deoarece am schimbat ordinea zilelor in calendar.
Resurse:
Data si diferite formate de afisare in PHP
Cam atat cu acest tutorial, sper ca va este de folos!