Nová kalendářová komponenta

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

Zdravím,

co jsem se díval, tak je tu v addonech pouze jedna komponenta, která je poměrně stará a na fóru jsem toho také moc nenašel, tak jsem se rozhodl, že dám dohromady další kalendář :-).

Rád bych znal Váš názor na komponentu, hlavně tedy na kód a zda-li si myslíte, že je to použitelné v nějakém reálném projektu?

Zde je odkaz na Github, kde v readme naleznete odkaz na wiki, kde jsem k tomu sepsal pár věcí.

Snažil jsem se to udělat poměrně univerzálně. V základu s úpravou bloků v šabloně se dá dělat poměrně dost věcí a dokonce se na to dá celkem dobře naroubovat práce s databází, takže nad tim postavit nějaký kalendář s podporou Eventů apod. by neměl být problém.

Karlito
Člen | 18
+
0
-

Zdravím, jde tento kalendář nějak jednoduše propojit s inputem → jako je datapicker. Jde mi o volbu datumu do inputu. Případně poradit jak nejjednodušeji na to.
Díky

darkweaver
Člen | 18
+
0
-

Ahoj, lepší by možná bylo použít rovnou nějaký javascriptový datepicker, co jsem tak pochopil z tvého popisu. Pokud máš na mysli něco jiného, zkus lépe popsat, jak by sis zhruba představoval, jak by to mělo fungovat.

Karlito
Člen | 18
+
0
-

Přesněji řečeno mám formulář kde vkládám datumy OD kdy a DO kdy, ale místo abych to vypisoval ručně, tak by se mi hodilo, aby při kliknutí do inputu se zobrazil kalendář, kde bych vybral datum a ten se mi vložil do daného inputu.
S nette začínám.
Pokud nepůjde tento kalendář a měl bych se zaměřit na nějaký jiný, mohl by jsi nějaký doporučit?
Děkuji

darkweaver
Člen | 18
+
0
-

Na tohle by se ti spíš hodil javascriptový datepicker. Pokud už na webu používáš jquery, tak koukni na tohle https://jqueryui.com/datepicker/#… .

drick
Člen | 61
+
0
-

Vyzera to dobre. Da sa aj niekde stiahnut ten example?

darkweaver
Člen | 18
+
+1
-

drick napsal(a):

Vyzera to dobre. Da sa aj niekde stiahnut ten example?

Ahoj, demo můžeš stáhnout tady. others.alestichava.cz/calendardemo.zip

Jen si composerem nainstaluješ závislosti a mělo by to běžet. Upravená komponenta je v app/lib. Ty eventy tam mám řešený dost na hulváta přes pole jenom pro funkční demo, tak se toho nezhroz.

Editoval darkweaver (19. 3. 2016 9:15)

drick
Člen | 61
+
0
-

Prepac, ale mam s tym este problem, mozno mi budes vediet poradit. Skusam si rozbehat to demo vo svojom projekte, ale nedari sa mi.

Dostavam Error:

Nette\MemberAccessException
Call to undefined method blitzik\Calendar\Entities\Day::hasEvents().

v subore eventsBlockTemplate.latte – tam je problem na riadku 66, kde premenna $day nepozna metodu hasEvents. $day pritom obsauje cisla daneho mesiaca. Class Day neobsahuje takuto metodu, takze kde sa ma nachadzat?

Nevies mi povedat, kde mam chybu? Dik :)

darkweaver
Člen | 18
+
0
-

drick napsal(a):

v subore eventsBlockTemplate.latte – tam je problem na riadku 66, kde premenna $day nepozna metodu hasEvents. $day pritom obsauje cisla daneho mesiaca. Class Day neobsahuje takuto metodu, takze kde sa ma nachadzat?

Ahoj, mohl by jsi někam nahrát, jak to máš teďka řešený? Ta proměnná $day má obsahovat instanci třídy, která dědí z \blitzik\Calendar\Entities\Day a ta už obsahuje metodu hasEvents().

drick
Člen | 61
+
0
-

darkweaver napsal(a):

drick napsal(a):

v subore eventsBlockTemplate.latte – tam je problem na riadku 66, kde premenna $day nepozna metodu hasEvents. $day pritom obsauje cisla daneho mesiaca. Class Day neobsahuje takuto metodu, takze kde sa ma nachadzat?

Ahoj, mohl by jsi někam nahrát, jak to máš teďka řešený? Ta proměnná $day má obsahovat instanci třídy, která dědí z \blitzik\Calendar\Entities\Day a ta už obsahuje metodu hasEvents().

No teraz to mam riesene rovnako ako ty, ibaze ja to nemam v HomepagePresentery, ale v CalendarPresentery. Ziadna ina zmena.
Uz vidim, kde sa nachadza metoda hasEvents(). Priznam sa, ze mam trosku problem to pochopit. V eventsBlocksTemplate.latte sa nachadza tento riadok {var $day = $cell->getDay()} . Metoda getDay() vrati int. Ako si teda nasledne z tohto mozem pytat $day->hasEvents()? Nemala by metoda getDay() v namespace blitzik\Calendar\Entities vracat objekt? Toto mi pripada ako moj problem.

Momentalne to nemam tento projekt nikde uploadnuty. Ak by si mi ale nevedel poradit a bol ochotny sa hrabat v kode, tak ho niekam hodim. Ale nechcem Ta tym privelmi otravovat.

