![]() | ||||||||
![]() |
Karte | Kalender | Suche | Bookmarks | Experte | FAQ |
ModuleDownloadSMFinder_Query_expandSeriesWird verwendet von:SMFinder_Query_composeDates4UIDs Diese Funktion liefert alle Tage - ggf. unter Berücksichtigung der Wiederholungsregeln - an denen diese Veranstaltung stattfindet, bis zum gegebenen Enddatum. (Aus Sicherheitsgründen ist die Schleife auf jeweils 1000 Termine limitiert.) Zurückgegeben wird ein Array mit den gefundenen, gültigen Terminen (yyyy-mm-dd). Aus dtstart wird zunächst das erste Datum extrahiert, anschließend erfolgt anhand von freq eine Unterscheidung, ob es sich um einen Serientermin handelt.
Wenn der Nutzer als Administrator eingelogged ist, wird zudem dtstart auf den jeweils ersten gültigen Termin nachgeführt und bei Einzelterminen der Status ggf. auf delete gesetzt, so dass das Skript nicht immer Termine, die in der Vergangenheit liegen erst bestimmen und dann aussortieren muss. <?php /* published under GPL www.gnu.org/licenses/gpl.html */ function SMFinder_Query_expandSeries($event,$start,$end){ include_once('SMFinder_Write_Event.php'); include_once('SMFinder_Query_validDate.php'); if($GLOBALS['debug']){echo "<aj>SMFinder_Query_expandSeries</aj> ".$event['summary']." ".$event['dtstart']."<br>";} if (empty($event['dtstart'])){ if($_SESSION['IamGod'] OR $GLOBALS['debug']){ echo "<b>".$event['UID']."<br>dtstart ist leer!</b>"; } return; } $dates4event=array(); $startYear=substr($start,0,4); $startMonth=substr($start,5,2); $startDay=substr($start,8,2); $startNo=$startYear.$startMonth.$startDay; $date=substr($event['dtstart'],0,8); $year=substr($date,0,4); $month=substr($date,4,2); $day=substr($date,6,2); $someDay=$day; $someMonth=$month; $someYear=$year; $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); if($year>substr($end,0,4)){return;} /* no date within interval */ /* Serientermin */ switch ($event['freq']){ case "monthly": if (!empty($event['wday'])){ $wdays=explode(",",$event['wday']); for ($wd=0;$wd<count($wdays);$wd++){ if (strlen($wdays[$wd])>=3){ $nter=substr($wdays[$wd],0,strlen($wdays[$wd])-2); $wdays[$wd]=substr($wdays[$wd],strlen($wdays[$wd])-2); }else{ $nter=0; } #echo $nter." nter ".$event['UID']."<br>"; $someDay=$day; $someMonth=$month; $someYear=$year; /* search first occurance of this day */ for ($j=0;$j<7;$j++){ $offset=0; $wdayTmp= date("D",mktime(0, 0, 0, $month, $j+$offset, $someYear)); if ($wdayTmp=="Mon" AND $wdays[$wd]=="MO"){$someDay=$j;} if ($wdayTmp=="Tue" AND $wdays[$wd]=="TU"){$someDay=$j;} if ($wdayTmp=="Wed" AND $wdays[$wd]=="WE"){$someDay=$j;} if ($wdayTmp=="Thu" AND $wdays[$wd]=="TH"){$someDay=$j;} if ($wdayTmp=="Fri" AND $wdays[$wd]=="FR"){$someDay=$j;} if ($wdayTmp=="Sat" AND $wdays[$wd]=="SA"){$someDay=$j;} if ($wdayTmp=="Sun" AND $wdays[$wd]=="SO"){$someDay=$j;} } #j $someDate=sprintf("%04d-%02d-%02d",$year,$month,$someDay); $safe=0; while ($someDate<$end){ $safe++; if ($safe>1e3){if ($_SESSION['IamGod']){echo "Fehler bei monthly1 ".$event['UID']."<br>";}break;} $lastDayOfMonth=date("t",mktime(0, 0, 0, $someMonth, $someDay, $someYear)); /* applay rules */ $goodDate=false; if ($someDate>=$start AND $someDate<=$end){ if ($nter==0){$goodDate=true;} if ($nter>0 AND $someDay>($nter-1)*7 AND $someDay<=$nter*7){$goodDate=true;} if ($nter<0 AND ($lastDayOfMonth-$someDay)<=-7*$nter AND ($lastDayOfMonth-$someDay)>-7*($nter+1)){$goodDate=true;} } if (!empty($event['mday'])){ $mdays=explode(",",$event['mday']); $mdTest=0; for ($md=0;$md<count($mdays);$md++){ if ($mdays[$md]==substr($someDate,8,2)){$mdTest++;} } if ($mdTest<1){$goodDate=false;} } if ($goodDate){ array_push($dates4event,$someDate); } /* next Date */ $someDay=$someDay+7; $oldMonth=$someMonth; list($someYear,$someMonth,$someDay)=SMFinder_Query_validDate($someYear,$someMonth,$someDay); /* interval for monthly */ if (!empty($event['interval']) AND $oldMonth!=$someMonth){ $counter=1; while ($counter<$event['interval']){ $lastDayOfMonth=date("t",mktime(0, 0, 0, $someMonth, 10, $someYear)); while ($someDay<$lastDayOfMonth){ $someDay=$someDay+7; /* keep wday */ } $counter++; $someMonth++; $someDay=$someDay-$lastDayOfMonth; if ($someMonth>12){ $someYear=$someYear+1; $someMonth=$someMonth-12; } } } $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); } #while } #wd }else if (!empty($event['mday'])){ $mdays=explode(",",$event['mday']); $safe=0; while ($someDate<$end){ $safe++; if ($safe>1e3){if ($GLOBALS['IamGod']){echo "Fehler bei monthly2 ".$event['UID']."<br>";}break;} for ($md=0;$md<count($mdays);$md++){ if ($mdays[$md]==substr($someDate,8,2)){ if ($someDate>=$start AND $someDate<=$end){ array_push($dates4event,$someDate); } break; } } $someDay++; list($someYear,$someMonth,$someDay)=SMFinder_Query_validDate($someYear,$someMonth,$someDay); $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); } } #while break; case "dayly": break; case "weekly": while ($someDate<$end){ $save++; if ($save>1e3){if ($GLOBALS['IamGod']){echo "Fehler bei weekly ".$event['UID']."<br>";}break;} /* applay rules */ $goodDate=false; if ($someDate>=$start AND $someDate<=$end){ $wdayTmp= date("D",mktime(0, 0, 0, $someMonth, $someDay, $someYear)); if ($wdayTmp=="Mon" AND $event['wday']=="MO"){$goodDate=true;} if ($wdayTmp=="Tue" AND $event['wday']=="TU"){$goodDate=true;} if ($wdayTmp=="Wed" AND $event['wday']=="WE"){$goodDate=true;} if ($wdayTmp=="Thu" AND $event['wday']=="TH"){$goodDate=true;} if ($wdayTmp=="Fri" AND $event['wday']=="FR"){$goodDate=true;} if ($wdayTmp=="Sat" AND $event['wday']=="SA"){$goodDate=true;} if ($wdayTmp=="Sun" AND $event['wday']=="SU"){$goodDate=true;} if (!empty($event['wkno'])){ $realGoodDate=false; $weekNumbers=explode(",",$event['wkno']); $wkno=sprintf('%02d',date("W",mktime(0, 0, 0, $someMonth, $someDay, $someYear))); for ($w=0;$w<count($weekNumbers);$w++){ if ($weekNumbers[$w]==$wkno){ $realGoodDate=true; } } #w }else{ $realGoodDate=true; } } if ($goodDate AND $realGoodDate){ array_push($dates4event,$someDate); $someDay=$someDay+$event['interval']*7; }else{ $someDay++; } list($someYear,$someMonth,$someDay)=SMFinder_Query_validDate($someYear,$someMonth,$someDay,$event['interval'],$event['freq']); $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); } break; case "yeraly": break; default: /* Einzeltermin */ $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); if ($someDate>=$start AND $someDate<=$end){ array_push($dates4event,$someDate); $endDate=substr($event['dtend'],0,4)."-".substr($event['dtend'],4,2)."-".substr($event['dtend'],6,2); /* workshops or festivals may last a few days */ if ($endDate[0]!="P"){ while ($someDate<$endDate){ $someDay=$someDay+1; $save++; if ($save>1e3){echo "Fehler bei Einzeltermin<br>".$event['UID']."<br>".$event['dtstart']." ".$start." ".$endDate;break;} list($someYear,$someMonth,$someDay)=SMFinder_Query_validDate($someYear,$someMonth,$someDay); $someDate=sprintf("%04d-%02d-%02d",$someYear,$someMonth,$someDay); array_push($dates4event,$someDate); } } } } #switch sort($dates4event); if(!isset($_SESSION['IamGod'])){$_SESSION['IamGod']=false;} if($_SESSION['IamGod']){ $heute = date('Y').date('m').date('d'); if (empty($event['freq'])){ /* reset status of old dates */ $someDateNo = substr($event['dtstart'],0,8); if ($someDateNo<$heute){ $event['status']="delete"; if($GLOBALS['debug']){echo "<span style='color:red;'>delete:</span> ".$someDateNo." < ".$heute,"<p>";} SMFinder_Write_Event($event,"",0); } }else{ /* reset of dtstart to improve computational effency */ $firstDate=$dates4event[0]; $endDay=substr($firstDate,8,2)+(substr($event['dtend'],8,2)-substr($event['dtstart'],8,2)); if (substr($event['dtstart'],0,8)<$heute AND $startNo==$heute){ $tmp=$event['dtstart']; $event['dtstart']=substr($firstDate,0,4).substr($firstDate,5,2).substr($firstDate,8,2).substr($event['dtstart'],8); $event['dtend']=substr($firstDate,0,4).substr($firstDate,5,2).$endDay.substr($event['dtend'],8); if($_SESSION['IamGod'] OR $GLOBALS['debug']){ echo "<span style='color:gold;'>reset:</span> ".$event['UID']." start: ".$tmp." --> ".$event['dtstart']." ende: ".$event['dtend']."<p>"; } SMFinder_Write_Event($event,"",0); } } } sort($dates4event); if($GLOBALS['debug']){$tmp=count($dates4event);echo $tmp." Termine gefunden<br>";} return $dates4event; } ?> IndexFür die Funktionalität des SM-Finders sind viele kleine Tools notwendig. Alle Funktionen beginnen mit SMFinder_ um deren Ursprung zu kennzeichnen. Dem schließt sich die Funktionsgruppe, z.B. Geo_ an, gefolgt vom eigentlichen Namen, der die Aufgabe der Funktion widerspiegeln soll, z.B. PLZ2DB. Der gesamte Sourcecode darf gemäß GNU General Public License weiterverbreitet werden. |
![]() |
Die hier zur Verfügung gestellten Informationen basieren auf dem Austauschnetzwerk des SM-Finders.
Änderungen an eurem Datensatz könnt ihr z.B. beim Arbeitskreis SM-Finder vornehmen.
Bei Fragen und Problemen schreibt bitte an: sm-finderki-co.org
Der AK-SM-Finder ist korporatives Mitglied der BVSM e.V.
Für Aktualität und Richtigkeit der dargebotenen Infomationen kann keine Gewähr übernommen werden!