Block für Losungen richtig einstellen - aber wie?

Begonnen von Jeremy, 23 Februar 2005, 09:35:58

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 1 Gast betrachten dieses Thema.

Jeremy

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



jubilee

#1
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

Jeremy

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

jubilee

Hallo !
Habs anhand der Beispiele nur schnell zusammengebaut.
Ich schau es mir morgen nochmal genauer an.
MfG
jubilee

jubilee

Hallo !
So hier nochmal alles zusammen neu.
Jetzt sollte es keine Probleme mehr mit Fehlermeldungen und
Positionierungsproblemen geben.
MfG
jubilee

Jeremy