Rüdiger Keßler: Output buffer mag keinen Zeilenumbruch / <br /> ?

Ahoy zusammen,

ich habe jetzt bald anderhalb Tage herumprobiert und recherchiert und bin kurz von der Konvertierung zum Theologen (Da reicht es, wenn man sagt "Ich glaube, dass...." und muss es nicht auch noch programmieren!).

Die Situation:

Ein PHP-Skript erzeugt eine Ausgabe, in der auch "leere" Tags enthalten sind wie z.B. <br /> und <hr />.
Je nachdem, für welchen Doctype die Seite erzeugt werden soll, werden die Tags unterschiedlich zusammengebaut:
HTML 4.0 => <br>
XHTML 1.0 Trans. => <br />

Der entscheidende Codeschnipsel:
$result .= empty($GLOBALS['tag_list_unclosed'][$p_tag]) ? _D13_TAG_OPEN_END : $this->system->html['doctype']['nonclosed'];

wobei
_D13_TAG_OPEN_END definiert ist als ">" und
tag_list_unclosed[] ein array ist, in dem die "leeren" Tags enthalten sind
html['doctype']['nonclosed'] ein array ist, in dem vorher die für den Doctype notwendigen Infos enthalten sind.

Funktioniert soweit alles prima.

Nun will ich die komplette Ausgabe in den output-buffer schicken, von dort später in einen String auslesen auslesen und dann ausgeben.
Die auskommentierten Zeilen sind die bisher fuktionierende Version)
-------------------------------
ob_start();
$tmp = $fs->incdir(_D13_DIR_MDL).'mod.'.$sys->content[$dbf['mtch']].'.php';
//--- include module now
if ( file_exists($tmp) ) {
    require_once($tmp);
} else {
    $dbg->log($tmp);
}
$output_content = ob_get_contents();
ob_end_clean();

function content() {
//    global $system, $sys, $txt, $db, $fs, $dbf, $dbg;
//    $tmp = $fs->incdir(_D13_DIR_MDL).'mod.'.$sys->content[$dbf['mtch']].'.php';
//    //--- include module now
//    if ( file_exists($tmp) ) {
//        require_once($tmp);
//    } else {
//        $dbg->log($tmp);
//    }
    echo $GLOBALS['output_content'];
}
-------------------------------
Die Variablen sind alle nachgewiesenermaßen richtig befüllt, der entsprechende File wird tatsächlich invcluded.

Aber dann macht er mir aus allen Leeren Tags ein "<brX" bzw. ein "<hrX".
Der Abschluss des Tags fehlt und wird dann eben durch ein großgeschriebenes "X" ersetzt.

WARUM????

Gruß und herzlichen Dank im Voraus,
Rüdiger

  1. Tach Rüdiger.

    Ich fürchte, aus diesen Codeauszügen ist die Ursache deines Problems nicht zu ersehen. Z. B. kann ich nicht erkennen, an welcher Stelle "der entscheidende Codeschnipsel" überhaupt ins Spiel kommt.

    $result .= empty($GLOBALS['tag_list_unclosed'][$p_tag]) ? _D13_TAG_OPEN_END : $this->system->html['doctype']['nonclosed'];

    Deiner Aussage nach ist _D13_TAG_OPEN_END ein String, html['doctype']['nonclosed'] jedoch ein Array. Es wird also je nach Ausgang der Fallunterscheidung entweder das Zeichen '>' oder die Zeichenkette 'Array' an $result drangehängt.

    $fs->incdir(_D13_DIR_MDL).'mod.'.$sys->content[$dbf['mtch']].'.php';

    Was passiert in dieser Datei?

    Aber dann macht er mir aus allen Leeren Tags ein "<brX" bzw. ein "<hrX".
    Der Abschluss des Tags fehlt und wird dann eben durch ein großgeschriebenes "X" ersetzt.

    An welcher Stelle überprüfst du das? In der letzten Zeile con content()?

    Ich denke auch nicht, daß es eigentlich am Output Buffer selber liegt. Vielleicht steht einfach in einer der eingebundenen Dateien ein X, nachdem/bevor der PHP-Block geschlossen/geöffnet wurde.

    --
    Once is a mistake, twice is jazz.
    1. Moin Blaubart,

      Ich fürchte, aus diesen Codeauszügen ist die Ursache deines Problems nicht zu ersehen. Z. B. kann ich nicht erkennen, an welcher Stelle "der entscheidende Codeschnipsel" überhaupt ins Spiel kommt.

      Ich hatte diese Frage befürchtet und kann es nur grob umreissen.
      Der "entscheidende" Code-Schnipsel ist Teil einer Methode im Objekt "system", das als CMS-Framework dienen soll (d.h. Kapselung aller nicht inhalts-spezifischen Funktionen).

      Dort wird IRGENDWANN - und dieses "irgendwann" war der entscheidende Knackpunkt - der DocType der Ausgabe festgelegt und die betroffenen Child-Objekte entsprechend initialisiert (z.B. $system->html['doctype'] = array(); ).

      Das Problem lag am Timing. Der Aufruf für die Initialisierung erfolgt erst nach dem includen des Files, kurz vor dem Aufruf der Funktion content(). Der includierte File aber ist das den eigentlichen Inhalt und Output erzeugende Modul/Subsystem.

      In meiner Variante ohne OB wurde innerhalb der Funktion includiert, und daher erst beim Aufruf der Funktion content() ausgeführt.

      In der Variante mit OB wurde er zugleich includiert UND ausgeführt, aber die für den Output relevanten Daten (z.B. DocType-abhängige Parameter) sind da noch lange nicht initialisiert (gewesen).

      BLÖDER Fehler. GANZ blöder Fehler. *hmpf*

      $result .= empty($GLOBALS['tag_list_unclosed'][$p_tag]) ? _D13_TAG_OPEN_END : $this->system->html['doctype']['nonclosed'];

      Deiner Aussage nach ist _D13_TAG_OPEN_END ein String, html['doctype']['nonclosed'] jedoch ein Array. Es wird also je nach Ausgang der Fallunterscheidung entweder das Zeichen '>' oder die Zeichenkette 'Array' an $result drangehängt.

      Dein Einwand ist richtig, aber ich hatte die Situation unglücklich formuliert beschrieben. $this->system->html['doctype']['nonclosed'] ist natürlich nur ein String als Element in einem Array. Insofern war das nicht die URsache.

      Auf die Lösung kam ich, als ich gestern abend noch mit Frau und Schwiegereltern türkisch essen war - und über diesen Satz von Dir nachdenken musste:

      An welcher Stelle überprüfst du das? In der letzten Zeile con content()?

      Insofern Dank an Dich, dass Du Dir die Mühe gemacht hast, Dir den Code überhaupt anzuschauen.
      (...und frag mich bitte nicht, wie ich beim türkisch Essen auf die Idee komme, über solche Dinge nachzudenken ;-) Ich weiss es schlicht weg nicht. Der Gedanke war plötzlich einfach da.)

      Gruß, Rüdiger