We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23451
    • 232 Posts
    Доброго дня всем!

    Подскажите, плз, есть ли сниппет/модуль/плагин который реализовывал бы функциональность календаря-расписания событий?
    Наподобие того как это сделано здесь - http://www.askeri.ru/ или прийдется писать самому? wink
      • 26586
      • 184 Posts
      В студии Лебедева...

        • 23451
        • 232 Posts
        smiley
        Решил под это дело адаптировать http://www.modxcms.com/EventCalendar-1185.html
          • 9675
          • 63 Posts
          Pisto Ganza, если что-нибудь получилось хотелось бы взглянуть. Тоже нужен такой сниппет и не охота изобретать велосипед smiley
            • 23451
            • 232 Posts
            Я далеко не мега-кодер на PHP, поэтому строго не судите то, что получилось.
            Думаю, вам лучше посмотреть на мои результаты, на EventCalendar, CALx и написать свое wink
            Вот текст моего сниппета:
            ////////////////////////////
            //
            // 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;
            
              • 897
              • 1,620 Posts
              Aleksey Stepanov Reply #6, 19 years ago
              было бы не плохо на демонстрацию взглянуть
                "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

                Не используйте Revo для "просто сайтов". Используйте Evo

                Who can defeat the Russian bear?