MyBB.de Forum

Normale Version: iCalendar Import
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
in meinem kleinen privaten Forum hat mich gerade ein Bekannter angesprochen, ob wir die Termine, die er bereits in Sunbird eingetragen hat, in unseren Forum-Kalender aufnehmen können.

Bekanntermaßen speichert Sunbird als ics, also im iCalendar-Format.

Ich habe schon hier, bei http://community.mybboard.net/, http://mods.mybboard.com/ und Google gesucht, bin jedoch leider erfolglos geblieben.

Ist hier vielleicht jemandem ein Mod oder sonst eine Möglichkeit bekannt, die iCal-Termine von Sunbird in den Kalender des MyBB-Forums zu importieren?

Wenn es da noch nichts gibt, müsste ich mir selber ein kleines Skript schreiben. Kommt das dann nur in die Tabelle mybb_events oder werden Termine oder was damit zusammenhängt noch in anderen Tabellen erwähnt?

Vielen Dank für den Support im vorraus.

Gruß hpvw
Hallo und willkommen,

ein solches Skript ist mir leider nicht bekannt. Termine werden in der Tabelle events, Geburtstage der Benutzer in der Tabelle users gespeichert.
Vielen Dank, dann muss ich nicht länger suchen.

Ich bin mittlerweile durch die PEAR-Pakete soweit, dass ich die für mich relevanten Daten extrahieren kann.

Auf meinem Server läuft PHP5 und MySQL 4.0.25. Ist dabei irgend etwas bezüglich Kollationen zu beachten, oder kann ich die ermittelten Strings direkt in die Events-Tabelle schreiben? Wenn ich das richtig überblicke liegen die Texte als iso-8859-1 vor. Wie sieht es mit Zeilenumbrüchen aus? Werden die normal als \n eingetragen? Und noch etwas: Werden die myCode-Tags im Kalender interpretiert? Schreibt man sie dann als [...] mit in die Datenbank oder müssen die vor dem Eintragen noch angepasst werden?

Gruß HPvW

PS: Ich werde da sicher keinen Mod draus machen, dafür habe ich zuviel Probleme, mich in fremde APIs einzuarbeiten. Ich könnte jedoch das Skript, was in erster Linie Quick and Dirrty ist, als Beispiel hier posten, wenn es fertig ist.
Ist es gewünscht, hier so einen "Code-Müll" zu sehen?
Ich habe jetzt ein kleines Skript geschrieben. Für meine Anforderungen genügt es gerade so.

Es werden die PEAR-Pakete iCal, File und PEAR benötigt. Bitte versucht selbst, die in die richtigen Verzeichnisse zu packen. Ich habe das solange zurechtgepfuscht, bis es passte. *mit PEAR kam ich noch nie klar*
Es kann passieren, dass die PEAR-Klassen noch ein paar Fehler auswerfen, ich habe die entsprechenden Zeilen einfach auskommentiert.
Es ging dabei um Zeilen, wie z.B.
PHP-Code:
$m;
//oder
$make
Keine Ahnung, warum sie die da hingeschrieben haben.
Es tritt auch eine Fehlermeldung "Cannot get MOZILLA... property yet".
Die lässt sich vermeiden, wenn man bei Zeile 450 in Property.php den Default-Fall des Switch auskommentiert.

Überall, wo Kommentare stehen, kann bzw. muss das Skript noch für den jeweiligen Server angepasst werden.
PHP-Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
<
html>
<
head>
<
meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<
title>Import iCal</title>
</
head>
<
body><?php

/*
 Database Configuration
 PREFIX of the table name has to be changed in the query near line 115
*/
mysql_connect("localhost" "user" "pass") or die(mysql_error);
mysql_select_db("...") or die(mysql_error);

function 
format($s) {
    
$f=str_replace('\n',"\n",$s);
    
$f=str_replace('\,',",",$f);
    return 
$f;
}

/*
 You need the following PEAR-Packages
  - iCal
  - File
  - PEAR
*/

require_once('File/iCal.php');

/*
 The Calendar File has to be on the server, here in the same directory
 as this file.
*/
$calendar File_iCal::ReadFile('CalendarDataFile.ics',true);

echo 
"<pre>";

$i=0;
while(
$calendar->getComponent($i)!==false) {
    
$pArr=$calendar->getComponent($i)->getPropertyArray();
    
$i++;

    
$summary "";
    
$location "";
    
$start "";
    
$end "";
    
$description "";
    
$categories "";
    foreach(
$pArr as $p){
        
$name=$p->getName();
        if (
$name=='SUMMARY') {
            
$summary format($p->getValue()->getValue());
        } else if (
$name=='LOCATION') {
            
$location format($p->getValue()->getValue());
        } else if (
$name=='DTSTART') {
            
$start format($p->getValue()->getValue());
        } else if (
$name=='DTEND') {
            
$end format($p->getValue()->getValue());
        } else if (
$name=='CATEGORIES') {
            
$categories format($p->getValue()->getValue());
        } else if (
$name=='DESCRIPTION') {
            
$description format($p->getValue()->getValue());
        } else if (
$name!='BEGIN'
                
&& $name!='UID'
                
&& $name!='STATUS'
                
&& $name!='CLASS'
                
&& $name!='END'
                
&& $name!='DUE'
                
&& $name!='COMPLETED'
                
&& $name!='DTSTAMP'
                
&& $name!='LAST-MODIFIED'
                
){
            echo 
$name.": ";
            
print_r($p->getValues());
            
print_r(get_class($p->getValue()));
            
print_r(get_class_methods(get_class($p->getValue())));
            echo 
"\n";
        }
    }
    
$days=array();
    if (empty(
$end)) {
        
$end=$start;
    }
    if (!empty(
$end)) {
        
$s mktime(substr($start,4,2) , substr($start,6,2) , substr($start,0,4));
        
$e mktime(substr($end,4,2) , substr($end,6,2) , substr($end,0,4));
        while (
$s $e) {
            
$days[]=date("j-n-Y",$s);
            
$s strtotime("+1 day",$s);
        }
    }
    if (
count($days)>0) {
        
/* here you may change the format of the
           inserted description */
        
$content "";
        if (!empty(
$categories)) {
            
$content.="[".$categories."]\n";
        }
        if (!empty(
$location)) {
            
$content.="--> ".$location."\n";
        }
        if (!empty(
$description)) {
            
$content.=$description."\n";
        }
        
$content trim($content);
        echo 
"<b>".utf8_decode($summary)."</b>\n";
        echo 
utf8_decode($content)."\n";
        foreach(
$days as $d) {
            echo 
" ".$d;

            
/* maybe you have to change the prefix and the author id*/
            
$sql="insert into mybb_events set
                    subject='"
.@mysql_real_escape_string(utf8_decode($summary))."',
                    author=1,
                    date='"
.$d."',
                    description='"
.@mysql_real_escape_string(utf8_decode($content))."',
                    private='no'"
;
            if (@
mysql_query($sql)) {
                echo 
" inserted\n";
            } else {
                echo 
" ERROR: ".@mysql_error()."\n        The Query:<b>".$sql."</b>\n";
            }
        }
        echo 
"------------------------------------------------------------\n";
    }
}
echo 
"</pre>";

?>
</body>
</html>