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
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?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: