Logisches(?)-Problem mit Funktion

A

andyK

Hallo,

Problem:

Ich habe eine Textdatei, in der steht folgendes:

<< Beschribung: ID - Rang - Position ob links oder rechts - Tpl - Titel - Inhalt >>
<< Trennzeichen: ]-[ >>
--------------------------------------------
]-[1]-[1]-[l]-[menu.tpl.html]-[Navigation]-[ ]-[
]-[2]-[1]-[r]-[stat.tpl.html]-[Statistik]-[<td class="menbg" align="left">{datum}<br>{uhrzeit}<br>{online}<br>{heute}<br>{gestern}<br>{gesamt}</td>]-[
---------------------------------------------
Dann habe ich diese beiden Funktionen:

PHP:
<?php

//Funktion, um Templates zu laden
  function tplload($file)
  {
     // öffnet Datei und weißt den Inhalt später einer Datei zu
    global $conf;
    if($fp = @fopen("themes/standard/tpl/".$file, "r"))
    {
      $tpl = fread($fp, filesize("themes/standard/tpl/".$file));
      fclose ($fp);
    }
    else $tpl = "Template konnte nicht geöffnet werden (themes/standard/tpl/$file)";
    return $tpl;
  }

//Funktion, um Tamplates anzuzeigen
  function tplprint($tpl, $repla)
  {
    foreach($repla as $key=>$elem)
    {
      $tpl = str_replace("{".$key."}", $elem, $tpl);

    }
    return $tpl;
  }

?>

Nun habe ich noch eine Funktion:

PHP:
  function boxes($lor)
  {
    global $conf;
	$filename="datenbanken/boxes.csv";
	$data = file($filename);

    	for($i=0; $i<count($data); $i++)
	 	 {
		  $dataf = explode("]-[", $data[$i]);

     		 $tpl = tplload("boxes/".$dataf[4]);
     		 $boxes .= tplprint($tpl, array(
      		  "TITEL" => "dataf[5]",
     		  "INHALT" => "dataf[6]"));
         }
         $lor = $dataf[3];
      return $boxes;

  }

Mit der letzten Funktion wird die Textdatei ausgelesen und die Werte werden zugewiesen.
Nun ist es aber so, dass ich über das admin-Menü die Positionen der einzelnen Boxen bestimmen will. Also entweder links oder rechts vom Inhalt.
Dieser Wert (l oder r) steht auch in der Textdatei.
Wie erreiche ich das nun mit meiner Funktion, dass diese den Wert der Position ausliest und dann dementsprechend die Platzhalter in meiner index.html füllt?

Momentan geht das über diese Funktion:

PHP:
function finalize()
  {
    global $conf, $datum, $uhrzeit, $online, $heute, $gestern, $gesamt, $copyright, $pagename;

    $tpl = tplload($this->stpl."/index.tpl.html");

    echo tplprint($tpl, array_merge(array(
    "copyright" => $copyright,
    "pagename" => $pagename,


    "left_boxes" => $this->boxes("l"),
    "right_boxes" => $this->boxes("r"),


    "datum" => "Datum: $datum",
    "uhrzeit" => "Zeit: $uhrzeit",
    "online" => "Online: $online",
    "heute" => "Heute: $heute",
    "gestern" => "Gestern: $gestern",
    "gesamt" => "Gesamt: $gesamt")) );
    exit;
  }

Den Platzhaltern "left_boxes" und "right_boxes" sollen nun den entsprechenden Boxen zugewiesen werden.
Es funktioniert auch soweit, aber auf beiden Seiten werden alle meine Boxen (also doppelt) angezeigt. Irgendwie klappt das nicht mit dem l oder r.

Habt ihr da einen Vorschlag, vielleicht mit irgendwelchen Schleifen oder so?

EDIT: Die Funktion gibt garnix aus. :( Die Platzhalter {titel} und {inhalt} bleiben leer. Ich versteh das nich..
 
Zuletzt bearbeitet von einem Moderator:
Das letzte (EDIT) Problem ist behoben:

PHP:
  function boxes($lor)
  {
    global $conf;
	$filename="datenbanken/boxes.csv";
	$data = file($filename);

    	for($i=0; $i<count($data); $i++)
	 	 {
			$dataf = explode("]-[", $data[$i]);
			
			$titel = $dataf[5];
			$inhalt = $dataf[6];
     		
     		$tpl = tplload("boxes/".$dataf[4]);
     		$boxes .= tplprint($tpl, array("titel" => $titel,"inhalt" => $inhalt));
         }
         $lor = $dataf[3];
      return $boxes;

  }

Jetzt wird das ausgegeben, was auch in der Textdatei steht. Nur das mit dem links oder rechts net.
 
Das mag dir jetzt in deinem konkreten Problem nicht weiterhelfen, aber hast du
mal darüber nachgedacht, auf ein wirkliches Datenbanksystem, wie z.B. MySQL,
oder Ähnliches umzusteigen ? Oder ist das aus irgendeinem Grund nicht denkbar ?
 
Mein Problem ist, dass mein Server zwar mySQL unterstützt, aber nicht in meinem Paket. Für meine Bedürfnisse ist das zu teuer, da ich auch noch nicht weiß, wie sich die Seite rentieren wird.

Für mein oben geschildertes Problem habe ich auch eine Lösung für mySQL. Nur das nützt mir ja nix.

Ich poste mal die Funktion, wie sie mit mySQL gelöst wurde:

PHP:
  function boxes($lor)
  {
    global $conf;
    $result = mysql_query("select * from ".$this->pretab."boxes where lr = '".$lor."'".$this->getrights(15, 1)." order by rang");
    if(mysql_num_rows($result))
    {
      $boxes = "";

      while($row = mysql_fetch_array($result))
      {
        $tpl = tplload("boxes/".$row['tpl']);
        if($row['voteid']) $row['inhalt'] = $this->getbvote($row['voteid']);
        $boxes .= tplprint($tpl, array(
        "TITEL" => $row['titel'],
        "INHALT" => $row['inhalt']));
      }
      return $boxes;
    }
  }

Das sieht alles recht einfach aus und ist auch irgendwie nachvollziehbar. Nur wie kann ich das auf eine Textdatei übertragen?
 
Bin ich zu blöd?

Ich habe jetzt den ganzen Nachmittag und Abend damit verbracht, eine Lösung zu
finden. Und als ich endlich meinte, eine gefunden zu haben, gab es schon den
nächsten Schlag ins Gesicht.

Hier erstmal der Code:

PHP:
function boxes ($seite)
{
   global $conf, $boxen_db;
	
	if($boxen_db->seek(array("POSITION"=>$seite)) >= 0)
    { 
       for($i=0;$i<$boxen_db->zeilen;$i++)
       {
         $tpla = $boxen_db->$zeile[$i]["TPL"];
         $titel = $boxen_db->zeile[$i]["BOXNAME"];
         $inhalt = $boxen_db->zeile[$i]["SOURCE"];
         
         if($boxen_db->zeile[$i]["POSITION"] == $seite)
         { 
        
     		$tpl = tplload("boxes/".$tpla);
     		$boxes .= tplprint($tpl, array("titel" => $titel,
     							           "inhalt" => $inhalt) ); 
         } 
       }
    } 
    

   return $boxes;     
}

Wenn nun die Funktion "tplload" aufgerufen wird, kommt eine Fehlermeldung,
wenn das Template nicht gefunden wird, bzw. vorhanden ist.

Und genau diese Fehlermeldung kommt! :(

Ich würde jetzt ja nicht hier posten, wenn an diesem Script überhaupt nix funktionieren würde, aber das macht es ja.
Was funktioniert ist die Positionierung ob links oder rechts.
Also muss das Script doch in der Textdatei lesen können. Denn habe ich zum Beispiel links zwei Boxen und rechts fünf Boxen in der Textdatei stehen,
so wird das auch korrekt ausgegeben.
Dann erscheinen halt auf der linken Seite zwei und auf der rechten Seite fünf Fehlermeldungen.

Warum liest er denn nun nicht die anderen Werte, wenn das doch mit der Position klappt?
 
Komisch

Ich weiß absolut nicht warum, aber jetzt funktioniert es.

Ich hab die Zeile mit der Position kopiert und an der Stelle, wo das TPL hin soll, eingefügt.
Und dann stand in der Fehlermeldung plötzlich ein "l".
Den String "Position" hab ich dann gegen "TPL" ausgetauscht und es ging.

:-)

Nochmal der funktionierende Code:

PHP:
function boxes($seite)
{
	global $conf, $boxen_db;

	if($boxen_db->seek(array("POSITION"=>$seite)) >= 0)
    {
       for($i=0;$i<$boxen_db->zeilen;$i++)
       {
         if($boxen_db->zeile[$i]["POSITION"] == $seite)
         {

     		$tpl = tplload("boxes/".$boxen_db->zeile[$i]["TPL"]);
     		$boxes .= tplprint($tpl, array("titel" => $boxen_db->zeile[$i]["BOXNAME"],
     							           "inhalt" => HTML_CODE($boxen_db->zeile[$i]["SOURCE"])) );
         }
       }
    }
    return $boxes;


}
 
Zurück