Mam dwa bloki. Lewy i prawy. Kalendarz w lewym bloku /mały/ jest wyświetlany cały czas, w prawym tylko w module calendar.
No i w czym problem? Mianowicie w tym:
klasa tworzenia kalendarza:
<?php class CreateQCalendarArray { var $daysInMonth; var $weeksInMonth; var $firstDay; var $week; var $month; var $year; function CreateQCalendarArray($month, $year) { $this->month = $month; $this->year = $year; // get first day of the month $tempDays = $this->firstDay + $this->daysInMonth; $this->fillArray(); } function fillArray() { // create a 2-d array for($j=0;$j<$this->weeksInMonth;$j++) { for($i=0;$i<7;$i++) { $counter++; $this->week[$j][$i] = $counter; // offset the days $this->week[$j][$i] -= $this->firstDay; if (($this->week[$j][$i] < 1) || ($this->week[$j][$i] > $this->daysInMonth)) { $this->week[$j][$i] = ""; } } } } } class QCalendar { var $html; var $weeksInMonth; var $week; var $month; var $year; var $today; var $links; var $css; function QCalendar($cArray, $today, &$links, $css='') { $this->month = $cArray->month; $this->year = $cArray->year; $this->weeksInMonth = $cArray->weeksInMonth; $this->week = $cArray->week; $this->today = $today; $this->links = $links; $this->css = $css; $this->createHeader(); $this->createBody(); $this->createFooter(); } function createHeader() { $nextMonth = $this->month+1; $prevMonth = $this->month-1; // thanks adam taylor for modifying this part switch($this->month) { case 1: $lYear = $this->year; $pYear = $this->year-1; $nextMonth=2; $prevMonth=12; break; case 12: $lYear = $this->year+1; $pYear = $this->year; $nextMonth=1; $prevMonth=11; break; default: $lYear = $this->year; $pYear = $this->year; break; } // -- $this->html = "<table cellspacing='0' cellpadding='0' class='calendar_small'> <tr> <th class='header'> <a href=\"javascript:;\" onclick=\"displayQCalendar('$prevMonth','$pYear')\" class='headerNav' title='Prev Month'><</a></th> <th class='header'> </th> <th colspan='3' class='header'>$header</th> <th class='header'> </th> <th class='header'><a href=\"javascript:;\" onclick=\"displayQCalendar('$nextMonth','$lYear')\" class='headerNav' title='Next Month'>></a> </th> </tr>"; } function createBody(){ // start rendering table $this->html.= "<tr><th>Sun</th><th>Mon</th><th>Tue</th><th>Wed</th><th>Thu</th><th>Fri</th><th>Sat</th></tr>"; for($j=0;$j<$this->weeksInMonth;$j++) { $this->html.= "<tr>"; for ($i=0;$i<7;$i++) { $cellValue = $this->week[$j][$i]; // if today if (($this->today['day'] == $cellValue) && ($this->today['month'] == $this->month) && ($this->today['year'] == $this->year)) { $cell = "<span class='today'>$cellValue</span>"; } // else normal day else { $cell = "$cellValue"; } // if days with link foreach ($this->links as $val) { $type = $val['type']; $name = $val['name']; $title = $val['title']; $band = $val['band']; $bands = $val['bands']; $venue = $val['venue']; $city = $val['city']; $country = $val['country']; $desc = $val['desc']; if (($val['day'] == $cellValue) && (($val['month'] == $this->month) || ($val['month'] == '*')) && (($val['year'] == $this->year) || ($val['year'] == '*'))) { if($type == '0') { $popup = '<ul class="hover"><li><b>Band:</b> '.$band.'</li><li><b>Venue:</b> '.$venue.'</li> <li><b>City:</b> '.$city.'</li> <li><b>Country:</b> '.$country.'</li></ul>'; } elseif($type == 1) { $popup = '<ul class="hover"><li><b><i>'.$name.'</i></b></li> <li><b>Bands:</b> '.$bands.'</li> <li><b>Venue</b> '.$venue.'</li> <li><b>City:</b> '.$city.'</li> <li><b>Country: </b>'.$country.'</li></ul>'; } elseif($type == 2) { $popup = '<ul class="hover"><li><b>Band: </b>'.$band.'</li> <li><b>Title:</b> '.$title.'</li></ul>'; } elseif($type == 3) { $popup = '<ul class="hover"><li>'.$desc.'</li></ul>'; } $cell = '<span class="event"><a href="calendar.php" onmouseover="return overlib(''.$popup.'');" onmouseout="return nd();">'.$cellValue.'</a></span>'; break; } } $this->html.= "<td>$cell</td>"; } $this->html.= "</tr>"; } } function createFooter() { $this->html .= "</table>"; } function render() { } } ?>
Mogę tę klasę dać tylko w jednym pliku. Jeśli dam ją w dwóch wyświetla bład
<?php cannot redecrale class.. ?>
Ale nie to jest moim największym problemem. Jak już wspomniałem, mam dwa pliki kalendarza, jeden do bloku małego, drugi jako moduł. Jeśli przyjrzeć się podanemu przeze mnie kodowi mamy taki fragment:
<?php $this->html = "<table cellspacing='0' cellpadding='0' class='calendar_small'> <tr> <th class='header'> <a href=\"javascript:;\" onclick=\"displayQCalendar('$prevMonth','$pYear')\" class='headerNav' title='Prev Month'><</a></th> <th class='header'> </th> <th colspan='3' class='header'>$header</th> <th class='header'> </th> <th class='header'><a href=\"javascript:;\" onclick=\"displayQCalendar('$nextMonth','$lYear')\" class='headerNav' title='Next Month'>></a> </th> </tr>"; } ?>
Kod ten jest odpowiedzialny za wyświetlanie linków do poprzedniego i następnego miesiąca bez przeładowania strony.
No i tu jest problem. Mianowicie, jest też skrypt javascript za to odpowiedzialny:
<script language="javascript"> function createQCObject() { var req; if(window.XMLHttpRequest){ // Firefox, Safari, Opera... req = new XMLHttpRequest(); } else if(window.ActiveXObject) { // Internet Explorer 5+ req = new ActiveXObject("Microsoft.XMLHTTP"); } else { alert('Problem creating the XMLHttpRequest object'); } return req; } // Make the XMLHttpRequest object var http = createQCObject(); function displayQCalendar(m,y) { var ran_no=(Math.round((Math.random()*9999))); http.open('get', 'index.php?m='+m+'&y='+y+'&ran='+ran_no); http.onreadystatechange = function() { if(http.readyState == 4 && http.status == 200) { var response = http.responseText; if(response) { document.getElementById("quickCalender").innerHTML = http.responseText; } } } http.send(null); } </script>
No i teraz opiszę problem:
Kiedy ustawię ten kod w pliku głównym, muszę podać ścieżkę. W tym fragmencie:
http.open('get', 'index.php?m='+m+'&y='+y+'&ran='+ran_no);
Tylko problem na tym, że mam dwa pliki. I nie mam pojęcia jak to rozwiązać. Próbowałem przenieść klasę tworzenia kalendarza to pliku functions_calendar.php i zincludować go tylko jeden raz w pliku index.php, podać w skrypcie javascript ścieżkę do tego pliku, ale ten sposób nie działa.
Próbowałem już przeróżnych kombinacji. Macie jakieś pomysły?