Autor | Zpráva | ||
---|---|---|---|
Vareee Profil |
Dobrý deň,
našiel som si php triedu, ktorá robí presne to čo potrebujem, javí sa celkom fajn (pričom trochu aj chápem o čo tam ide) a je aj dosť dobre okomentovaná, len neviem vyriešiť nejaké pre mňa podstatné veci. kompletná trieda class.calendar.php, v ukážke som zmazal len credits kvôli dĺžke, samozrejme v kóde ich mám. <?php class Calendar { //variables var $html = null; //output variable var $fromTime = 1; //from this hour show calendar var $hoursCount = 24; //hours to display var $planSteps = 4; //1 = 1 hour, 2 = 30 min, 4 = 15 mins var $steps = array('0' => '00', '1' => '15', '2' => '30', '3' => '45'); //its easier to create time using array, then generate it onfly var $timeColumn = "Time"; //time columns description var $minutes = 60; //minutes in one hour var $dateformat = "d.m.y"; //setup how date will be displayed on the screen //create whole calendar function renderCalendar($from, $to) { $days = $this->assignDaysToArray($from, $to); $number = count($days); // +1 day for time column //render all header for days //table start $this->html .= $this->addTag('table', array( 'class' => 'calendar', 'cellspacing' => '0', )); //first row $this->html .= $this->addTag('tr'); //first columns $this->html .= $this->addTag('th'); $this->html .= $this->timeColumn; $this->html .= $this->addTag('/th'); //table header for($a = 0; $a < $number; $a++) { $this->html .= $this->addTag('th'); $this->html .= $this->dateToScreen($days[$a]); $this->html .= $this->addTag('/th'); } //end row $this->html .= $this->addTag('/tr'); //table data for($b = $this->fromTime; $b <= $this->hoursCount; $b++) { //plan step counter $planStepCounter = 0; //draw all columns for($c = 0; $c < $this->planSteps; $c++) { //time create and convert to format $timeOne = $b.":".$this->steps[$c]; $time = date ('H:i', strtotime($timeOne)); //in first line add spanned column for time if($planStepCounter == 0) { //row start $this->html .= $this->addTag('tr'); $this->html .= $this->addTag('td', array('rowspan' => $this->planSteps, 'class' => 'time')); $this->html .= $timeOne; $this->html .= $this->addTag('/td'); for($a = 0; $a < $number; $a++) { $this->html .= $this->addTag('td'); //now you can replace next line with select from database, date for query is stored in $days[$a], time for query is stored in $time $this->html .= $this->dateToScreen($days[$a])." - ".$time; $this->html .= $this->addTag('/td'); } $this->html .= $this->addTag('/tr'); $planStepCounter++; } //other rows render without spanned column for time else { //row start $this->html .= $this->addTag('tr'); for($a = 0; $a < $number; $a++) { $this->html .= $this->addTag('td'); //now you can replace next line with select from database, date for query is stored in $days[$a], time for query is stored in $time $this->html .= $this->dateToScreen($days[$a])." - ".$time; $this->html .= $this->addTag('/td'); } //row end $this->html .= $this->addTag('/tr'); } } } //table end $this->addTag('/table'); //render calendar echo $this->html; } //create array from days between two given dates function assignDaysToArray($start, $end) { // Vars $day = 86400; // Day in seconds, can be moved to class config in the top but it is only local variable so not need in my opinion $format = 'Y-m-d'; //this format is used only because it is default format for database. If this is not needed can by removed and replaced with $this->dateformat in for bellow $sTime = strtotime($start); // Start as time $eTime = strtotime($end); // End as time $numDays = round(($eTime - $sTime) / $day) + 1; $days = array(); // Get days for ($d = 0; $d < $numDays; $d++) { $days[] = date($format, ($sTime + ($d * $day))); } // Return days return $days; } //format of the date for screen function dateToScreen($date) { $result = date($this->dateformat, strtotime($date)); return $result; } //create html tags with given arguments function addTag($tagName, $arguments = array()) { $_tmp = array(); if(is_array($arguments)) { foreach($arguments as $arg => $value) { $_tmp[] = $arg.'="'.$value.'"'; } } return '<'.$tagName.' '.implode(' ',$_tmp).$endTag.'>'; } } ?> + spustenie require('class.calendar.php'); $cal = new Calendar(); echo $cal->renderCalendar("2013-02-10", "2013-03-10"); 1. akým spôsobom dosiahnuť aby kalendár zobrazoval celý deň (24 hodín), ale povedzme od 8? Sú tam premenné ktoré umožňujú zobrazovať čas od - do, ale nie tak ako to chcem ja. 2. ako vybrať z databázy a zafarbiť udalosti k prislúchajúcemu termínu? Môj dotaz vyzerá takto: select * from udalosti where datum = '$days[$a]' and casOd <= '$time' AND casDo > '$time' a vyzerá že to ide, myslíte že to tak môže byť? 3. čo ak tá udalosť prechádza do ďalšieho dňa napr. je od 22:00 do 2:00 nasledujúceho dňa? Pri udalosti ukladám len deň kedy sa to koná, nerátal som pôvodne s tým že by to mohlo zasahovať aj na ďalší deň.. je to možné nejako vyriešiť alebo musím prerobiť štruktúru tabuľky (pozn. udalosť nemá nikdy viac ako 24 hodín)? 4. nepoznáte nejaké lepšie riešenie, ako toto? |
||
Vareee Profil |
Momentálne už to s touto triedov vzdávam, upravil som si mysql tabuľku takto
id uzivatel datumod casod datumdo casdo poznamka casvytvorenia Som už vážne v koncoch, neviem ako nato. Mám uzivatela, den, viem vygenerovať 24 hodín (riadkov) ale ako zobraziť udalosti s tabuľky v kalendari v dennom zobrazení na najbližší týždeň s tým že by som to chcel mať znázornené trochu graficky (tj. bunka tabuľky by sa zafarbila tam kde má niečo naplánované). Nepoznáte niekto triedu, návod alebo radu ako to spraviť? čokolvek pomôže? |
||
Alphard Profil |
#3 · Zasláno: 22. 2. 2013, 22:03:25
Nejde v té původní třídě trochu modifikovat řádek 63 a 78 pro vypsání libovolného obsahu? Pro podbarvení buňky přidat na řádku 61 a 76 jako druhý argument addTag() nějakou třídu.
|
||
donny Profil |
Alphard:
„Nejde v té původní třídě trochu modifikovat řádek 63 a 78 pro vypsání libovolného obsahu? Pro podbarvení buňky přidat na řádku 61 a 76 jako druhý argument addTag() nějakou třídu.“ Iste že to ide, podobne ako to je pri generovyní tagu pre tabuľku.. $this->addTag('td', array( 'class' => 'nazov-trieddy' )); Vareee: „Som už vážne v koncoch, neviem ako nato. Mám uzivatela, den, viem vygenerovať 24 hodín (riadkov) ale ako zobraziť udalosti s tabuľky v kalendari v dennom zobrazení na najbližší týždeň s tým že by som to chcel mať znázornené trochu graficky (tj. bunka tabuľky by sa zafarbila tam kde má niečo naplánované). Nepoznáte niekto triedu, návod alebo radu ako to spraviť? čokolvek pomôže?“ Nerozumiem presne čo ti v tej triede nejde? |
||
Vareee Profil |
dobre tak inak, mám objekt, ktorý je ťahaný s cyklom z databázi je v ňom uložená nasledovná štruktúra (celé je to kompletne skopírované z printu)
<?php stdClass Object ( [id] => 1 [uzivatel] => 22 [datumod] => 2013-02-26 [casod] => 08:00 [datumdo] => 2013-02-26 [casdo] => 11:00 [poznamka] => test [casvytvorenia] => 2013-02-20 10:20:13 ) stdClass Object ( [id] => 1 [uzivatel] => 22 [datumod] => 2013-02-26 [casod] => 16:00 [datumdo] => 2013-02-27 [casdo] => 09:00 [poznamka] => test [casvytvorenia] => 2013-02-20 10:20:13 ) stdClass Object ( [id] => 1 [uzivatel] => 24 [datumod] => 2013-02-27 [casod] => 07:00 [datumdo] => 2013-02-27 [casdo] => 09:00 [poznamka] => test [casvytvorenia] => 2013-02-20 10:20:13 ) stdClass Object ( [id] => 1 [uzivatel] => 31 [datumod] => 2013-02-26 [casod] => 10:00 [datumdo] => 2013-02-26 [casdo] => 19:00 [poznamka] => test [casvytvorenia] => 2013-02-20 10:20:13 ) ?> Môžem to uložiť napr. do poľa $events alebo do čohokoľvek iného, následne cyklom, ktorý je na tom úplne nezávislý generujem dátumy a časi do kalendáru a potreboval by som docieliť nejaké porovnanie. tu je ten cyklus (je tam ešte jeden ktorý prebieha "nad ním") for($c = 0; $c < $this->planSteps; $c++) { /* tu mám teraz aktuálny deň a čas ktorý generujem uložený v premennej $days[$a] a $time[$c] */ } A otázka je ako to teda porovnať.. pričom tu mám dve nejasnosti 1. Musím celé to pole (prípade objekt) teraz spracovať, následne sa dostať k časovým hodnotám? 2. ako by to porovnanie časov malo reálne vyzerať.. Ak by som mal už casod a casdo spracovaný s poľa malo by to vyzerať nejak if($time>= $casdo && $time<$casdo) { $this->addTag('td', array( 'class' => 'nazov-trieddy' )); Nepotrebujem ta strtotime alebo niečo? |
||
Časová prodleva: 13 let
|
0