Ich entwickle gerade ein Framework, in dem unter anderen Objekte erzeugt werden können, welche die gleiche Hierachie haben, wie HTML bzw eine DOMNode aus HTML ( alles PHP Serverseitig ). Mein Hauptproblem ist, wie ich aus dem Object dynamisch DOMDocument-Object erzeuge. Dabei steht die Frage im Raum, wie am besten mit der Gernereierung verfahren wird.
Es gibt die Möglichkeit, das Objekt einem Generator zu übergeben.
Problem hierbei. Ich müssten einen sinnvollen Weg finden durch die verschachtelte Objektstruktur zu parsen, nur die relavanten Eingenschaften auszulesen, um diese dann als DOMDoc aufzubauen. Aus dem DOMDoc kann ich später XML und auch HTML erzeugen.
Natürlich will ich nicht vorher direkt dem Parser sagen, dass ein Body-Tag kommt usw. Das soll der Parser selber wissen. Ich hatte dazu Refelction verwendet um in dem Objekt Eigenschaften bekannt zu machen, die z.B. vom Typ HtmlBase sind.
Ein anderer Weg wäre, das DOMDoc direkt im Objekt zu erzeugen also über die Klasse. Wobei ich da noch keine richtige Lösung habe Dom-Teile in den Dombaum zu hängen.
Es gibt die Möglichkeit, das Objekt einem Generator zu übergeben.
Problem hierbei. Ich müssten einen sinnvollen Weg finden durch die verschachtelte Objektstruktur zu parsen, nur die relavanten Eingenschaften auszulesen, um diese dann als DOMDoc aufzubauen. Aus dem DOMDoc kann ich später XML und auch HTML erzeugen.
Natürlich will ich nicht vorher direkt dem Parser sagen, dass ein Body-Tag kommt usw. Das soll der Parser selber wissen. Ich hatte dazu Refelction verwendet um in dem Objekt Eigenschaften bekannt zu machen, die z.B. vom Typ HtmlBase sind.
Ein anderer Weg wäre, das DOMDoc direkt im Objekt zu erzeugen also über die Klasse. Wobei ich da noch keine richtige Lösung habe Dom-Teile in den Dombaum zu hängen.
PHP-Code:
<?php
/**
* Created by PhpStorm.
* User: alpha
* Date: 14.07.19
* Time: 01:29
*/
namespace cls\htmlelements;
use cls\simple_types\StringType;
use DOMDocument;
use Traversable;
class Html {
const HTML5_DOC_TYPE = '<!DOCTYPE html>';
/**
* @var StringType
*/
private $doctype;
/**
* @var Head
*/
private $head;
/**
* @var Body
*/
private $body;
/**
* Html constructor.
*
* @param StringType|NULL $doctype
* @param Head|NULL $head
* @param Body|NULL $body
*/
public function __construct( StringType $doctype = NULL, Head $head = NULL , Body $body = NULL )
{
$this -> doctype = $doctype;
$this -> head = $head;
$this -> body = $body;
}
/**
* @param StringType|NULL $val
*
* @return string
*/
public function Doctype( StringType $val = NULL ) : StringType {
if( $val === NULL ){
return $this -> get_doctype ();
}
return $this -> set_doctype ( $val );
}
/**
* @return StringType
*/
private function get_doctype() : StringType {
return $this -> doctype;
}
/**
* @param StringType $val
*
* @return StringType
*/
private function set_doctype( StringType $val ) : StringType {
$this -> doctype = $val;
return $this -> get_doctype ();
}
/**
* @param Head|NULL $val
*
* @return Head
*/
public function Head( Head $val = NULL ) : Head {
if( $val === NULL ){
return $this -> get_head ();
}
return $this -> set_head ( $val );
}
/**
* @return Head
*/
private function get_head() : Head {
return ( $this -> head ) ?: new Head();
}
/**
* @param Head $val
*
* @return Head
*/
private function set_head( Head $val ) : Head {
return $this -> head = $val;
}
public function Body(){
}
public function get_html_elements(){
$reflect = new \ReflectionClass(__CLASS__ );
/**
* @var $value \ReflectionProperty
*/
foreach( $reflect->getProperties () as $value ){
$name = $value->name;
$obj = $this -> $name();
if( $obj instanceof HtmlBase ){
print_r ( $obj );
print_r (PHP_EOL);
}
}
}
}
Kommentar