Jednoduchý kalendář, přes funkci v Modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
kralik
Člen | 230
+
0
-

Ahoj Netťáci,
sháněl jsem jednoduchý kalendář a nějak se mi to nepodařilo, tak jsem zkusil jeden kalendářík (opravdu simply) dát dohromady.

Doufám, že se to někomu z vás bude hodit.

Verze: PHP 5.3.5, Nette Framework 2.0.3 (revision eb558ae released on 2012–04–04)

Původní verze: zde

V modelu:

<?php
public static function kalendar($mesic,$rok){

          $kalendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

          /* hlavicka tabulky */
          $kalendar = '<table cellpadding="0" cellspacing="0" class="calendar">';
          $hlavicka = array('Po','Út','St','Čt','Pá','So','Ne');
          $kalendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$hlavicka).'</td></tr>';

          $start = date('N',mktime(0,0,0,$mesic,1,$rok)); // prvni den v mesici
          $pocetDni = date('t',mktime(0,0,0,$mesic,1,$rok)); // počet dni mesici
          $dniVtydnu = 1;


          $kalendar.= '<tr class="calendar-row">';
          // prazdne bunky pred 1.
          for($x = 1; $x < $start; $x++):
             $kalendar.= '<td class="calendar-day-np">&nbsp;</td>';
            $dniVtydnu++; //,
          endfor;

          for($den = 1; $den <= $pocetDni; $den++):
              if($dniVtydnu <= 7){ //tyden ma 7 dni
                 $kalendar.= '<td class="calendar-day">';
		//pro ukazku je zde uveden i mozny odkaz
                 $kalendar.= '<a href="kalendar?datum='.$rok.'-'.$mesic.'-'.$den.'"><div class="day-number">'.$den.'</div></a>';
                 $dniVtydnu++; //,
              }

              if($dniVtydnu > 7){ //tyden ma 7 dni
                 if($den!=$pocetDni){
                  $kalendar.= '<tr class="calendar-row">';
                  $dniVtydnu=1; //,
                  }
              }

           endfor;
           // prazdne bunky za poslednim dnem v mesici
           for($y = $dniVtydnu-1; $y < 7; $y++):
             $kalendar.= '<td class="calendar-day-np">&nbsp;</td>';
           endfor;

          $kalendar.= '</tr>';
          $kalendar.= '</table>';

          return $kalendar;

    }
?>

V presenteru

<?php
public function renderKalendar()
    {
        $mesic = date('n');
        $rok = date('Y');
        $cal= Funkce::kalendar($mesic,$rok);

        $this->template->cal = $cal;
        $this->template->mesic = $mesic;
	$this->template->rok = $rok;

    }
?>

V šabloně .latte

<?php
<h2>Měsíc: {$mesic}/{$rok}</h2>
{!$cal}
?>

CSS

<?php
/* kalendar */
table.calendar    { border-left:1px solid #999; }
tr.calendar-row  {  }
td.calendar-day  { min-height:30px; font-size:11px; position:relative; } * html div.calendar-day { height:30px; }
td.calendar-day:hover  { background:#eceff5; }
td.calendar-day-np  { background:#DADADA; min-height:30px; } * html div.calendar-day-np { height:30px; }
td.calendar-day-head { background:#fff; color: #3791D7; font-weight:bold; text-align:center; width:30px; padding:5px; border-bottom:1px solid #4B9BEB; border-top:1px solid #4B9BEB; border-right:1px solid #4B9BEB; }
div.day-number    { background:#3791D7; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
/* shared */
td.calendar-day, td.calendar-day-np { width:30px; padding:5px; border-bottom:1px solid #4B9BEB; border-right:1px solid #999; }
table.calendar a {
    text-decoration: none;
    color: #FFF;
}
?>

Editoval kralik (20. 7. 2012 9:58)

Ot@s
Backer | 476
+
0
-

Aj HTML v modelu… To není košer. Raději kaledář udělej jako komponentu (HTML v template).

Filip Procházka
Moderator | 4668
+
0
-

Otřesné. Opravdu otřesné.

Rozděl to na komponentu, šablonu a nějaký model co počítá ty dny.

Tomáš Votruba
Moderator | 1114
+
0
-

K inspiraci se můžeš kouknout na tuto komponentu, kterou jsem kdysi zkusil rozjet.