Я далеко не мега-кодер на PHP, поэтому строго не судите то, что получилось.
Думаю, вам лучше посмотреть на мои результаты, на EventCalendar, CALx и написать свое
////////////////////////////
//
// Parametrs:
// count - на сколько месяцев выводить расписание, число; default - 2
// mode - брать данные о событиях из одного документа или из папки, Folder, Document; default - Document
// EventsFolder - в случае если mode=`Folder` тут указыватся ID папки с документами-событиями; default - ''
// EventsDocument - в случае если mode=`Document` тут указыватся ID документа со списком событий; default - ''
// StartDate - имя TV-переменной, в которой хранится дата начала события; default - StartDate
// EndDate - имя TV-переменной, в которой хранится дата окончания события; default - EndDate
// FreeSpace - имя TV-переменной, в которой хранится количество свободных мест на курс; default - FreeSpace
// PageOfEvent - имя TV-переменной, в которой хранится описание курса; default - 'PageOfEvent'
//
////////////////////////////
$count = (isset($count)) ? $count:2;
$mode = (isset($mode)) ? $mode:'Document';
$EventsFolder = (isset($EventsFolder)) ? $EventsFolder:'';
$EventsDocument = (isset($EventsDocument)) ? $EventsDocument:'';
$StartDate = (isset($StartDate)) ? $StartDate:'StartDate';
$EndDate = (isset($EndDate)) ? $EndDate:'EndDate';
$FreeSpace = (isset($FreeSpace)) ? $FreeSpace:'FreeSpace';
$PageOfEvent = (isset($PageOfEvent)) ? $PageOfEvent:'PageOfEvent';
$all_months=array('01','02','03','04','05','06','07','08','09','10','11','12');
$all_years=range(2007,2020,1);
function getdays($day1,$day2)
{ return round((strtotime($day2)-strtotime($day1))/(24*60*60),0); }
//$doc['content']="2007-08-12/49/Свободных мест 12";
//$_GET['month']='08';
//$_GET['year']=2007;
//заполняем календарь днями в которых нет событий. на столько месяцев сколько в count
$CurMonth=date('m');
$CurYear=date('Y');
for ($i=0;$i<$count;$i++){
// если месяц не декабрь
if ((int)($CurMonth+$i)<=12){
$SummDays=date('t',mktime(1,1,1,$CurMonth+$i,1,$CurYear)); // сколько дней в месяце
for ($j=1;$j<=$SummDays;$j++){
if ($CurMonth+$i<10) $CurMonthNew='0'.($CurMonth+$i);
$months[$CurYear][$CurMonthNew][$j]['PageOfEvent']='no';
}
} else {
$SummDays=date('t',mktime(1,1,1,($CurMonth+$i)-12,1,$CurYear+1)); // сколько дней в месяце
for ($j=1;$j<=$SummDays;$j++){
if ($CurMonth+$i<10) $CurMonthNew='0'.($CurMonth+$i);
$months[$CurYear+1][($CurMonth+$i)-12][$j]['PageOfEvent']='no';
}
}
}
// забираем данные о событиях ////////////////////////////
if ($mode=='Document'){
$doc = $modx->getDocument($EventsDocument, 'content');
foreach(split("\n",$doc['content']) as $cKey => $cRow) {
// single event entry: "Date/PageOfEvent/FreeSpace"
$events=explode('/',$cRow);
// если указан диапазон
if (strpos($events[0],'>')){
$DatePeriod=explode('>',$events[0]);
$TempBeginDate=explode('-',$DatePeriod[0]);
$TempEndDate=explode('-',$DatePeriod[1]);
$TempStartDate=gmmktime(0, 0, 0, $TempBeginDate[1], $TempBeginDate[2], $TempBeginDate[0]);
$TempEndDate=gmmktime(0, 0, 0, $TempEndDate[1], $TempEndDate[2], $TempEndDate[0]);
for($i=$TempStartDate;$i<=$TempEndDate;$i += (60*60*24)) {
list($Year,$Month,$Day)=split(",",strftime("%Y,%m,%d",$i));
if ($months[$Year][$Month][$Day]['PageOfEvent']=='no') {
$months[$Year][$Month][$Day]['PageOfEvent']=$events[1];
$months[$Year][$Month][$Day]['FreeSpace']=$events[2];
}
}
} else {
$DateOfEvent=explode('-',$events[0]);
$months[$DateOfEvent[0]][$DateOfEvent[1]][$DateOfEvent[2]]['PageOfEvent']=$events[1];
$months[$DateOfEvent[0]][$DateOfEvent[1]][$DateOfEvent[2]]['FreeSpace']=$events[2];
}
}
}
if ($mode=='Folder'){
$ArrayOfDocuments = $modx->getDocumentChildren($EventsFolder,1,0,'id,pagetitle');
// проходимся по всем дочерним опубликованным документам
foreach ($ArrayOfDocuments as $key =>$Document){
$TVofDocument = $modx->getTemplateVarOutput(array($StartDate,$EndDate,$FreeSpace,$PageOfEvent),$Document['id'],1);
// если дата начала и дата окончания совпадают
if ($TVofDocument[$StartDate]==$TVofDocument[$EndDate]){
$DateOfEvent=explode('-',$TVofDocument[$StartDate]);
$months[$DateOfEvent[0]][$DateOfEvent[1]][$DateOfEvent[2]]['PageOfEvent']=$TVofDocument[$PageOfEvent];
$months[$DateOfEvent[0]][$DateOfEvent[1]][$DateOfEvent[2]]['FreeSpace']=$TVofDocument[$FreeSpace];
} else {
$TempBeginDate=explode('-',$TVofDocument[$StartDate]);
$TempEndDate=explode('-',$TVofDocument[$EndDate]);
$TempStartDate=gmmktime(0, 0, 0, $TempBeginDate[1], $TempBeginDate[2], $TempBeginDate[0]);
$TempEndDate=gmmktime(0, 0, 0, $TempEndDate[1], $TempEndDate[2], $TempEndDate[0]);
for($i=$TempStartDate;$i<=$TempEndDate;$i += (60*60*24)) {
list($Year,$Month,$Day)=split(",",strftime("%Y,%m,%d",$i));
if ($months[$Year][$Month][$Day]['PageOfEvent']=='no') {
$months[$Year][$Month][$Day]['PageOfEvent']=$TVofDocument[$PageOfEvent];
$months[$Year][$Month][$Day]['FreeSpace']=$TVofDocument[$FreeSpace];
}
}
}
}
}
// вывод
// если параметры не переданы - выводим текущий месяц
if (!isset($_GET['month']) or !isset($_GET['year']) or (!in_array($_GET['month'],$all_months)) or (!in_array($_GET['year'],$all_years))){
$OutputMonth=date('m');
$OutputYear=date('Y');
} else {
$OutputMonth=$_GET['month'];
$OutputYear=$_GET['year'];
}
$output="<p class='moth'>".date('F',mktime(1,1,1,$OutputMonth,1,$OutputYear))."</p>
<table width='40%' class='raspisanie'>
<tr class='nedelya'>
<td width='14%' height='27'>Понедельник</td>
<td width='14%' height='27'>Вторник</td>
<td width='14%' height='27'>Среда</td>
<td width='14%' height='27'>Четверг</td>
<td width='14%' height='27'>Пятница</td>
<td width='15%' height='27'>Суббота</td>
<td width='15%' height='27'>Воскресенье</td>
</tr>
<tr class='data'>
";
// выводим пустые дни недели до первого числа месяца
for ($i=0;$i<(date('w',mktime(1,1,1,$OutputMonth,1,$OutputYear))-1);$i++){
$output.="<td width='14%'> </td>\n";
}
// выводим текущий месяц
//$CurMonth1=$months[$OutputYear][$OutputMonth];
foreach ($months[$OutputYear][$OutputMonth] as $Curday => $value){
// если событие есть
if ($value['PageOfEvent']!='no'){
// берем данные со страницы события
$event = $modx->getDocument($value['PageOfEvent'], 'pagetitle');
//$event['pagetitle']='test';
$output.="<td width='14%'>".$Curday."<p><a href='./".$value['PageOfEvent']."'>".$event['pagetitle']."</a></p><a href='link'>".$value['FreeSpace']."</a></td>\n";
} else {
$output.="<td width='14%'>".$Curday."</td>\n";
}
// переход на новую строчку
$rrr=date('D',mktime(1,1,1,$OutputMonth,$Curday,$OutputYear));
if (date('D',mktime(1,1,1,$OutputMonth,$Curday,$OutputYear))=='Sun'){
$output.="</tr>
<tr class='data'>
";
}
}
$output.="</tr>
</table>";
// выводим ссылку только если улистали вперед не больше чем на count-месяцев
$OutputMonth++;
if ($OutputMonth-date('n')<=($count-1)) {
if ($OutputMonth<=12){
if ($OutputMonth<10) $OutputMonth='0'.$OutputMonth;
$output.="<a href=".$_SERVER['SCRIPT_NAME']."?id=".$modx->documentIdentifier."&month=".$OutputMonth."&year=".$OutputYear.">Следующий месяц</a>";
} else {
$output.="<a href=".$_SERVER['SCRIPT_NAME']."?id=".$modx->documentIdentifier."&month=0".($OutputMonth-12)."&year=".($OutputYear+1).">Следующий месяц</a>";
}
}
return $output;