Andreas Vogt: PHP Template

Hallo und ein gutes neues Jahr!
Ich schreibe gerade an einem cms und bin momentan dabei mein Templatesystem zu überdenken.

Mein Template sieht z.B. so aus:
blocktemplate.tpl:

<tr>  
	<td valign="top">  
		<table border="0" width="100%" cellpadding="0" cellspacing="0">  
			<tr>  
				<td class="leftBlockHead" width="1%"><img src="template/images/lfbox.gif" /></td>  
				<td class="centerBlockHead" width="98%" style="height: 16px" valign="middle" nowrap="nowrap">{blockTitle}</td>  
				<td class="rightBlockHead" width="1%"><img src="template/images/rtbox.gif" /></td>  
			</tr>  
		</table>  
		<table border="0" width="100%" cellpadding="0" cellspacing="0">  
			<tr>  
				<td width="100%" class="blockborder" colspan="3">  
					<table width="100%" border="0" cellpadding="0" cellpadding="0">{blockContent}</table>  
				</td>  
			</tr>  
		</table>  
	</td>  
</tr>  
<tr><td class="blockSpacer"></td></tr>

Mein Template Loader:

  
class nkp_tpl {  
  
	var $loadedTemplates = Array();  
  
	function nkp_tpl($template){  
		// all templates wich will be loaded are stored in an array  
		foreach ($template as $tplName => $tplFile) {  
            $this->loadedTemplates[$tplName] = $this->tplContent($tplFile);  
        }  
    }  
  
	function handleSubstitutions($templateName, $templateSubstitutions){  
		// load the origin template file  
		$tpl = $this->loadedTemplates[$templateName];  
  
        // avoid injection of php or shell-code for security reason  
        $security_search  = array('#<\?php#i', '#\{$\{#', '#<\?#', '#<\%#', '#`#', '#<script[^>]+php#mi');  
        $security_pattern1 = "&lt;?php";  
        $security_pattern2 = "&lt;?";  
        $security_replace = array($security_pattern1, '', $security_pattern2, '', '', '' );  
  
        // do the template substitutions  
		foreach ($templateSubstitutions as $var => $subs) {  
            $subs = preg_replace($security_search, $security_replace, $subs);  
            $tpl = str_replace('{'.$var.'}', $subs, $tpl);  
        }  
  
		// print handled main template  
		print str_replace("\n\n", "\n", $tpl);  
		exit;  
	}  
	function loadModuleTpl($module, $tplname, $templateSubstitutions) {  
		if (file_exists("modules/$module/template/$tplname.tpl")) {  
			$tpl = file_get_contents("modules/$module/template/$tplname.tpl");  
			  
			// avoid injection of php or shell-code for security reason  
	        $security_search  = array('#<\?php#i', '#\{$\{#', '#<\?#', '#<\%#', '#`#', '#<script[^>]+php#mi');  
	        $security_pattern1 = "&lt;?php";  
	        $security_pattern2 = "&lt;?";  
	        $security_replace = array($security_pattern1, '', $security_pattern2, '', '', '' );  
			  
			foreach ($templateSubstitutions as $var => $subs) {  
				$subs = preg_replace($security_search, $security_replace, $subs);  
	           	$tpl = str_replace('{'.$var.'}', $subs, $tpl);  
	       	}  
			return($tpl);  
		}  
	}  
	function tplContent($file){  
		// check if origin template file exists and then return the content of file  
        if (file_exists($file)) {  
            return file_get_contents($file);  
        } else {  
             return '<p align="center"><span style="color:#FF0000;">Template Error Occurs:</span><br />Not able to open '.$file.'.</p>';  
        }  
	}  
}

Funktion loadModuleTpl wird aus den einzelnen Modulen aufgerufen. Es gibt noch weitere Funktionen für Blöcke etc.

Meine Frage ist nun ob das alles Mist ist, oder was sagt ihr dazu?
Eine Demo des Template findet ihr hier:
http://mkportal-support.de/nkportal/

