Kalendar, vykreslitelna komponenta
- MelkorNemesis
- Člen | 36
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!">< previous month</a> <a n:href="nextMonth!">next month ></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"> </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> </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"> </td>
{/for}
{/if}
</tr>
</table>
?>
Editoval MelkorNemesis (29. 7. 2011 23:21)
- Filip Procházka
- Moderator | 4668
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
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
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
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
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
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.