EventCalendar – kalendář s přehledem akcí

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

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
+
0
-

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 :).

motorcb
Člen | 551
+
0
-

kubajz: super. Jak to přidám do svého projektu?

mkoubik
Člen | 728
+
0
-
  • 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.

Nebo tam dát jako výchozí angličtinu a přidat setter pro ITranslator.

ViPEr*CZ*
Člen | 812
+
0
-

Vypadá to celkem cool… jako jednoduchý kalendář určitě perfektní rozšíření.
S kalendářem (organizérem) se daj dělat věci. Události pro jednotlivý uživatele, zakomponování ne jen data, ale i času, sdílení událostí mezi uživateli apod. :-)

kubajz
Člen | 47
+
0
-

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

Tomáš Votruba
Moderator | 1114
+
0
-

Ad přístup k docce: zkus napsat sem

motorcb
Člen | 551
+
0
-

kubajz: Super, díky za návod. A kam do Nette nahraju ty soubory z githubu?
Díky

kubajz
Člen | 47
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@revoke Je to interface, takže v implementující třídě bude třeba ty dvě metody implementovat :).

kubajz
Člen | 47
+
0
-

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 ;)

revoke
Člen | 36
+
0
-

@kubajz, @vojtech.dobes – jasně, děkuji za nakopnutí kluci ;-)

Každopádně ten kalendář má nějaké problémy s procházením směrem zpět (i v demu), vyzkoušejte…

castamir
Člen | 629
+
0
-

Nějak mi ten kalendář blbne – většinou se zaasekne v některém z měsíců v roce 2014 a pak už s ním nejde hnout.

kubajz
Člen | 47
+
0
-

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 | 551
+
0
-

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

kubajz
Člen | 47
+
0
-

motorcb: jak bylo řečeno výše, musíš ty dvě metody (IEventModel::isForDate, IEventModel::getForDate) implementovat ve své třídě.

MW
Člen | 615
+
0
-

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
+
0
-

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
}
?>
kubajz
Člen | 47
+
0
-

Na github přidány zdrojáky, kde najdete i slibované demo

peter0212
Člen | 9
+
0
-

Zdravim!
Ked pripojim EventCalendar do mojej aplikacie, tak mi ladicka v HomePresenter-i vyhodi chybu Class ‚EventCalendar‘ not found. Ako by som to mohol opravit?
Dakujem za odpoved.

kubajz
Člen | 47
+
0
-

Ked pripojim EventCalendar do mojej aplikacie, tak mi ladicka v HomePresenter-i vyhodi chybu Class ‚EventCalendar‘ not found. Ako by som to mohol opravit?

Umístil jsi zdrojové soubory do správného adresáře, hledáš třídu ve správném namespace? zkus se podívat do dema

tany
Člen | 31
+
0
-

Super, zrovna potřebuju do projektu nějaký jednoduchý kalendář a ten tvůj vypadá dobře.

kubajz
Člen | 47
+
0
-

Pozor – nová verze kalendáře (0.2.0).

Návod je v doplňcích, dokumentace zde

Snad jsem toho mnoho nezkazil…

Kurtas
Člen | 109
+
0
-

Ahoj,
je prosim nekde live demo, kde si je mozne komponentu prohlednout aniz bych se musel registrovat na Foursquare?

kubajz
Člen | 47
+
0
-

@Kurtas do středy připravím na githubu demo (snad dříve) ke stáhnutí a live ukázku dám na blog, díky za připomenutí

Editoval kubajz (13. 5. 2013 1:23)

kubajz
Člen | 47
+
0
-

tak už jsem něco spíchnul na githubu

nezapomenout na nastavení config.neon a importu dat do db (určitý základ je v rootu projektu), nějaký další popis k tomu demu doplním během nasazení na svoji mašinu, koho bude zajímat jen jak to vypadá, tak to nebude muset stahovat.

zdrhal
Člen | 42
+
0
-

Skoda ze dokumentace neni funkcni, jinak v presenteru vkladat u nette 2.1.0 takto:

$cal = new \EventCalendar\Simple\SimpleCalendar();

V dokumentaci je o jedno zpetne lomitko mene a bez nej to nefakčí ;)