Mehrere dynamische Blöcke in Modul-Templates

Ideen für neue Funktionen in CONTENIDO?
Antworten
delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Mehrere dynamische Blöcke in Modul-Templates

Beitrag von delinquent » Di 4. Sep 2007, 08:34

Hallo alle zusammen,

ich hab gerade schon fleißig gesucht, bin aber nicht fündig geworden, deshalb schneide ich das Thema hier mal an:

Denkt ihr, es kann sinnvoll sein, mehrere dynamische Blöcke in einem Template unterzubringen? Á la:

Code: Alles auswählen

...
<!-- BEGIN:BLOCK -->
...
<!-- END:BLOCK -->
...
<!-- BEGIN:BLOCK[2] -->
...
<-- END:BLOCK[2] -->
und die Funktionen set() und next() in der Klasse Template entsprechend um den optinalen Block-int zu erweitern? Das hätte mir schon das ein oder andere Mal entsprechendes Verschachteln der Templates erspart.

Oder haltet Ihr das für unübersichtlich oder Fehlerträchtig? Entsprechender Parsing-Probleme, wie bei

Code: Alles auswählen

...
<!-- BEGIN:BLOCK -->
...
<!-- BEGIN:BLOCK[2] -->
...
<!-- END:BLOCK -->
...
<-- END:BLOCK[2] -->
bin ich mir bewusst, dennoch würde mich Eure Meinung dazu interessieren.

Gruß,
delinquent

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Beitrag von xmurrix » Di 4. Sep 2007, 20:54

Hallo delinquent,

ich finde es generell eine gute Idee, mehrere Blöcke in Templates zu verwenden.

Dein Vorschlag würde sich mit den Contenido Bordmitteln auch lösen. Im Folgenden ein Codesnipsel, wie man zwei Blöcke verarbeiten kann:

Code: Alles auswählen

cInclude("classes", "class.template.php", false);

$tpl = new Template();

// statische variable setzen
$tpl->set('s', 'STATIC', 'foo');

// zwei dynamische variablen setzen
$tpl->set('d', 'DYNAMIC', 'bar');
$tpl->next();
$tpl->set('d', 'DYNAMIC', 'bar 2');
$tpl->next();

// template parsen (mit rueckgabe des codes)
$content = $tpl->generate('path/to/template.html', true);

// reset und neue block codes
$tpl->reset();
$tpl->tags['start'] = '<!-- BEGIN:BLOCK[2] -->';
$tpl->tags['end']   = '<!-- END:BLOCK[2] -->';

// zwei dynamische variablen im neuen block setzen
$tpl->set('d', 'DYNAMIC_OTHER', 'lorem ipsum');
$tpl->next();
$tpl->set('d', 'DYNAMIC_OTHER', 'lorem ipsum 2');
$tpl->next();

// entgueltige ausgabe...
$tpl->generate($content);
Das Beispiel ist Programmiertechnisch vielleicht nicht ganz ideal, weil der Inhalt des Templates 2 x geparst wird, tut aber seinen Zweck.

Mann könnte eine Klasse von Template ableiten, und der eine Funktion verpassen, welches sich um das Wechseln der Block-Tags kümmert. Beispiel:

Code: Alles auswählen

class myTemplate extends Template {

	function myTemplate($tags=false) {
		parent::Template($tags);
	}

	function setBlock($key=null) {
		$this->reset();
		if ($key==null) {
			// standard tags
			$this->tags['start'] = '<!-- BEGIN:BLOCK -->';
			$this->tags['end']   = '<!-- END:BLOCK -->';
		} else {
			// andere block tags
			$this->tags['start'] = '<!-- BEGIN:BLOCK['.$key.'] -->';
			$this->tags['end']   = '<!-- END:BLOCK['.$key.'] -->';
		}
	}

}


// verwendung
$tpl = new myTemplate();
...

// dann eine zeile
$tpl->setBlock('2');

// anstatt
$tpl->reset(); 
$tpl->tags['start'] = '<!-- BEGIN:BLOCK[2] -->'; 
$tpl->tags['end']   = '<!-- END:BLOCK[2] -->'; 
...

Das erspart zwar das Setzen der Block-Tags aber nicht das mehrfache Parsen des Templatecodes. Solange sich das aber in Grenzen hält, kann man mit dem Performancenachteil sehr gut leben...

Gruß
xmurrix

delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Beitrag von delinquent » Mi 5. Sep 2007, 12:02

An einen solchen Ansatz hatte ich gedacht. Das "Problem" bei Deinem ersten Vorschlag sehe ich allerdings in der jetzigen Funktion reset(). Die setzt nämlich die "$tags" nicht wieder zurück. Das setzt vorraus, dass man in seinem Modul nachher wieder alles "bereinigt", weil sonst die Abarbeitung der anderen Templates verrückt spielen *kann*, wenn das selbe Objekt weiter verwendet wird.

Das ist ja gerade bei $tpl oft der Fall:

Code: Alles auswählen

if (!is_object($tpl))
 $tpl = new Template;
Gut, das ist kein wirkliches Problem wenn man weiß, was man tut. Aber es ist ja auch nur ein Feature-Request. Vielleicht finden sich ja noch weitere Interessenten an einer Erweiterung der Template-Klasse.

Vielen Dank jedenfalls für Deinen Ansatz. Und wer die Performance-Einbuße nicht verträgt, kann immernoch sein HTML im Modul hardcoden :-)

hes
Beiträge: 44
Registriert: Di 3. Jan 2006, 17:01
Kontaktdaten:

Beitrag von hes » So 2. Dez 2007, 18:30

PING: Bitte auf die Wunschliste von "Contenido next Version" setzen.

Diese Möglichkeit wäre der HAMMER!

Und wenn man die Idee dann so ausfeilt - das auch verschachtelte BLOCKs möglich sind ... ja dann ... träum ... dann wäre es auch endlich möglich Tabellen dynamisch aufzubauen.

Alias:

Code: Alles auswählen

<table>
<!-- BEGIN:BLOCK[1] -->
  <tr>
  <!-- BEGIN:BLOCK[2] -->
    <td style="$dyn-style">
    <!-- BEGIN:BLOCK[3] -->
      $blblbablblba-content
    <-- END:BLOCK[3] -->
  </td>
  <-- END:BLOCK[2] -->
  </tr>
<!-- END:BLOCK[1] -->
</table>

<!-- BEGIN:BLOCK[4] -->
$blblba4
<-- END:BLOCK[4] -->

Liebes Contenido-Entwickler-Team ... wäre diese Idee umsetzbar?
Mfg. hes

Antworten