![]() | ||||||||
![]() |
Karte | Kalender | Suche | Bookmarks | Experte | FAQ |
ModuleDownloadSMFinder_XML_importWird verwendet von:SMFinder_Main Diese Skript lädt die zuvor hochgeladene sm-finder.xml, extrahiert die darin enthaltenen Elemente, vergleicht deren Aktualität mit dem vorhandenen Datensatz und aktualisiert diesen gegebenenfalls. Da event sowohl adress als auch link enthalten kann und adress wiederum die Elemente adr, person und link enthalten kann, ist die Reihenfolge beim Parsen wichtig!
Um diese Prozedur zu testen, kann die erste Zeile einkommentiert und das Skript dann von der Shell aus gestartet werden. Dies geht einerseits schneller und XML kann direkt ausgegeben werden, ohne interpretiert zu werden. SMFinder_XML_importMergeEventDiese Function lässt das XML jedes einzelnen Termins in seine Bestandteile zerlegen. Wenn die UID, die eineindeutige Kennung des Eintrags bekannt ist, wird im aktuellen Datensatz nachgeschaut, ob der entsprechende Eintrag schon vorhanden und eventuell neuer ist. Wenn das XML Aktualisierungen enthält, müssen zunächst noch die Unterelemente location, organizer und contact in ihre Bestandteile zerlegt werden. Schließlich liegt der Termin als Array vor und wird an die Funktion, die ihn in die Datanbank einträgt, übergeben. Zur visuellen Kontrolle der Aktualisierungen wird in grün oder rot angezeigt, ob ein Eintrag geändert bzw. hinzugefügt wurde, oder ob der Termin bereits in seiner aktuellen (oder neueren) Fassung vorlag. SMFinder_XML_importMergeAddressFunktioniert analog zu SMFinder_XML_importMergeEvent, ist nur kürzer und übersichtlicher. SMFinder_XML_importMergeLinkFunktioniert analog zu SMFinder_XML_importMergeEvent, ist nur kürzer und übersichtlicher. ;-) compareDatesUnter Umständen sind die Datumsangaben der jeweils letzten Aktualisierung unterschiedlich formatiert; deswegen werden hier alle Formatierungen vernachlässigt und die Anzahl der Datums- und Zeitziffern angeglichen, so dass sich die Zeitstempel vergleichen lassen. Zu Grunde liegt die Reihenfolge yyyy-mm-ddThh:mm:ss. <?php /* published under GPL www.gnu.org/licenses/gpl.html */ #SMFinder_XML_import(); #for testing run in shell /*=======================================*/ function SMFinder_XML_import(){ include_once("SMFinder_XML_readFile.php"); include_once("SMFinder_XML_findAllElements.php"); $xmlFile=$GLOBALS['someDir']."sm-finder.xml"; $xml = SMFinder_XML_readFile($xmlFile); if ($GLOBALS['debug']){echo "<aj>SMFinder_XML_import.php</aj>: find all event<br>";} list($events,$NoEvents,$residual) = SMFinder_XML_findAllElements($xml,"event"); if ($GLOBALS['debug']){echo "<aj>SMFinder_XML_import.php</aj>: find all address<br>";} list($addresses,$NoAddress,$residual) = SMFinder_XML_findAllElements($residual,"address"); if ($GLOBALS['debug']){echo "<aj>SMFinder_XML_import.php</aj>: find all link<br>";} list($bookmarks,$NoBookmark,$residual) = SMFinder_XML_findAllElements($residual,"link"); echo "\n<h3>Merge Events</h3>\n"; for ($e=0;$e<count($events);$e++){ SMFinder_XML_importMergeEvent($events[$e]); } #e echo "\n<h3>Merge Addresses</h3>\n"; for ($a=0;$a<$NoAddress;$a++){ list($refUidContact,$lat,$lon) = SMFinder_XML_importMergeAddress($addresses[$a],'ok'); } #a echo "\n<h3>Merge Links</h3>\n"; for ($l=0;$l<$NoBookmark;$l++){ SMFinder_XML_importMergeLink($bookmarks[$l]); } #l } /*=======================================*/ function SMFinder_XML_importMergeEvent($eventsXML){ include_once("SMFinder_XML_importParseEvent.php"); include_once("SMFinder_XML_importParseAddress.php"); include_once("SMFinder_XML_importParseLink.php"); include_once("SMFinder_Query_readEvent.php"); include_once("SMFinder_Write_Event.php"); include_once("SMFinder_Write_Link.php"); list($event,$locationXML,$organizerXML,$contactXML,$linkXML) = # SMFinder_XML_importParseEvent($eventsXML); $existingEvent=SMFinder_Query_readEvent($event['UID']); if (compareDates($event['lastmod'],$existingEvent['lastmod'])){ /*location*/ list($event['location'],$lat,$lon) = SMFinder_XML_getRefUID($locationXML,"location"); if (empty($event['geoLat'])){$event['geoLat']=$lat;} if (empty($event['geoLon'])){$event['geoLon']=$lon;} /*organizer*/ list($event['organizer'],$lat,$lon) = SMFinder_XML_getRefUID($organizerXML,"organizer"); if (empty($event['geoLat'])){$event['geoLat']=$lat;} if (empty($event['geoLon'])){$event['geoLon']=$lon;} /*contact*/ list($event['contact'],$lat,$lon) = SMFinder_XML_getRefUID($contactXML,"contact"); if (empty($event['geoLat'])){$event['geoLat']=$lat;} if (empty($event['geoLon'])){$event['geoLon']=$lon;} SMFinder_Write_Event($event); for ($l=0;$l<count($linkXML);$l++){ $link = SMFinder_XML_importParseLink($linkXML); } #l SMFinder_Write_Link($link,count($link),$event['UID']); echo "<span style='color:green;'>neu ".$event['summary']."</span><br>"; }else{ echo "<span style='color:red;'>alt ".$event['summary']."</span><br>"; echo "xml ".$event['lastmod']." DB ".$existingEvent['lastmod']."<br>"; } } /*=======================================*/ function SMFinder_XML_importMergeAddress($addressXML,$status){ include_once("SMFinder_XML_importParseAddress.php"); include_once("SMFinder_XML_importParseAdr.php"); include_once("SMFinder_XML_importParsePerson.php"); include_once("SMFinder_XML_importParseLink.php"); include_once("SMFinder_Query_readAddress.php"); include_once("SMFinder_Write_Address.php"); include_once("SMFinder_Write_Adr.php"); include_once("SMFinder_Write_Pers.php"); include_once("SMFinder_Write_Link.php"); list($address,$linkXML,$adrXML,$persXML) = # SMFinder_XML_importParseAddress($addressXML,$status); #print_r($adrXML); $existingAddress=SMFinder_Query_readAddress($address['UID']); if (compareDates($address['lastmod'],$existingAddress['lastmod'])){ SMFinder_Write_Address($address); $adr = SMFinder_XML_importParseAdr($adrXML); SMFinder_Write_Adr($adr,count($adr),$address['UID']); $pers = SMFinder_XML_importParsePerson($persXML); SMFinder_Write_Pers($pers,count($pers),$address['UID']); $link = SMFinder_XML_importParseLink($linkXML); SMFinder_Write_Link($link,count($link),$address['UID']); echo "<span style='color:green;'>neu ".$address['fn']."</span><br>"; }else{ echo "<span style='color:red;'>alt ".$address['fn']."</span><br>"; } return array($address['UID'],$adr[0]['geoLat'],$adr[0]['geoLon']); } /*=======================================*/ function SMFinder_XML_importMergeLink($linkXML){ include_once("SMFinder_XML_importParseLink.php"); include_once("SMFinder_Query_readLink.php"); include_once("SMFinder_Write_Link.php"); $link=SMFinder_XML_importParseLink($linkXML); for ($l=0;$l<count($link);$l++){ $existingLink = SMFinder_Query_readLink($link[$l]['URL']); if (compareDates($link[$l]['lastmod'],$existingLink['lastmod'])){ SMFinder_Write_Link($link[$l],1,""); echo "<span style='color:green;'>neu ".$link[$l]['URL']."</span><br>"; }else{ echo "<span style='color:red;'>alt ".$link[$l]['URL']."</span><br>"; } } #l } /*=======================================*/ function SMFinder_XML_getRefUID($xml,$status){ $refUid=array(); for ($a=0;$a<count($xml);$a++){ if (eregi("<address ",$xml[$a])){ list($ref,$lat,$lon) = # SMFinder_XML_importMergeAddress($xml[$a],$status); array_push($refUid,$ref); }elseif (eregi("<ref>",$xml[$a])){ list($refXML,$NoRef,$residual) = # SMFinder_XML_findAllElements($xml[$a],"ref"); for ($r=0;$r<$NoRef;$r++){ list($refs,$NoRef)=SMFinder_XML_extractTag($refXML[$r],"ref"); array_push($refUid,$refs[0]); } #r }else{ /* free text could be contained */ } #fi $refUidString=implode(",",$refUid); } #a return array($refUidString,$lat,$lon); } /*=======================================*/ function compareDates($dateXML,$dateDB){ /* Dates may contain less digits or just an integer */ $dateXML = preg_replace("/[^A-Za-z0-9äöü]+/", "", $dateXML); $dateDB = preg_replace("/[^A-Za-z0-9äöü]+/", "", $dateDB); $dateXML = str_pad($dateXML,14,'0',STR_PAD_RIGHT); $dateDB = str_pad($dateDB,14,'0',STR_PAD_RIGHT); if ($dateXML>$dateDB OR empty($dateDB)){ echo $dateXML." ".$dateDB."<br>"; return true; }else{ return false; } } ?> 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!