darkweaver
Člen | 18
+
0
-

drick napsal(a):

V eventsBlocksTemplate.latte sa nachadza tento riadok {var $day = $cell->getDay()} . Metoda getDay() vrati int. Ako si teda nasledne z tohto mozem pytat $day->hasEvents()? Nemala by metoda getDay() v namespace blitzik\Calendar\Entities vracat objekt?

Ta metoda by skutečně měla vracet objekt dne. Pokud vycházíš přímo z toho dema, tak to má vracet konkrétně CalendarDemo\Day a ne integer.

Zkusil sem si stáhnout to demo co jsem uploadnul a funguje to jak má. Zkus někam nahrát ten kód co máš a pošli mi to třeba na email [ales.tichava@gmail.com], ať to tu nespammujeme.

Editoval darkweaver (14. 3. 2016 12:57)

Neo-Mike
Člen | 22
+
0
-

Ahoj, snažím se implementovat kalendář do projektu. Zatím chci zobrazit jen čistý kalendář. Narážím na problém, že laděnka mi hlásí chybu:
syntax error, unexpected ‚.‘, expecting ‚,‘ or ‚;‘ v souboru Calendar.php
problém je na řádku – private $calendarBlocksTemplate = __DIR__ . ‚/calendarBlocks.latte‘;

Editoval Neo-Mike (15. 3. 2016 14:49)

David Matějka
Moderator | 6445
+
0
-

@Neo-Mike : Tahle syntaxe je podporovana az od php 5.6, takze autor by to mel opravit, nebo zvysit pozadavky. Ale i tak ti doporucuju aktualizovat na php 5.6

darkweaver
Člen | 18
+
0
-

@Neo-Mike : Ahoj, omlouvám se za nepříjemnosti. Projel jsem to a problém byl pouze v téhle jedné věci. Nainstaloval jsem si i wamp s php5.4 a funguje.

Neo-Mike
Člen | 22
+
0
-

@darkweaver: Jak jsi to opravoval? Nebo co jsi tam udělal za změnu přesněji?

darkweaver
Člen | 18
+
+1
-

@Neo-Mike : Změna je vidět tady

Neo-Mike
Člen | 22
+
0
-

@darkweaver : Díky, už to funguje :)

drick
Člen | 61
+
0
-

Snazim sa si tento kalendar napojit na databazu. Naraz vsak na problem, ze pri zmene mesiaca sa mi nezobrazia udalosti pre dany mesiac. Teda funguje to iba pre aktualny mesiac. Teda neviem nikde najst, ktore akcie sa vykonaju pri ajaxovom zmene mesiaca (sipka dolava alebo doprava).

Toto je moj upraveny kod v classe SimpleEventCalendarGenerator, metoda findEvents($year, $month)

// current date
$y = date('Y');
$m = date('n');

     $allItems = $this->database->table('events')->fetchAll();
     foreach ($allItems as $item) {
         if (date("Y", strtotime($item['date_time'])) == $y and date("m", strtotime($item['date_time'])) == $m) {
             $results[] = $item;
         }
     }


     $finalResult = array();
      if ($year == $y and $month == $m) {
             foreach ($results as $result) {
                 $finalResult[] = new Event(new \DateTime(
                         date("Y", strtotime($result['date_time'])) . "-" .
                         date("m", strtotime($result['date_time'])) . "-" .
                         date("d", strtotime($result['date_time'])) . " " .
                         date("H", strtotime($result['date_time'])) . ":" .
                         date("i", strtotime($result['date_time']))
                         ),
                         $result['title']
                  );
             }
      } elseif ($year == $y and ( $month == ($m + 1))) {
          $this->findEvents($year, $month + 1);
      } elseif ($year == $y and ( $month == ($m - 1))) {
          $this->findEvents($year, $month - 1);
      }
     return $finalResult;

	return [];

Teda do tych vetiev elseif sa mi aplikacia nikdy nedostane – ten pri ajaxovom zmene mesiaca sa tato metoda uz nezavola. Viete mi poradit ako to fixnut?

darkweaver
Člen | 18
+
+1
-

drick napsal(a):

Snazim sa si tento kalendar napojit na databazu. Naraz vsak na problem, ze pri zmene mesiaca sa mi nezobrazia udalosti pre dany mesiac. Teda funguje to iba pre aktualny mesiac. Teda neviem nikde najst, ktore akcie sa vykonaju pri ajaxovom zmene mesiaca (sipka dolava alebo doprava)…

Ahoj, koukám, že vycházíš z dema. V té ukázkové aplikaci jsou ty eventy řešený natvrdo a tak, aby se zobrazovali pro předchozí měsíc, aktuální měsíc a následující měsíc, abych to nemusel pokaždé měnit pro nové měsíce a používat na to databázi, takže si to budeš muset upravit dle sebe, tu implementaci z dema nepoužívej.

V podstatě by ti mělo stačit si vytáhnout z databáze eventy. Nějaký dotaz tam máš, ale taháš všechny, což je zbytečný. Ve třídě SimpleEventCalendarGenerator je přetížená metoda getCalendarData(), které se předávají parametry $year a $month, takže je použij v dotazu do databáze na eventy. No a pak už ti stačí jen ty eventy projet a přiřadit správnému dnu.