Gruß Andreas

  1. Hi!

    Ich schreibe gerade an einem cms und bin momentan dabei mein Templatesystem zu überdenken.

    Dann bedenke auch, dass PHP selbst bereits ein Template-System ist.

    Meine Frage ist nun ob das alles Mist ist, oder was sagt ihr dazu?

    Dazu müsstest du etwas zu deiner Zielsetzung erzählen, denn ohne diese kann man eine Lösung schwerlich beurteilen.

    blocktemplate.tpl:
    [code lang=html]<tr>
    <td valign="top">
    <table border="0" width="100%" cellpadding="0" cellspacing="0">

    Tabellenlayout?

    // avoid injection of php or shell-code for security reason
            $security_search  = array('#<?php#i', '#{${#', '#<?#', '#<%#', '#`#', '#<script[^>]+php#mi');
            $security_pattern1 = "&lt;?php";
            $security_pattern2 = "&lt;?";
            $security_replace = array($security_pattern1, '', $security_pattern2, '', '', '' );

    Was genau willst du vor wem schützen? "security reason" ist so alles- wie nichtssagend.

    Und wo behandelst du die auszugebenden Texte dem Kontext entsprechend?

    Eine Demo des Template findet ihr hier:
    http://mkportal-support.de/nkportal/

    Das, was man da bewerten kann (abgesehen von der Optik) ist das Ergebnis des Templatesystems und weniger seine Arbeit selbst. Allerdings scheint es, als ob es seine Arbeit nicht wie vorgesehen erledigt, denn es sind aus HTML-Sicht eine Menge falsche Werte in der Ausgabe enthalten.

    Lo!

    1. Hallo,
      ja Tabellenlayout ist beabsichtigt.
      Und sicherlich ist es auch noch nicht w3c conform.

      Meine Absicht ist es ein CMS zu erstellen das den Usern erlaubt auf einfache und schnelle Weise Content und Menüs zu erstellen, ohne 4 Semester Joomla zu studieren.

      Bislang kannte ich nur eines das dies erfüllt, das MKPortal - das aber vom Besitzer dicht gemacht wurde und nicht mehr erhältlich ist.

      In der Index.php wird u.a. der Template loader includiert.
      Und je nach Input-Variable das entsprechende Modul geladen.

      Das Standard-Modul lädt das Index_template, welches das Grundgerüst der späteren HTML-Ausgabe darstellt.
      "Blöcke" werden danach separat geladen, z.b. einen Login-Block

      In einer functions.php habe ich eine Funktion die die Variablen für das Template besetzt:

      	function printPage() {  
      		Global $tpl, $nklib;  
      		  
      		// Array with all Substitutes in index Template  
      		$substitution_vars = array(  
      			'title'					=> "<title>NKPortal - Board Portal System</title>",  
      			'css'					=> "<link rel=\"stylesheet\" href=\"template/style.css\" />",  
      			'js'					=> "<script language=\"JavaScript\" src=\"template/script.js\"></script>",  
      			'mainWidth'				=> "1000",  
      			'logo'					=> "<img align=\"right\" src=\"template/images/bgRightTopHead.gif\" alt=\"NKPortal - Board Portal System\" title=\"NKPortal - Board Portal System\" border=\"0\" />",  
      			'logo_separater'		=> "",  
      			'top_navigation'		=> $tpl->getTemplate('navigation_top'),  
      			'leftColumnWidth'		=> "160",  
      			'leftBlockContent'		=> $this->blockContentLeft,  
      			'centerBlockContent'	=> $this->blockContentCenter,  
      			'rightColumnWidth'		=> "160",  
      			'rightBlockContent'		=> $this->blockContentRight,  
      			'footer1'				=> "",  
      			'copyright'         	=> 'powered by <a class="copyright" href="http://www.nkportal.de" target="_blank">NKPortal</a>'  
      		);  
      		  
      		// do the Substitution  
      		$tpl->handleSubstitutions('index', array_merge($substitution_vars));  
      	}
      

      Das ist nur ein kleiner Auszug aus den ganzen Funktionen die für das Laden der versch. Templates notwendig sind.

      Meine Konkrete Frage wäre jetzt ob dieses Ersetzen der Platzhalter in der Prozedur handleSubstitutions() über str_replace() sinvoll ist oder wie ich es besser machen sollte.

      Gruß Andreas

      1. Hallo,

        Meine Konkrete Frage wäre jetzt ob dieses Ersetzen der Platzhalter in der Prozedur handleSubstitutions() über str_replace() sinvoll ist oder wie ich es besser machen sollte.

        Nutze doch die Fähigkeiten von PHP als Templatesprache. Mit alterativer Syntax. HTML-Quelltext in Variablen zu speichern ist aus meiner Sicht murx. Es sei denn, Du sammelst den Content mit ob_start() - ob_get_clean() ein.

        Gruß

        jobo

      2. Hi!

        Meine Absicht ist es ein CMS zu erstellen das den Usern erlaubt auf einfache und schnelle Weise Content und Menüs zu erstellen, ohne 4 Semester Joomla zu studieren.

        Das heißt also, dass du ihnen genau das zubilligst, aber keinen Schritt weiter. Sie sollen genau diese einfachen Aufgaben erledigen können, aber wenn sie weitergehen wollen, stoßen sie an die Grenzen, die du ihnen gesetzt hast, weil du nicht möchtest, dass sie sich weitergehendes Wissen aneigen müssen oder gar sollen. - Vielleicht ist das nicht das, was du willst, aber ich denke, es läuft darauf hinaus, wenn du dir nicht vorstellst, wie es nach dem Erreichen der derzeitigen, von dir durch den implementierten Funktionsumfang gesetzten Grenzen weitergehen soll.

        Meine Konkrete Frage wäre jetzt ob dieses Ersetzen der Platzhalter in der Prozedur handleSubstitutions() über str_replace() sinvoll ist oder wie ich es besser machen sollte.

        Hier fragst du wieder etwas ganz spezielles, ...

        Das ist nur ein kleiner Auszug aus den ganzen Funktionen die für das Laden der versch. Templates notwendig sind.

        ... ohne einen kompletten Überblick über den Aufbau, die Funktionsweise und den Funktionsumfang zu beschreiben. Deswegen kann ich nur auf den kleinen Teil eingehen, den ich sehe, ohne dir deine spezielle Frage beantworten zu können, weil mir der Hintergrund fehlt.

        function printPage() {
        Global $tpl, $nklib;

        Globale Variablen sollte man meiden. Du zeigst in deinem Code, dass du mit OOP arbeitest. Warum machst du es dann nicht so konsequent, wie es mit PHP möglich ist? Globale Variablen sind für das Verstehen ungünstig. Sie wurden irgendwo angelegt und können alles mögliche enthalten. Sie offenbaren sich erst durch Code- oder Dokumentationstudium. Am Anfang mag dir die Übersicht noch ausreichend scheinen, wenn du wenige globale Variablen hast. So dachten es vermutlich auch die Mediawiki-Ersteller. Doch dann wuchs das Projekt aufgrund seines Erfolges und die anfänglichen Nachlässigkeiten sind erhalten geblieben und machen es noch schwerer, sich einen Überblick zu verschaffen, als es schon allein aufgrund der Größe des Projektes mittlerweile der Fall ist.

          // Array with all Substitutes in index Template  
          $substitution\_vars = array(  
          	'title'					=> "<title>NKPortal - Board Portal System</title>",  
          	'css'					=> "<link rel=\"stylesheet\" href=\"template/style.css\" />",  
          	'js'					=> "<script language=\"JavaScript\" src=\"template/script.js\"></script>",  
          	'mainWidth'				=> "1000",  
          	'logo'					=> "<img align=\"right\" src=\"template/images/bgRightTopHead.gif\" alt=\"NKPortal - Board Portal System\" title=\"NKPortal - Board Portal System\" border=\"0\" />",  
          	'logo\_separater'		=> "",  
          	'top\_navigation'		=> $tpl->getTemplate('navigation\_top'),  
          	'leftColumnWidth'		=> "160",  
          	'leftBlockContent'		=> $this->blockContentLeft,  
          	'centerBlockContent'	=> $this->blockContentCenter,  
          	'rightColumnWidth'		=> "160",  
          	'rightBlockContent'		=> $this->blockContentRight,  
          	'footer1'				=> "",  
          	'copyright'         	=> 'powered by <a class="copyright" href="http://www.nkportal.de" target="\_blank">NKPortal</a>'  
        

        Struktur-Code, Darstellungs-Code und -Werte sowie Inhalt, bunt gemischt. Und dann nutzt du noch nicht einmal die Möglichkeiten des Verschachtelns von ' und ".

        Nur ein Beispiel einer Frage, die sich mir stellt: Warum steht der Titel als fest definierter Wert im Code? Am Ende soll der Inhalt der Portal-Verwender präsentiert werden und nicht das Portal selbst. Es nützt den Anwendern nichts, wenn da im Browser-Tab "NKPortal" steht statt "XY-Webpräsenz". Da sowas für Anwender wichtig ist, legen auch Suchmaschinen Wert auf diesen Inhalt. Du solltest darauf bedacht sein, dass deine Verwender _ihr_Ziel_ bestmöglich erreichen. - Damit beantworten sich deine grundlegenden Fragen auch quasi von selbst. Was deinen Verwendern und wiederum ihren Anwendern nützt, ist das, was implementiert werden muss - und zwar so, dass sie es gut bedienen können ("gut" bedeutet nicht unbedingt einfach aber stark eingeschränkt).

        Noch zwei Worte zum Unterschied zwischen Verwender und Anwender. Verwender sind diejenigen, die dein Portal verwenden, um ein/ihr Ziel zu erreichen. Anwender sind diejenigen, die letzlich mit dem Ergebnis arbeiten sollen. Sie sind also die Kunden der Verwender.

        Lo!

    2. Hello,

      Dann bedenke auch, dass PHP selbst bereits ein Template-System ist.

      Meinst Du, dass man PHP wirklich bedenkenlos als Template-System bezeichnen darf? Dafür kann es mMn viel zu viel. PHP ist eine embedded script language. Diese Sprachen zeichnet aus, dass sie die Programmkontrolle übernehmen können, allerdings in Abgrenzung zu den 3rd Generation Languages keinen direkten Zugriff mehr auf die Ressourcen ihres Hosts haben, also sich streng in
      ihrer Schicht bewegen müssen.

      Eine Template-Sprache darf aber genauso, wie HTML, keine Programmkontrolle erlangen, sondern nur noch vorgefertige Aktionen beschreiben und zur Ausführung bringen.

      Würde mich interessieren, wie Du darüber denkst.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo,

        Hello,

        Dann bedenke auch, dass PHP selbst bereits ein Template-System ist.

        Meinst Du, dass man PHP wirklich bedenkenlos als Template-System bezeichnen darf?

        http://de.wikipedia.org/wiki/Template_Engine#Beispiele_und_Tutorials_.28PHP.29

        http://lamp.clausvb.de/pte_examples/basic.php

        oder:

          
        <?php foreach($table as $row):?>  
        <tr>  
        <?php foreach($row as $cell):?>  
        <td><?=$cell?></td>  
        <?php endforeach?>  
        </tr>  
        <?php endforeach?>  
        
        

        Das Ersetzen von irgendwelchen Strings ist doch garnicht nötig, also doppeltgemoppelt. Genauso kannst Du natürlich auch partielle Codeschnipsel inkludieren, wenn du die öfter brauchst. Wie gesagt, Zend-Framework zeigt eigentlich ziemlich gut, wie das geht. Ist aber nicht ganz so trivial, wenn man auch hinter die Kulissen gucken möchte.

        Gruß

        jobo

      2. Hi!

        Dann bedenke auch, dass PHP selbst bereits ein Template-System ist.
        Meinst Du, dass man PHP wirklich bedenkenlos als Template-System bezeichnen darf?

        Ja.

        Dafür kann es mMn viel zu viel.

        Ich würde einem Template-System nur deshalb nicht mehr so nenenn wollen, nur weil man über einen bestimmten Funktionsumfang hinausgehen kann. Deswegen erfüllt es immer noch die Aufgaben eines Templatesystems.

        PHP ist eine embedded script language.

        Und sie kann trotzdem weiterhin auch als Templatresystem eingesetzt werden.

        Eine Template-Sprache darf aber genauso, wie HTML, keine Programmkontrolle erlangen, sondern nur noch vorgefertige Aktionen beschreiben und zur Ausführung bringen.

        Das würde den Begriff Template-System sehr stark einschränken. Ist nicht bereits ein Wiederholungsmechanismus ein System zur Programmkontrolle? Darf eine Entscheidung, welcher Inhalt in bestimmten Situationen (z.B. Fehlerfall vs. Gutfall) auszugeben ist, nicht innerhalb eines Templates gefällt werden? Wenn die Antwort auf die letzte Frage ja (darf nicht) wäre, würde das den Aufwand am Ende nur komplexer machen, ohne dass ich da groß einen Nutzen sehen kann. Für jeden Fall müsste dann ein eigenes Untertemplate (in einer eigenen Datei) erstellt werden, das von der Programmlogik eingebunden wird, wenn man nicht den Ausgabecode direkt in der Anzeigenlogik stehen haben will, was wiederum ein Editieren erschweren würde.

        Ich denke, je komplexer eine Ausgabelogik aufgrund des Anwendungsfalls sein muss, desto mehr Hindernisse hat man zu überwinden, wenn das Templatesystem keine mächtige Programmiermöglichkeit mit sich bringt. Die Betonung liegt hier auf "Möglichkeit". Ein Anfänger sollte idealerweise keine Einstiegsprobleme haben, aber er sollte auch nicht ausgebremst oder zum Systemwechsel gezwungen werden, wenn er fortgeschritten ist.

        Lo!

        1. Hallo,

          Das würde den Begriff Template-System sehr stark einschränken. Ist nicht bereits ein Wiederholungsmechanismus ein System zur Programmkontrolle? Darf eine Entscheidung, welcher Inhalt in bestimmten Situationen (z.B. Fehlerfall vs. Gutfall) auszugeben ist, nicht innerhalb eines Templates gefällt werden?

          Mmn. müssten Viewfragen im Template geklärt werden:

            
          <td>  
          <?if(trim($cell) == ""):?>  
          &nbsp;  
          <?php else:?>  
          <?=$cell?>  
          <?php endif?>  
          </td>  
          
          
            
          <span  
          <?if($row["sonderpreis") == "ja"):?>  
          class="sonderpreis"  
          
          >  
          
          <?=$row["preis"]?>  
          <span>  
          
          

          Gruß

          jobo

          1. Hi!

            Das würde den Begriff Template-System sehr stark einschränken. Ist nicht bereits ein Wiederholungsmechanismus ein System zur Programmkontrolle? Darf eine Entscheidung, welcher Inhalt in bestimmten Situationen (z.B. Fehlerfall vs. Gutfall) auszugeben ist, nicht innerhalb eines Templates gefällt werden?
            Mmn. müssten Viewfragen im Template geklärt werden:

            Ich würde mir nicht herausnehmen, diese Frage endgültig beantworten zu können.

            Lo!

        2. Hello,

          Dann bedenke auch, dass PHP selbst bereits ein Template-System ist.
          Meinst Du, dass man PHP wirklich bedenkenlos als Template-System bezeichnen darf?

          Ja.

          Dafür kann es mMn viel zu viel.

          Ich würde einem Template-System nur deshalb nicht mehr so nenenn wollen, nur weil man über einen bestimmten Funktionsumfang hinausgehen kann. Deswegen erfüllt es immer noch die Aufgaben eines Templatesystems.

          PHP ist eine embedded script language.

          Und sie kann trotzdem weiterhin auch als Templatresystem eingesetzt werden.

          Eine Template-Sprache darf aber genauso, wie HTML, keine Programmkontrolle erlangen, sondern nur noch vorgefertige Aktionen beschreiben und zur Ausführung bringen.

          Das würde den Begriff Template-System sehr stark einschränken. Ist nicht bereits ein Wiederholungsmechanismus ein System zur Programmkontrolle?

          Der Wiederholungsmechanismus selber gehört aber nicht ins Template. Er fällt in den Bereich Datenaufbereitung und Datenkopplung, an die man den User aber nicht heranlassen sollte. Bei PHP ist diese Einschränkung aber nicht möglich.

          Darf eine Entscheidung, welcher Inhalt in bestimmten Situationen (z.B. Fehlerfall vs. Gutfall) auszugeben ist, nicht innerhalb eines Templates gefällt werden?

          Nein, keinesfalls. Dies ist Sache von Controller und ggf. noch Datenmodell, sofern man "Template-System" überhaupt mit "Teil von MVC-Modell" übersetzen darf. Das Template gehört in den den Teil des View, der keinesfalls eigene Entscheidungen treffen darf, geschweige denn Programmkontrolle erlangen darf (außer vielleicht für seinen eigenen Bereich).

          Wenn die Antwort auf die letzte Frage ja (darf nicht) wäre, würde das den Aufwand am Ende nur komplexer machen, ohne dass ich da groß einen Nutzen sehen kann. Für jeden Fall müsste dann ein eigenes Untertemplate (in einer eigenen Datei) erstellt werden, das von der Programmlogik eingebunden wird, wenn man nicht den Ausgabecode direkt in der Anzeigenlogik stehen haben will, was wiederum ein Editieren erschweren würde.

          Ich denke, je komplexer eine Ausgabelogik aufgrund des Anwendungsfalls sein muss, desto mehr Hindernisse hat man zu überwinden, wenn das Templatesystem keine mächtige Programmiermöglichkeit mit sich bringt.

          Es muss eine mächtige Auswahlmöglichkeit besitzen, aber keinerlei Programmiermöglichkeit.

          Dabei muss es nur dort über die Fähigkeiten von HTML hinausgehen, wo dieses zu starr ist. Vermutlich wird HTML irgendwann einmal sowieso als Templatesystem ausreichen, dem man nur noch irgendwie geordnet die Daten zu übergeben hat und alles andere macht dann das HTTMML (HyperText Template Markup and Manipulation Language).

          Die Betonung liegt hier auf "Möglichkeit". Ein Anfänger sollte idealerweise keine Einstiegsprobleme haben, aber er sollte auch nicht ausgebremst oder zum Systemwechsel gezwungen werden, wenn er fortgeschritten ist.

          Das verstehe ich jetzt nicht. Was haben die Fähigkeiten eines Anfängers mit den Fähigkeiten eines Template-Systmes zu tun?

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi!

            Die Betonung liegt hier auf "Möglichkeit". Ein Anfänger sollte idealerweise keine Einstiegsprobleme haben, aber er sollte auch nicht ausgebremst oder zum Systemwechsel gezwungen werden, wenn er fortgeschritten ist.
            Das verstehe ich jetzt nicht. Was haben die Fähigkeiten eines Anfängers mit den Fähigkeiten eines Template-Systmes zu tun?

            Wie auch immer man Template-System definieren mag - für mich ist das nicht wichtig. Ein System sollte der Erfüllung seiner Aufgabe dienen und nicht einem theoretischen idealistischen Gebilde. Als Nebenforderungen sollte es einfach zu verstehen sein und auch bei zukünftigen Wünschen noch verwendbar sein. Ein System sollte für einen Anfänger keine zu hohe Hürde darstellen und gleichzeitig einen Fortgeschrittenen nicht zu sehr einschränken. Es sollte sich also quasi den Fähigkeiten des Anfängers beugen und mit denen des Fortschreitenden mithalten können.

            Lo!

            1. Hello,

              Die Betonung liegt hier auf "Möglichkeit". Ein Anfänger sollte idealerweise keine Einstiegsprobleme haben, aber er sollte auch nicht ausgebremst oder zum Systemwechsel gezwungen werden, wenn er fortgeschritten ist.
              Das verstehe ich jetzt nicht. Was haben die Fähigkeiten eines Anfängers mit den Fähigkeiten eines Template-Systmes zu tun?

              Wie auch immer man Template-System definieren mag - für mich ist das nicht wichtig. Ein System sollte der Erfüllung seiner Aufgabe dienen und nicht einem theoretischen idealistischen Gebilde. Als Nebenforderungen sollte es einfach zu verstehen sein und auch bei zukünftigen Wünschen noch verwendbar sein. Ein System sollte für einen Anfänger keine zu hohe Hürde darstellen und gleichzeitig einen Fortgeschrittenen nicht zu sehr einschränken. Es sollte sich also quasi den Fähigkeiten des Anfängers beugen und mit denen des Fortschreitenden mithalten können.

              Ja ok, dagegen habe ich auch nichts einzuwenden.

              Trotzdem sollte das System nicht "aus Versehen" mehr können, als es für den sicheren Betrieb können muss. Ein Mailserver sollte Mails versenden können und keine wilden Zugriffe auf das Dateisystem seines Hosts ermöglichen. Eine Datenbank sollte Daten speichern und strukturieren können und nicht Programme möglich machen, die auf dem Host herumvagabundieren können. Gegen Datenbank-interne Programme ist nichts einzuwenden. Ein Template-System sollte die benutzerdefinierbare Darstellung von Daten ermöglichen, aber keinen Zugriff auf weitere Funktionalitäten des Hosts oder des Programmes ermögichen, für das es arbeitet.

              Woher die Daten kommen, ist Aufgabe eines anderen Sub-Tools der Anwendung, nämlich z.B. die eines Abfragesystems / Abfragegenerators. Klassische Abfragegeneratoren haben auch immer die Erstellung einfacher "Templates" (das nannte man früher Formulare) ermöglicht; in unserem Fall sind wir aber einen Schritt weiter und sollten das strikt trennen.

              Die Vereinfachung im Umgang mit Templates liegt mMn nun darin, sie in überschaubare Einheiten zu zerteilen, die der User nach und nach kaskadieren kann und so zu einem Gesamtkunstwerk zusammenbauen kann. Dieses muss er sich sowohl in Einzelteilen als auch im Gesamten mit "Dummydaten" ansehen können. So kann er dann intuitiv auch Bauvorschriften für komplexere Views erzeugen.

              Welche Elemente benötigt werden und welche davon zugelassen werden, ist vom Anwendungsfall abhängig.

              Welche Elemente muss ein Templatesystem denn können?

              ich fang mal an, vielleicht machen die Mitleser ja einfach mal mit.

              • statische Darstellungen ohne Daten
              • statische Darstellungen mit Daten
              • dynamische Listen (je mehr Daten, desto länger. Ggf. blätterbar)
              • Treaddarstellungen
              • Menus
              • statische Eingabe-Formulare
              • dynamische Eingabe-Formulare (je mehr Daten, desto länger. Ggf. mehrseitig)
              • link-sensitive Darstellungen (also mit Verzeweigungen zu anderen Templates)
              • ???

              Wie müsste man z.B. einen Monatskalender abbilden, der ja jeden Monat etwas anders aufgebaut ist / mit einem anderen Wochentag beginnt? Wie müsste ein Template dafür aufgebaut werden?

              Wie müsste man vorgehen, wenn er Termine enthalten können soll, die bei Anklicken auch noch im Detail angezeigt werden sollen?

              Was soll denn erreicht werden?
              ------------------------------
              Wie baut man die Elemente nun so auf, dass es nachher egal ist, was man damit darstellen will? Im "Baukasten" finden sich immer die passenden Standardelemente (normalisierten Teillösungen), aus denen man das Gewünschte zusammenbauen kann ...

              HTML kann auch nicht alles. Es ist eine lose strukturierte Bauteilesammlung. Nicht alle Elemente sind wirklich logisch, weil gewachsen... Das W3 versucht nun nach und nach, einen sinnvollen Plan in diese gewachsene Sammlung zu bringen.

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hi!

                Welche Elemente muss ein Templatesystem denn können?

                Wir konnten uns ja schon nicht einmal über eine Definition einigen, was soll dann erst ein Beantwortungsversuch dieser Frage ergeben? Ich denke auch nicht, dass das besonders erkenntnisreich oder ergebnisbringend ist. Es gibt (abgesehen von PHP selbst) bereits Templatesysteme in PHP, die den Minimalansatz verfolgen (PEARs HTML_Template_IT) bis hin zu solchen mit Programmiermöglichkeit (Smarty).

                Wie müsste man z.B. einen Monatskalender abbilden, der ja jeden Monat etwas anders aufgebaut ist / mit einem anderen Wochentag beginnt? Wie müsste ein Template dafür aufgebaut werden?

                Wenn du dafür nicht ein 6+Kopf-zeiliges starres Gerüst bauen willst, bei dem meist eine Zeile ungenutzt verbleibt, empfiehlt sich dafür eine Funktion, die den Kalender-Code berechnet und einfügt. So ein Kalender ist ja ein wiederverwendbares Teil, also sollte man das gleich einigermaßen universal verwendbar gestalten.

                Wie müsste man vorgehen, wenn er Termine enthalten können soll, die bei Anklicken auch noch im Detail angezeigt werden sollen?

                Auch den dafür benötigten Code sollte die Kalender-Funktion mitliefert.

                Wie baut man die Elemente nun so auf, dass es nachher egal ist, was man damit darstellen will?

                Man lässt dem Verwender am besten größtmögliche Freiheiten.

                Im "Baukasten" finden sich immer die passenden Standardelemente (normalisierten Teillösungen), aus denen man das Gewünschte zusammenbauen kann ...

                Standard-Elemente kann man ja zusätzlich mitliefern.

                Lo!

                1. Hello,

                  Welche Elemente muss ein Templatesystem denn können?

                  Wir konnten uns ja schon nicht einmal über eine Definition einigen, was soll dann erst ein Beantwortungsversuch dieser Frage ergeben?

                  Schade.

                  Hätte mich gefreut, den Begriff mal etwas strammer zu fassen und den Unterschied zwischen "passiven" und "aktiven" Templates mal besonders klarzustellen.

                  Ich denke auch nicht, dass das besonders erkenntnisreich oder ergebnisbringend ist.

                  Ich denke, das könnte es doch werden!

                  Es gibt genügend Systeme, die fangen ungeheuer stark an und halten sich strikt an eine "Passivlösung", aber irgendwann einmal fehlt dann wahrscheinlich dem Entwickler die passende Idee oder ein anderer macht weiter, und bums, ist wieder "aktiver Code" (also welcher, der bis auf das OS durchgreifen kann) in den Elementen, die für die User oder Content-Manager gedacht sind, enthalten oder sie reagieren zumindest darauf, wenn man welchen einsetzt.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Hi!

                    Es gibt genügend Systeme, die fangen ungeheuer stark an und halten sich strikt an eine "Passivlösung", aber irgendwann einmal fehlt dann wahrscheinlich dem Entwickler die passende Idee oder ein anderer macht weiter, und bums, ist wieder "aktiver Code" (also welcher, der bis auf das OS durchgreifen kann) in den Elementen, die für die User oder Content-Manager gedacht sind, enthalten oder sie reagieren zumindest darauf, wenn man welchen einsetzt.

                    Vielleicht liegt das eher an den sich ändernden Anforderungen. Man merkt, dass der beste, theoretisch "saubere" Ansatz, der damals beim Erfinden oder beim Ausdenken im stillen Kämmerlein perfekt aussah, bestimmte Lösungen nicht oder nur sehr umständlich zulässt. Und dann kommt man vielleicht auf die Idee, dass es eben besser ist, die Möglichkeiten mehrerer Wege eingebaut zu haben, die der Verwender nach seinem eigenen Gutdünken verwenden kann.

                    Ein System wie Smarty hindert einen nicht daran, nur die für eine "Passivlösung" einsetzbaren Elemente zu nutzen. Aber wenn man dann eben nicht nur ein Template haben will, sondern ein System, dass die kompletten Aufgaben einer View erledigen soll, bremst es einen nicht aus. (Möglicherweise doch, ich weiß es nicht, da ich mich nie länger als 5 Minuten am Stück mit Smarty beschäftigt hab.)

                    Lo!

  2. Hello Andreas,

    bevor Du hier Einzelkapmf beginnst, solltest Du vielleicht den Kopf mit Heinetz zusammenstecken, der ähnliche Ansätze verfolgt.

    https://forum.selfhtml.org/?t=202464&m=1367576

    Deine "Security-Check"-Sequenzen würde ich übrigens als Konstanten festlegen, damit sie überall einheitlich zur Verfügung stehen und an einer einzigen Stelle verändert oder ergänzt werden können.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo Tom,
      danke für den Link, die dortigen Links und Text haben mir sehr weitergeholfen.

      Gruß Andreas