Kalendar, vykreslitelna komponenta

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

Na nette webu nejede stranka, ktera ma obsahovat navod jak pridat addon, tak to hodim sem.
Je to jednoduchy kalendar, ktery se umi posouvat po mesicich vpred a zpet. Jeste nez ho budu dal upravovat pro svoje dalsi potreby, tak jeho zakladni verzi, ktera opravdu jen vypise kalendar, hodim sem.

Calendar.php

<?php

class Calendar extends \Nette\Application\UI\Control
{

    /** @persistent */
    public $month;

    /** @persistent */
    public $year;


    public function __construct(\Nette\ComponentModel\IContainer $parent = NULL, $name = NULL)
    {
	parent::__construct($parent, $name);

	$this->year = $this->getParam('year', date("Y"));
	$this->month = $this->getParam('month', date("n"));
    }


    public function render()
    {
	$template = parent::createTemplate();
	$template->setFile(__DIR__ . '/calendar.latte');

	/* days and weeks vars now ... */
	$template->running_day = date('w',mktime(0,0,0,$this->month,1,$this->year));
	$template->days_in_month = date('t',mktime(0,0,0,$this->month,1,$this->year));
	$template->days_in_this_week = 1;
	$template->day_counter = 0;
	$template->headings = array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
	$template->year = $this->year;
	$template->month = $this->month;

	$template->render();
    }


    /**
     * Switch to next month.
     */
    public function handleNextMonth()
    {
	$this->month++;

	if ($this->month == 13) {
	    $this->month = 1;
	    $this->year++;
	}

	$this->presenter->redirect('this');
    }


    /**
     * Switch to previous month.
     */
    public function handlePrevMonth()
    {
	$this->month--;

	if ($this->month == 0) {
	    $this->month = 12;
	    $this->year--;
	}

	$this->presenter->redirect('this');
    }

}
?>

calendar.latte

<?php

<style type="text/css">
    /* calendar */
    table.calendar { border-left:1px solid #999; }
    tr.calendar-row {  }
    td.calendar-day { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
    td.calendar-day:hover { background:#eceff5; }
    td.calendar-day-np { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
    td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
    div.day-number { background:#999; 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:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
</style>

<h1>{$month}/{$year}</h1>
<a n:href="prevMonth!">&lt; previous month</a>    <a n:href="nextMonth!">next month &gt;</a>

<table cellpadding="0" cellspacing="0" class="calendar">
    <tr class="calendar-row"><td class="calendar-day-head">{!$headings|implode:'</td><td class="calendar-day-head">'}</td></tr>
    <tr class="calendar-row">

    {* print "blank" days until the first of the current week *}
    {for $x = 0; $x < $running_day; $x++}
	<td class="calendar-day-np">&nbsp;</td>
	{?$days_in_this_week++}
     {/for}

    {* keep going with days.... *}
    {for $list_day = 1; $list_day <= $days_in_month; $list_day++}
	<td class="calendar-day">
	    {* add in the day number *}
	    <div class="day-number">{$list_day}</div>

	    {** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !!  IF MATCHES FOUND, PRINT THEM !! **}
	    {!=str_repeat('<p>&nbsp;</p>', 2)}
	</td>

	{if $running_day == 6}
	    </tr>

	    {if ($day_counter + 1) != $days_in_month}
		<tr class="calendar-row">
	    {/if}

	    {? $running_day = -1}
	    {? $days_in_this_week = 0}
	{/if}
	{? $days_in_this_week++} {? $running_day++} {? $day_counter++}
    {/for}

    {* finish the rest of the days in the week *}
    {if $days_in_this_week < 8}
	{for $x = 1; $x <= (8 - $days_in_this_week); $x++}
	  <td class="calendar-day-np">&nbsp;</td>
	{/for}
    {/if}

    </tr>
</table>

?>

Nahled kalendare

Editoval MelkorNemesis (29. 7. 2011 23:21)

Filip Procházka
Moderator | 4668
+
0
-

Vzhled hodnotit nebudu, protože si to každý může nastylovat jak chce :)

Přejdi na stránku libovolnou stránku, třeba https://componette.org/search/?…, zkopíruj si začátek libovolné komponenty (texy zdroj) a přepiš údaje (aby jsi se nemusel štvát s tabulkou :).

MelkorNemesis
Člen | 36
+
0
-

HosipLan: jojo, o vzhled ani nejde – navic ten vzhled ani neni muj, jen sem to okopiroval.
Diky, jdu to pridat do addonu :)

Filip111
Člen | 244
+
0
-

Ahoj, komponentu kalendáře jsem zprovoznil, ale potřebuji ji nějak spojit s akcemi uloženými v DB.
Co je myšleno tím dotazem volaném ze šablony?

{** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !! IF MATCHES FOUND, PRINT THEM !! **}

Někde jsem konstrukci sql dotazu volaného ze šablony už viděl, ale teď to nemůžu najít.
Můžu poprosit o jednoduchý příklad?

Tomáš Votruba
Moderator | 1114
+
0
-

Kdyby někoho zajímalo propojení s db, zde je adaptovaná komponenta (takhle nějak to pak může v praxi vypadat).

Bazylek
Člen | 22
+
0
-

Prosím o radu jak rozchodit kalendář od Schmutzka.
Ve složce components mam složku Calendar do které jsem vložil:
calendarControl.php
CalendarControl.latte
CalendarControlMini.latte
Do složky models:
CalendarControlModel.php

Do presenteru

public function createComponentCalendarControl()
    {
        $calendarControl = new \CalendarControl();
        //zde bych měl navázat na DB ale nevím jak
       return $calendarControl;
    }

V šabloně mám:
{control calendarControl}

DB tabulky mám navržené:
cms_akce(idakce, nazev, zacatek, konec, zobrazit, vlozil, vlozen, aktivni)

Laděnka mi vyhazuje chybu

Call to undefined function MemberAccessException()
22:        public function __construct($activeMonth)
23:        {
24:            if(!isset($activeMonth)) {
25:                throw MemberAccessException("Missing parameter $activeMonth");
26:            }
27:            parent::__construct();
28:            $this->activeMonth= $activeMonth;
29:        }

Přesně nevím jak mam naplnit proměnné

$activeMonth
$daysCount

Děkuji za každou radu.

Editoval Bazylek (10. 8. 2012 15:47)

Tomáš Votruba
Moderator | 1114
+
0
-

Je tam pár chybek, ale i z toho co píšeš, se dá odvodit, že nepředáváš v konstruktoru aktivní měsíc. Správně by tedy mělo být:

public function createComponentCalendarControl()
{
	$calendarControl = new \CalendarControl("2012-07");
	return $calendarControl;
}

Uprav si to tak, abys db předával také v konstruktoru. Pak s ní může pracovat uvnitř komponenty.