EventCalendar – kalendář s přehledem akcí
- kubajz
- Člen | 47
Pro webové stránky, na kterých pracuji, jsem potřeboval vytvořit kalendář, kde se dá posouvat měsíci a u jednotlivých dnů se zobrazí události. Protože jsem tu žádný takový doplněk nenašel, napsal jsem si vlastní komponentu a když už jsem byl u toho, zkusil jsem ji udělat trochu univerzálněji.
Sem jsem hodil
nějaké info & demo (aktuální info v doplňcích), kdyby
to někomu přišlo životaschopné, vítám i případné pozměňovací
návrhy, v Nette jsem doma jen krátce, takže budu jedině rád.
U kalendáře jde nastavit, kterým dnem má začínat, jazyk (CZ/EN/vlastní), kde se mají zobrazit kontrolní tlačítka a jaký má být jejich textový obsah.
Zdrojové soubory zde.
Zrovna před týdnem se tu jeden návrh kalendáře podobného typu objevil, takže se omlouvám za nechtěnou konkurenci ;)
Editoval kubajz (13. 5. 2013 1:16)
- Tomáš Votruba
- Moderator | 1114
Pěkné a rychlé demo. Hoď to do doplňků, kde by se hodilo sepsat pár krátkých návodů, jak čeho dosáhnout a co je k tomu potřeba.
- Hodila by se možnost kliknout na daný datum a dostat jej do presenteru, kde by se s ním nějak pracovalo, např. se vypsaly dané akce apod.
- Jazykové verze by možná neuškodilo mít v nějakých externích
souborech (neon syntax) místo
getNames()
, ušetřilo by se tím místo v controlu a usnadnila použitelnost.
P.S.: Konkurence je super způsob vývoje věcí a možnost inspirace, jen tak dál :).
- kubajz
- Člen | 47
Na stránku doplňků mě to momentálně nepustí (asi jak jsem krátce registrován), tak to zatím napíšu sem. Za všechny návrhy děkuju, zkusím si s tím pohrát. Současný stav považuji za verzi 0.1, takže kdybych něco provedl, upozorním na to a změním i číslo verze.
Použití komponenty EventCalendar:
pro základní použití stačí např. napsat továrničku na komponentu:
createComponentCalendar() {
$cal = new EventCalendar();
$cal->setEvents(new EventModel());
return $cal;
}
tento kód vytvoří kalendář s anglickými názvy dnů a měsíců a týden bude začínat nedělí, navigační tlačítka posouvající měsíci budou zobrazena nahoře i dole
pro český formát kalendáře je nutné následující:
$cal->setLanguage(EventCalendar::CZECH); // české názvy měsíců a dnů
$cal->setMode(EventCalendar::FIRST_MONDAY); // týden začne pondělkem
pokud budu chtít z jakéhokoliv důvodu vlastní názvy dnů a měsíců (jiný jazyk, nekrácené názvy dnů apod.):
$cal->setLocalNames(array(
"monthNames" => array(1 => "Enero", "Febrero", "Marzo", "Abril", "Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"),
"wdays" => array("Lu","Ma","Mi","Ju","Vi","Sá","Do")
));
výše uvedeným například nastavím názvy dnů a měsíců do španělštiny
pozměnit mohu i výchozí navigaci, tímto se zbavím dolních tlačítek pro změnu měsíce:
$cal->setOptions(array("showBottomNav"=>FALSE));
nebo změním text horních tlačítek z << a >> na prázdný řetězec (a pomocí css si pak nastavím třeba obrázek):
$cal->setOptions(array("topNavPrev"=>"","topNavNext"=>""));
samotný model událostí pro kalendář pak musí implementovat toto rozhraní:
interface IEventModel {
/**
* zjistí, zda pro daný den existuje událost
* @return boolean
*/
public function isForDate($year,$month,$day);
/**
* vrátí pole událostí pro daný den
* @return array
*/
public function getForDate($year,$month,$day);
}
Poznámka: obou metodám v tuto chvíli předává komponenta měsíce a dny bez nul – např. pro leden 1 nikoli 01
CSS třídy ke stylování:
eventCalendar – div obalující celý kalendář
ec-monthTable – tabulka kalendáře
ec-validDay – den v měsíci
ec-eventDay – den, pro který existuje nějaká událost (zároveň obaluje
události daného dne)
ec-empty – buňka tabulky, která neobsahuje žádný den (=jiný
měsíc)
ec-dayOfEvents – třída pro samotný den (není rodičem pro div, který
obaluje události dne, ale sourozencem)
ec-eventBox – div obal pro události dne
ec-event – obsahuje jednotlivou událost
výpis událostí se ve skutečnosti vypíše dovnitř buňky s daným dnem a pomocí css je pak pozicujeme
příklad stylů jsem hodil na github
- kubajz
- Člen | 47
motorcb: mezi své komponenty, tedy v případě, že nepoužíváš moduly aj. tak do složky app/components, interface mezi modely (app/models, tam bude pravděpodobně i tvá třída implementující toto rozhraní) a pokud použiješ ukázkové styly, tak ty samozřejmě mezi své ostatní styly ;)
- kubajz
- Člen | 47
Do budoucna mě napadly tyto věci:
- možnost po kliknutí na den poslat JSON s událostmi pro daný den (pouze pokud by šlo o AJAX požadavek)
- možnost předat Nette\Security\User a vykreslit události podle id a role uživatele
Výpis samotných událostí není escapován, odkaz na událost si tak lze dle mého názoru zkonstruovat již dnes.
Pokud bude někoho tento doplněk zajímat, mě bude zajímat názor na
přidání těchto funkcionalit (vyžádalo by si to změnu modelu).
Všem díky za tipy.
- revoke
- Člen | 36
O implementaci rozhraní je tu toho zmíněno málo (a začátečníci
tápou :-). Můžete to prosím doplnit? Díky moc.
Předpokládám, že by to mělo být nějak takhle:
models/IEventModel.php
<?php
interface IEventModel {
/**
* zjistí, zda pro daný den existuje událost
* @return boolean
*/
public function isForDate($year,$month,$day);
/**
* vrátí pole událostí pro daný den
* @return array
*/
public function getForDate($year,$month,$day);
}
a model/Calendar.php
<?php
class EventModel extends Nette\Object implements IEventModel
{
public function __construct()
{
}
}
To ale vrací error: Class EventModel contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (IEventModel::isForDate, IEventModel::getForDate)
- Vojtěch Dobeš
- Gold Partner | 1316
@revoke Je to interface, takže v implementující třídě bude třeba ty dvě metody implementovat :).
- kubajz
- Člen | 47
Toto je otázka znalosti možností, které nabízí PHP5, nikoliv Nette, dostatečně vyčerpávající je k tématu rozhraní samotný manuál PHP Navíc ten chybový výpis už sám řekl, co PHP od tebe chce ;)
- kubajz
- Člen | 47
Opraveno, na githubu již je opravená verze souboru EventCalendar.php , která váš problém řeší. Omlouvám se za chybu a díky za upozornění!
- motorcb
- Člen | 552
Prosím o vysvětlení jak na to:
model/EventModel.php:
<?php
class EventModel extends Nette\Object implements IEventModel
{
public function __construct()
{
}
}
Class EventModel contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (IEventModel::isForDate, IEventModel::getForDate)
Co a jak upravit aby to fungovalo? Trochu v tom tápu… Díky
- MW
- Člen | 626
Poznámka: obou metodám v tuto chvíli předává komponenta měsíce a dny bez nul – např. pro leden 1 > nikoli 01, pokud vám to nevyhovuje, nuly si můžete snadno doplnit např. pomocí Strings::padLeft
Muzu poprosit o radu, kde a jak toto presne pouzit? Potrebuji se v db
dotazovat s nulami ..
Diky!
Editoval MW (14. 1. 2013 21:31)
- kubajz
- Člen | 47
Strings::padLeft použiješ ve třídě, která implementuje IEventModel, aby toto a podobné problémy byly jasné, přichystám v následujících dnech demo i se zdrojovými kódy, kde by mělo být zobrazeno i to, jak získávat z databáze události jen aktuálně potřebné události – pro aktuální měsíc.
jak to může vypadat:
<?php
class EventModel extends Nette\Object implements IEventModel
{
public function getForDate($year,$month,$day) {
$month = Strings::padLeft($month,2,'0');
}
public function isForDate($year,$month,$day) {
// nějaký kód
}
// další metody
}
?>
Alternativa pomocí čístého PHP:
<?php
public function getForDate($year,$month,$day) {
$dateWhichIsUsefullForDb = sprintf("%04d-%02d-%02d", $year, $month, $day);
// tento kód vrací datum ve formátu RRRR-MM-DD
}
?>