Hallo,
vielleicht kann mir jemand bei folgendem Problem helfen.
Ich möchte die Tageslosungen der Bibel mit vkp mx2.1a als Block darstellen.
Unter http://www.losung.de/cgi-bin/FileServ.pl?cmd=files&year=2005&lang=de&pg=html
gibt es ein PHP Code, der das kann - aber leider nicht direkt in einem Block sondern nur
über den Umweg eines Klicks von einem HTML-Block.
Zwei Dateien werden benötigt: Einmal de_los05.xml darin befinden sich alle Daten, sprich alle Tageslosungen.
Die PHP-Datei heisst deflos.php und der Code sieht so aus:
<?
// PHP-Programm zur Anzeige der Losungen in einer Internetseite.
// Autor: Wolfgang Pavel, EMail: webmaster@apostelkirche-gerbrunn.de
////////////////////////////////////////////////////////////////
// Funktionen für XML
function deflos_anf($x,$n,$a) {
global $AT,$NT,$AV,$NV,$LD,$jf,$jj,$dl,$lg,$an,$ch;
if($lg) { switch($n) {
case "TL": $an="LD"; $LD=array(); $ch=false; break;
case "OT": $an="AT"; $AT=array(); $ch=false; break;
case "NT": $an="NT"; $NT=array(); $ch=false; break;
case "SL": if($an=="AT") {$an="AV"; $AV=array();}
elseif($an=="NT") {$an="NV"; $NV=array();}}
if($an) $ch=true; }
else { switch($n) {
case "LOSFILE": if(!$jf) if($a["YEAR"]) $jf=$a["YEAR"]; break;
case "LOSUNG":
if($jf) $j=$jf; else $j=$jj;
if($a["M"]&&$a["D"]) $dl=sprintf("%04d%02d%02d",$j,$a["M"],$a["D"]);
else $dl="";
break; }}}
function deflos_char($x,$s) {
global $AT,$AV,$NT,$NV,$LD,$an,$ch;
if ($an) if($ch) ${$an}[]=$s; }
function deflos_end($x,$n) {
global $lg,$ch,$an;
$ch=false;
switch($n) {
case "LOSUNG": $lg=false; break;
case "TL": $an=""; break;
case "OT": $an=""; break;
case "NT": $an=""; break; }}
// Funktionen für TXT
function deflos_txt($f,$z) {
global $dl,$jj,$jf;
$dl="";
if(trim($z)==".") {
while($z=fgets($f,200)) {
if(trim($z)!="") {
$e=explode(".",$z);
if($jf) $j=$jf; else $j=$jj;
if($e[0]&&$e[1]) $dl=sprintf("%04d%02d%02d",$j,$e[1],$e[0]);
break; }}}
return dl; }
// Funktionen
function deflos_fehler($f,$x,$m) {
// nur für interne Zwecke dieses Programms
global $DEFLOS;
if($x) xml_parser_free($x);
if($f) fclose($f);
$DEFLOS=$m;
return false; }
function deflos($d="",$tp="") {
// muss im HTML-Dokument mindestens einmal aufgerufen werden.
// 1. Parameter: die TXT- oder XML-Datei mit den Losungen,
// ggf. mit relativem Pfad zur HTML-Datei;
// voreingestellt bei Nichtangabe oder Angabe "":
// "losungen.txt" oder "losungen.xml";
// 2.Parameter: Datum der gewünschten Losung als string in der deutschen
// Schreibweise, also z.B. "3.11.2002";
// kann für das aktuelle Jahr abgekürzt werden: "3.11." oder "3.11"
// voreingestellt, wenn nicht angegeben: aktuelles Datum (lt. Server)
// Rückgabewert: assoziatives Array mit den 6 Elementen:
// array["AT"], array["AV"], array["NT"], array["NV"], array["LD"] :
// diese Elemente sind wieder arrays (!!!),
// jedes Element davon entspricht einer Textzeile.
// Im globalen Array $LOSUNG steht das Ergebnis des (letzten) Aufrufs von deflos
// zur Verfügung, kann aber auch einer beliebigen Variablen zugewiesen werden.
// Bei groben Fehlern liefert deflos das Ergebnis false,
// das Ergebnisarray, auch $LOSUNG, ist dann auch false.
// In der Variablen $DEFLOS steht der Fehlertext oder ok.
// Bei Fehlern in Teilen einer sonst richtigen Losung ist das entsprechende der
// 5 Arrayelemente gleich "" .
global $LOSUNG; // Standard-Array für die gewünschten Losungsteile
global $AT,$AV,$NT,$NV,$LD; // die Ergebnis-Arrays
global $DEFLOS; // OK oder Fehlertext
global $lg; // true, wenn Parser innerhalb Losung
global $jf; // Losungsjahr
global $jj; // aktuelles oder gewünschtes Jahr
global $dl; // das laufende Datum (jahrmonattag) beim Suchen
global $an; // Name des gerade zu füllenden Ergebnis-Arrays
global $ch; // true, wenn innerhalb Losungteil (dann ist Text relevant)
$wt=array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
$r=array("AT","AV","NT","NV","LD");
$DEFLOS="Unerwarteter Fehler";
if(!$d) { // für den möglichen Aufruf deflos("",angabe)
if(file_exists("losungen.txt")) $d="losungen.txt";
else if(file_exists("losungen.xml")) $d="losungen.xml";
else return
deflos_fehler(false,false,"(Standard-)Losungsdatei nicht gefunden"); }
$b=explode(".",trim($d));
if(count($b)<2) return
deflos_fehler(false,false,"'".$d."' ist keine Dateibezeichnung mit Endung");
$j=strtolower($b[count($b)-1]); // Datei-Extension
if($j=="txt") {$xm=false; $xp=false;}
elseif($j=="xml") {
if(function_exists("xml_parser_create")) $xm=true;
else return
deflos_fehler(false,false,"Server unterstützt kein XML");}
else return
deflos_fehler(false,false,"'".$d."' hat nicht die Endung TXT oder XML");
$tj=time(); $jj=date("Y",$tj);
if($tp) { // Datum angegeben
$e=explode(".",$tp);
if(count($e)!=2&&count($e)!=3) return
deflos_fehler(false,false,"'".$tp."' ist keine korrekte Datumsangabe");
if (count($e)==3) if($e[2]) $jj=trim($e[2]);
if(!checkdate($e[1],$e[0],$jj)) return
deflos_fehler(false,false,"'".$tp."' ist keine korrekte Datumsangabe");
$tj=mktime(0,0,0,$e[1],$e[0],$jj); }
$dj=date("Ymd",$tj); // gewünschtes Datum als jahrmonattag
$h=getdate($tj); $hj=$h["mday"].".".$h["mon"].".".$h["year"]; // Datum lesbar
$j=$b[count($b)-2]; // Dateiname oder letzter Teil des Dateinamens (vor Extension)
$p=strrpos($j,"#");
if(is_integer($p)) { // Jahresersetzung in Dateiname
$q=strlen($jj); if($p+1<$q) $q=$p+1; // Anzahl möglicher Ziffern
for($c=0;$c<$q;$c++) {
if($j[$p-$c]<>"#") break;
$j[$p-$c]=$jj[strlen($jj)-$c-1];} // Jahreszahl in Dateinamen
$b[count($b)-2]=$j; $d=implode(".",$b); }
if(!$pe=@filesize($d)) return
deflos_fehler(false,false,"Datei '".$d."' nicht gefunden");
// pe: Endpos. für binäre Suche, zunächst Ende der Datei
$de=99999999; // Enddatum für bin. Suche, zunächst auf unendlich
if(!$f=@fopen($d,"r")) return
deflos_fehler(false,false,"Datei '".$d."' kann nicht geöffnet werden");
$lg=false; $ch=false; $dl=""; $pl=0; $jf="";
if($xm) {
if(!$xp=xml_parser_create()) return deflos_fehler($f,false,"XML-Fehler");
xml_set_element_handler($xp,"deflos_anf","deflos_end"); }
while($z=fgets($f,200)) { // suche erste Losung; dabei (nur xml) Jahr feststellen
$p=ftell($f);
if($xm) xml_parse($xp,$z); else deflos_txt($f,$z);
if($dl) break;
$pl=$p; }
if(!$dl) return
deflos_fehler($f,$xp,"keine (ordnungsgemäße) Losung in Datei gefunden");
if(!$jf) $jf=$jj; // falls Jahr nicht in Datei, akt. Jahr nehmen
$da=$dl; $pa=$pl; // pa, da: Anfangspos, Anfangsdatum für binäre Suche
if($dj<$da) return
deflos_fehler($f,$xp,"Losung zum ".$hj." in Datei '".$d."' nicht gefunden; ".
"oder Datei fehlerhaft (falsch sortiert?)");
$sf=false; // Sonderfall ? , zunächst nein
for($b=0;$b<15;$b++) {
// binäre Suche
// b: Notbremse, falls doch noch Programmfehler; max ca.10000 Losungen
if($dl==$dj) break; // gefunden
// Losung in der Mitte zwischen pa und pe
$pl=floor(($pe+$pa)/2); fseek($f,$pl); $dl="";
while($z=fgets($f,200)) { // suche Losung
if($xm) {
$q=strpos($z,"<");
while(is_integer($q)) {
if(substr(trim(substr($z,$q+1)),0,6)=="LOSUNG") {
$pl=$pl+$q;
xml_parse($xp,substr($z,$q));
break; }
$q=@strpos($z,"<",$q+1); }
$y=(is_integer($q)); }
else $y=deflos_txt($f,$z);
if($y) break; // Losung gefunden
$pl=ftell($f); }
if(!$dl) {$sf=true; break;} // Sonderfall: inerhalb letzter Losung
if($dl<$dj) { // gesuchtes Datum liegt hinter angesprungener Stelle
if($dl<$da) return
deflos_fehler($f,$xp,"Losungen in Datei '".$d."' nicht richtig sortiert");
$pa=$pl; $da=$dl; } // angespr.Stelle ist neue Anfangsstelle
if($dl>$dj) { // gesuchtes Datum liegt vor angesprungener Stelle
if($dl>$de) return
deflos_fehler($f,$xp,"Losungen in Datei '".$d."' nicht richtig sortiert");
if($dl==$de) {$sf=true; break;} // Sprung innerhalb letzte Losung: Sonderfall
$pe=$pl; $de=$dl; }} // angespr. Stelle ist neue Anfangsstelle
if($sf) { // von pa an sequentiell suchen
fseek($f,$pa); $dl=""; $pl=$pa;
while($z=fgets($f,200)) {
$p=ftell($f);
if($xm) xml_parse($xp,$z); else deflos_txt($f,$z);
if($dl==$dj) break;
$pl=$p; }}
if($dl!=$dj) return
deflos_fehler($f,$xp,"Losung zum ".$hj." in Datei '".$d."' nicht gefunden");
// Losungsteile in array übertragen
for($i=0;$i<5;$i++) ${$r[$i]}=""; // kein foreach wegen PHP3
// Voreinstellung, wenn Teil fehlerhaft
$lg=true; $an=""; $ch=false;
if ($xm) xml_set_character_data_handler($xp,"deflos_char");
fseek($f,$pl);
if($xm) {
while($z=fgets($f,200)) {
xml_parse($xp,$z);
if(!$lg) break; } // Losung Ende
xml_parser_free($xp); }
else {
deflos_txt($f,fgets($f,200)); $p="";
while($z=fgets($f,200)) {
if(trim($z)=="") break; // Absatz Ende
if(trim($z)==".") return
deflos_fehler($f,$xp,"Losung zum ".$hj." in Datei '".$d."' fehlerhaft");
if($p) $AT[]=$p; $p=$z; }
if(count($AT)>0) $AV[]=$p; else $AT[]=$p;
// letzte Zeile: Verweis (wegen PHP3 kein array_pop)
$p="";
while($z=fgets($f,200)) {
if(trim($z)=="") {
if($p) break; // Absatz Ende
else continue; } // Leerzeilen zwischen Losungsteilen
if(trim($z)==".") break; // Losung Ende
if($p) $NT[]=$p; $p=$z; }
if(count($NT)>0) $NV[]=$p; else $NT[]=$p; }
fclose($f); // Datei zu
if(!$LD) $LD=array("Losung für ".$wt[$h["wday"]].", ".$hj);
for($i=0;$i<5;$i++) $LOSUNG[$r[$i]]=${$r[$i]}; // kein foreach wegen PHP3
// Unterarrays als Elemente ins Ergebnisarray
$DEFLOS="OK";
return $LOSUNG; } // zurück mit Ergebnis
function deflos_tl($k,$n="<br>",$a="LOSUNG") {
// nur für interne Zwecke dieses Programms
// Erstellen eines kompletten Losungsteils mit Sonderzeichenumwandlung als Text
// 1.Parameter: Kennung des Teils: AT,AV,NT,NV oder LD
// 2.Parameter: Zeilenvorschub-Realisation
// 3.Parameter: Name des Arrays, in dem die Losung liegt; Voreinstellung $LOSUNG
global $LOSUNG;
if(!${$a}) return false; // vorher Fehler beim Finden der Losung
if(!${$a}[$k]) return false; // vorher Fehler beim Losungsteil
if(!$n) $n="<br>"; // wenn "" angegeben, auch <br>
$t=htmlentities(${$a}[$k][0]); // wegen PHP3 kein array_shift
for($i=1;$i<count(${$a}[$k]);$i++) $t=$t.$n.htmlentities(${$a}[$k][$i]);
// Teilzeilen zusammensetzen
return $t; }
function deflos_aus($k,$n="<br>",$a="LOSUNG") {
// nur für interne Zwecke dieses Programms
// Ausgabe eines kompletten Losungsteils ins HTML-Dokument
// Parameter wie in deflos_tl
if($t=deflos_tl($k,$n,$a)) {echo $t; return true;} else return false; }
// Funktionen zum Abrufen und Ausgeben der Losungsteile aus dem HTML-Dokument
// 1.Parameter: Zeilenvorschub-Realisation, voreingestellt <br>
// 2.Parameter: Name des Losungsarrays, voreingestellt Standardarray $LOSUNG
// Ergebnis von AT_, AV_, NT_, NV_, LD_ : der Losungsteil als Text, keine Ausgabe
// Ergebnis von AT, AV, NT, NV, LD : Ausgabe des Losungsteils ins HTML-Dokument, true
// bei Fehler in beiden Fällen Ergebnis false
function AT($n="<br>",$a="LOSUNG") {return deflos_aus("AT",$n,$a);}
function AV($n="<br>",$a="LOSUNG") {return deflos_aus("AV",$n,$a);}
function NT($n="<br>",$a="LOSUNG") {return deflos_aus("NT",$n,$a);}
function NV($n="<br>",$a="LOSUNG") {return deflos_aus("NV",$n,$a);}
function LD($n="<br>",$a="LOSUNG") {return deflos_aus("LD",$n,$a);}
function AT_($n="<br>",$a="LOSUNG") {return deflos_tl("AT",$n,$a);}
function AV_($n="<br>",$a="LOSUNG") {return deflos_tl("AV",$n,$a);}
function NT_($n="<br>",$a="LOSUNG") {return deflos_tl("NT",$n,$a);}
function NV_($n="<br>",$a="LOSUNG") {return deflos_tl("NV",$n,$a);}
function LD_($n="<br>",$a="LOSUNG") {return deflos_tl("LD",$n,$a);}
?>
Wie kann ich daraus einen Block basteln, der die Losungen anzeigt?
Schönen Gruß,
Jeremy
www.terminal-online.de (http://www.terminal-online.de)
Hallo !
Habe aus den beigefügten Dateien und dem beispiel3.php einen block gebastelt.
Die Dateien deflos.php und losungen.xml müssen im Portal-root-verzeichnis liegen (da wo auch config.php liegt)
Der block gehört ins blocks-Verzeichnis.
Alles hochladen, block aktivieren und konfigurieren... fertig.
MfG
jubilee
Hallo jubilee,
super, vielen Dank! :)
Leider kommt es zur folgender Fehlermeldung, wenn ich bei den Blockeinstellungen nachschaue:
Fatal error: Cannot redeclare deflos_anf() (previously declared in /var/www/web674/html/deflos.php:7) in /var/www/web674/html/deflos.php on line 7
Der Block wird nur oben links angezeigt, auch wenn ich bei den Block-Einstellungen den Block z.B. weiter unten in der Reihenfolge positioniere oder wenn ich ihn auf die rechte Seite packe - er erscheint nur oben links.
Vielleicht fällt dir ja noch was dazu ein.
Danke und Gruß,
Jeremy
Hallo !
Habs anhand der Beispiele nur schnell zusammengebaut.
Ich schau es mir morgen nochmal genauer an.
MfG
jubilee
Hallo !
So hier nochmal alles zusammen neu.
Jetzt sollte es keine Probleme mehr mit Fehlermeldungen und
Positionierungsproblemen geben.
MfG
jubilee
Danke schön! Klappt wunderbar :D ;D ;)
Gruß,
Jeremy