Crearea unui calendar in PHP

Post Title

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 metoda setDate() a clasei DateTime vom construi un obiect DateTime prin specificarea anului $this->year, lunii $this->month si o anumita zi din luna, in cazul nostru chiar prima zi 1.Acest nou obiect, DateTime, ce reprezinta data specificata, este atribuit variabilei $date.

  • $this->daysInMonth = $date->format('t'); - Folosind variabila $date accesam metoda format() a obiectului DateTime specificand un anumit format t.Formatam data specificata mai sus astfel incat sa primim ca raspuns numarul de zile al lunii, acel t reprezetand acest format.

  • $dayWhenMonthStarts = $date->format('N'); - Folosind un nou format N primim ca raspuns numeric in ce zi din saptamna incepe luna.De aceea atunci cand am creat un nou obiect DateTime folosind metoda setDate(), am specificat ziua 1 ( 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.Functia array_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 functia array_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.

enter image description here

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.

enter image description here

Resurse:

Data si diferite formate de afisare in PHP

Obiectul DateTime in PHP

Cam atat cu acest tutorial, sper ca va este de folos!

Autor articol
David: Why do you want to leave me? Why? I'm sorry I'm not real! If you let me, I'll be so real for you!

Comentarii

Comentariu adaugat de Anghel_Florin
Felicitari pentru articol. 

Intre articolul tau si intrebarea mea, este o distanta de 1 an si 10 luni.

Am o intrebare destul de simpla pentru tine: pentru acest cod, ai folosit cumva PHpStorm?

Dupa ce l-ai facut, ai mers pe mana lui Sublime la teste?

Multumesc anticipat.
go to page top Anghel_Florin | 2018-12-12
Comentariu adaugat de Catalin
Ai dreptate tu, pe viitor voi tine cont, multumesc pentru parerea ta onesta!
go to page top Catalin | 2017-03-01
Comentariu adaugat de soluicius
Super articolul. O mica sugestie: Ar fi mai usor de urmarit daca nu ai repeta quote-ul ci pur si simplu ai pune numai modificarile . Ar fi mai mic articolul si mai usor de urmarit.
go to page top soluicius | 2017-03-01
Comentariu adaugat de marian
Bravo Catalin!
go to page top marian | 2017-03-01

Exista 4 comentarii   

  • 1
Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top