Wie könnte eine Klasse zum Erstellen von Webseiten aussehen?

Hi,

eine Alternative Möglichkeit wäre es, dass ganze per DOM zu lösen, allerdings ist das wahrscheinlich viel anfälliger für Fehler. Ein möglicher Ansatz wäre dieser:
PHP:
$dom = new DOMDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;

$dom->loadHTML($htmlCode);

echo $dom->saveHTML();
Ich würde im Allgemeinen aber davon abraten, es so zu versuchen, Tidy ist mit Sicherheit die beste Lösung für dein Vorhaben.
 
Ich habe das jetzt schon mal angefangen und wollte die Platzhalter so kennzeichnen:
HTML:
[plugin]Platzhalter[/plugin]
Nun kann es aber auch passieren, dass da nicht Platzhalter sondern PLATZHALTER oder PlAtZhAlTeR (übertriebene Version) steht. Dazu gab es hier schon mal ein Thema, wo das Problem mit preg_replace() gelöst wurde. Ich habe nur immer so meine Schwierigkeiten mit diesen Funktionen.

Außerdem habe ich mich gefragt, dass ja in den Templates, welche ich einlade, auch solche Platzhalter existieren könnten mit vielleicht gleichen Namen. Frage wäre also, ob ich solange alle Platzhalter entferne bis keine mehr da sind. Das könnte aber zu einer ungewollten Endlosschleif führen, was ja mehr als blöd ist. Hat jemand einen Vorschlag, wie man das bewältigen könnte? Würde die Inhalte der Platzhalter erst am Ende ersetzen, damit ich die Inhalte bis zum Ende verändern kann.

Vielen Danke im Voraus!
 
Ich hab das bei mir so geregelt dass ein Template einmal durchlaufen wird, beim Erstellen des Objektes. Da werden alle Platzhalter eingelesen, diese haben bei mir in der Regel das Format {tpl_name} oder <!-- tpl_name -->. Dadurch sollten Kollisionen mit irgendwelchem Content relativ ausgeschlossen werden.

Hier mal ein Beispiel:
HTML:
<form method="post" action="index.php?action=documents{tpl_projectno}">
	<table>
		<tr>
			<td>Title:</td>
			<td><input type="text" name="title" value="{tpl_titlevalue}"/></td>
		</tr>
		<tr>
			<td>Text:</td>
			<td><textarea name="text">{tpl_textvalue}</textarea></td>
		</tr>
		<tr>
			<td>Type:</td>
			<td>
				<select name="type">
					{tpl_typeoptions}
				</select>
			</td>
		</tr>
		<tr>
			<td>Feed:</td>
			<td>{tpl_feedcheckbox}</td>
		</tr>
	</table>
	{tpl_buttons}
</form>
Wie Du siehst findest Du hier mehrere Platzhalter. Im Objekt kann ich diese dann z.B. ueber ueber $tpl->buttons oder $tpl->typeoptions ansprechen.
Dabei ist es auch moeglich mehrere Platzhalter mit gleichem Namen zu haben. Sinnvoll kann dies z.B. dann sein wenn Du das Menue sowohl ganz oben als auch ganz unten auf der Seite anzeigen willst.

Sub-Templates koennen wiederum eigene Namen oder aber die gleichen wie das Haupt-Template haben. Zu Kollisionen zwischen den Templates kommt es nicht da jedes Template in einem eigenen Objekt steckt und grundsaetzlich alle Platzhalter bei Aufruf von output() (auch Platzhalter ohne Inhalt) ersetzt werden.
 
Ich such die Platzhalter mit preg_match_all() und ersetze spaeter mit str_replace().

Hier mal der Konstruktor meiner Klasse:
PHP:
	public function __construct($filename,$match='@((<!--)|({)) *tpl_(.*) *(?(3)}|(?(2)-->))@U',$index=4)
	{
		if ((!file_exists($filename)) || (!is_readable($filename)))
		{
			return false;
		}
		$file=fopen($filename,'r');
		$this->data=fread($file,filesize($filename));
		fclose($file);
		preg_match_all($match,$this->data,$placeholders);
		for ($x=0;$x<count($placeholders[0]);$x++)
		{
			$name=preg_replace($match,'$'.$index,$placeholders[0][$x]);
			$this->placeholders[]=array('name'=>$name,'placeholder'=>$placeholders[0][$x],'content'=>'');
			$this->index[]=$name;
		}
	}
Und hier die Methode output():
PHP:
	public function output($return=false)
	{
		$matches=array();
		$replacements=array();
		for ($x=0;$x<count($this->placeholders);$x++)
		{
			$matches[]=$this->placeholders[$x]['placeholder'];
			$replacements[]=$this->placeholders[$x]['content'];
		}
		$data=str_replace($matches,$replacements,$this->data);
		if ($return===true)
		{
			return $data;
		}
		else
		{
			echo $data;
			return true;
		}
	}
 
Zurück