2009-07-13 24 views
0

Ich arbeite an einer HTML-Klasse in PHP, damit wir unsere gesamte HTML-Ausgabe konsistent halten können. Allerdings habe ich einige Schwierigkeiten, meinen Kopf um die Logik zu wickeln. Ich arbeite in PHP, aber Antworten in jeder Sprache funktionieren.Wie erstelle ich eine HTML-Klasse richtig?

Ich mag die Klasse richtig Nest der Tags, so dass ich mag in der Lage sein, so zu nennen:

$html = new HTML; 

$html->tag("html"); 
$html->tag("head"); 
$html->close(); 
$html->tag("body"); 
$html->close(); 
$html->close(); 

Der Klassencode ist hinter den Kulissen mit Arrays arbeiten, und schiebt die Daten, Daten popping aus. Ich bin mir ziemlich sicher, dass ich ein Unter-Array erstellen muss, um die unter <html> zu haben, aber ich kann die Logik nicht ganz herausfinden. Hier ist der eigentliche Code zur HTML Klasse, wie es steht:

class HTML { 

    /** 
    * internal tag counter 
    * @var int 
    */ 
    private $t_counter = 0; 

    /** 
    * create the tag 
    * @author Glen Solsberry 
    */ 
    public function tag($tag = "") { 
     $this->t_counter = count($this->tags); // this points to the actual array slice 
     $this->tags[$this->t_counter] = $tag; // add the tag to the list 
     $this->attrs[$this->t_counter] = array(); // make sure to set up the attributes 
     return $this; 
    } 

    /** 
    * set attributes on a tag 
    * @author Glen Solsberry 
    */ 
    public function attr($key, $value) { 
     $this->attrs[$this->t_counter][$key] = $value; 

     return $this; 
    } 

    public function text($text = "") { 
     $this->text[$this->t_counter] = $text; 

     return $this; 
    } 

    public function close() { 
     $this->t_counter--; // update the counter so that we know that this tag is complete 

     return $this; 
    } 

    function __toString() { 
     $tag = $this->t_counter + 1; 

     $output = "<" . $this->tags[$tag]; 
     foreach ($this->attrs[$tag] as $key => $value) { 
      $output .= " {$key}=\"" . htmlspecialchars($value) . "\""; 
     } 
     $output .= ">"; 
     $output .= $this->text[$tag]; 
     $output .= "</" . $this->tags[$tag] . ">"; 

     unset($this->tags[$tag]); 
     unset($this->attrs[$tag]); 
     unset($this->text[$tag]); 

     $this->t_counter = $tag; 

     return $output; 
    } 
} 

Jede Hilfe wäre sehr geschätzt.

+1

Sie können einfach ein HTML-Dokument erstellen, als wäre es XML, und dann serialisieren Sie es mit http://no.php.net/manual/en/domdocument.savehtml.php diese Funktion. –

Antwort

2

Es könnte, wenn es darauf ankommt, einfacher sein, einen der vorhandenen DOM-Konstruktoren für PHP zu verwenden.

Wenn das nicht vernünftig erscheint; Einfach ein Array als Mitglied der Klasse zu haben, um Kinderelemente zu behalten, sollte Wunder bewirken.

+0

Können Sie einen Link zu einigen dieser DOM-Konstruktoren veröffentlichen? Das von php.net scheint (mit begrenzter Forschung) hauptsächlich für XML zu sein –

+1

Das in PHP integrierte DOM-Modul unterstützt sowohl XML als auch HTML; überprüfen Sie insbesondere die Funktion DOMDocument :: saveHTML(). http://us.php.net/manual/de/book.dom.php –