Klasse für HTML Objekte schreiben

kela_root

Mitglied
Hallo Leute,

ich muss eine Klasse schreiben, die automatische html tags generiert in der form von z.B.:

<input type="text" name="NAME" value="0" id="id" /> oder
<input type="checkbox" name="NAME" value="0" id="id" checked="checked">

also müsste es z.B: solche Variablen geben $html_tag, $html_name, $html_id, $html_value, $html_type, $html_checked etc.

Außerdem sollte die Klasse auch erkennen, wenn z.B.: ein Eintrag selktiert ist oder ein input mit dem entsprechenden value füllen.

ich möchte hier nicht die komplett geschriebe klasse haben(es sei denn jemand macht sich die arbeit, ich würde mich freuen), aber ein paar anregungen, tipps oder verbesserungsvorschläge.

ich habe noch OO programmiert, habe mir aber schon das kapitel im php handbuch dazu durchgelsen, also braucht ihr mir es nicht als tipp zu schreiben.

ich wäre wirklich sehr dankbar für eure hilfe.
 
Hi,

fang doch erstmal ganz einfach an, indem du eine Klasse schreibst mit den Methoden:
- Tag festlegen
- Attribute und deren Werte festlegen
- Output

Damit hättest du erstmal schon alles was du brauchst.
Dann kannst du anfangen das ganze auseinanderzuziehen, in dem du speziellen Attributen bei best. Tags z.B. Standardwerte zuweist.
Wichtig wäre natürlich auch die Unterscheidung, ob es ein umschließender Tag ist oder nicht!
Wirklich feine Sachen sind dann die Möglichkeiten z.B. Select-Tags für Datumsangaben vorzuformatieren oder wenn sich um dein Input-Feld automatisch der entsprechende Label-Tag legt.

Gruß

Christian
 
Zuletzt bearbeitet:
PHP:
<?php
class HtmlInputText {

	public $name = "";
	public $id = "";
	public $class = "";
	public $value = "";
	public $parameter = "";
	public $onClick = "";
	public $space = " ";

	


	public function __construct($_name,$_id,$_class,$_value,$_parameter,$_onClick)
	{
		$this->name = $_name;
		$this->id = $_id;
		$this->class = $_class;
		$this->value = $_value;
		$this->parameter = $_parameter;
		$this->onClick = $_onClick;
	}

	public function generateHTML ($e_tag,$e_name,$e_id,$e_class,$e_value,$e_parameter,$e_onClick)
	{
		$_start = "<input type="text";
			
		if (!empty($this->name))
		{
			$_start = $_start . $this->space . "name=\"$this->name\"";
		}
		if (!empty($this->id))
		{
			$_start = $_start . $this->space . "id=\"$this->id\"";
		}
		if (!empty($this->class))
		{
			$_start = $_start . $this->space . "class=\"$this->class\"";
		}
		if (!empty($this->value))
		{
			$_start = $_start . $this->space . "value=\"$this->value\"";
		}
		if (!empty($this->parameter))
		{
			$_start = $_start . $this->space . $this->parameter. "=\"$this->parameter\"";
		}
		if (!empty($this->onClick))
		{
			$_start = $_start . $this->space . "onclick =\"$this->onClick\"";
		}

		return $output = $_start . "/>";
	}
}
?>

Ok, so würde mein Code jetzt aussehen. Wie muss ich jetzt weiterverfahren?
 
Zuletzt bearbeitet:
Hi,

schaut doch schonmal ganz gut aus. Funktioniert es?

Willst du ich denn jetzt nur auf Input-Felder beschränken oder es auf alle HTML-Tags ausweiten?

btw: Du hast noch das wichtige Attribut "type" vergessen und "checked" wolltest du auch einbauen oder?


Gruß

Christian
 
jo, das funktioniert wunderbar, wenn ich hardcodiert alles eingebe...jetzt muss ichs nur noch includieren. hab jetzt andere anforderungen bekommen, dehalb hab ich type weggelassen. die klasse soll sich jetzt nur noch auf input felder vom type text beschränken.

vielen dank für deine anregungen.
 
Mach es doch ein wenig allgemeiner (im Sinne der Objektorientierung):
PHP:
public function addAttribute($name, $value) {
    $this->_attributes[str_replace(' ', '', "$name")] = htmlentities("$value", ENT_COMPAT);
}

public function generateHTML() {
    $out = "<{$this->_tagName}";
    foreach ($this->_attributes as $attr => &$value) {
        $out .= " {$attr}=\"{$value}\";
    }
    $out .= ">{$this->_content}</{$this->_tagName}>";
}

Nur mal so als Grundgerüst - Wesentliches Problem sind hierbei jedoch leere Tags, wie zB <input />. Würde hier zuerst eine Klasse HTML_Empty erstellen, die die Grundkomponenten mit sich bringt, und dann eine Klasse HTML_Content extens HTML_Empty mit einer überschriebenen Ausgabe, einer Eigenschaft _content, etc.

Des Weiteren sollte die Möglichkeit in Betracht gezogen werden, die _content Eigenschaft auszuweiten, so dass diese entweder weitere Sachen vom Typ HTML_Empty, HTML_Content oder Content annehmen kann. Grob also folgende Aufgliederung, die sicherlich überarbeitungswürdig ist:
PHP:
<?php
interface HTML_Content_Interface {

    protected $_content;

    // Inhalt setzen
    public function setContent( $content );

}

interface HTML_Empty_Interface extends HTML_Content_Interface {

    protected $_tags = array();

    // überladener Setter für Attribute
    public function __set( $attrName, $attrValue );

    // überladener Getter für Attribute
    public function __get( $attrName );

    // überladenes Isset für Attribute
    public function __isset( $attrName );

    // überladenes Unset für Attribute
    public function __unset( $attrName );

    // Ausgabe
    public function render();

}

interface HTML_nonEmpty_Interface extends HTML_Empty_Interface {

    // Inhalt setzen
    public function setContent( HTML_Content_Interface $content );

    // Inhalt anfügen
    public function appendContent( HTML_Content_Interface $content );

    // Inhalt voranstellen
    public function prependContent( HTML_Content_Interface $content );

    // Inhalt löschen
    public function deleteContent();

}

Des Weiteren könnte man noch eine Klasse für die Attribute einfügen, aber das dann eher als Spielere um noch mehr Overhead erzeugen zu können. Wenn ich mich recht entsinne, gab es auch mal eine Beschreibung einer HTML-Klasse @ PHP@Quakenet.
 
Zurück