Hallo! Ik heb een template parser en ik vraag me af hoe blocks werken. Ik heb al veel gezocht maar ik kan het niet vinden. Bij grote template parsers zoals Template Power snap ik er niks van.

Kan iemand mij helpen?? Alvast bedankt!!!
Ook in de 1934 regels van Smarty snap ik er niks van.

Ik heb al de volgende functies:
- Template zetten
- Bestanden includen
- Vervangen van {NAAM}, enz.
- Error
- ...

Maar ik wil dus ook met blocks werken. Alleen snap ik niet hoe dat werkt. Ik heb wel een variabel ($this->pagina) met de hele pagina.

edit: Ik maak mijn eigen template parser, had ik er misschien even bij moeten zetten :D
In mijn template parser worden de template bestanden geconverteerd naar php bestanden. Je bedoelt met een block bijvoorbeeld een lijstje toch?

voorbeeldje:

template bestand:
{titel}
bladiebla
{lijstje!}
  naam:{.naam}
  achternaam: {.achternaam}
{;}


php bestand
<?php

if( isset($v['lijstje']) && is_array($v['lijstje']) ){

$r = '';
reset($v['lijstje']);
while(list($k,$a) = each($v['$k']))
$r .= 'naam:'.( isset($a['naam']) ? $a['naam'] : '' ).' achternaam: '.( isset($a['achternaam']) ? $a['achternaam'] : '' );

$v['lijstje'] = $r;

}else
$v['lijstje'] = 'naam:{.naam} achternaam: {.achternaam}';

return ( isset($v['titel']) ? $v['titel'] : '' ).'bladiebla'.( isset($v['lijstje']) ? $v['lijstje'] : '' );
?>

Ik kan de nieuwste versie van dit script (http://www.phphulp.nl/php/scripts/5/320/) binnenkort hier wel even neerzetten. Dan kun je zien hoe ik dit probleem heb opgelost.


Bedankt! Maar ik weet niet of dat is wat ik bedoel... Ik bedoel dat je een stuk code hebt, bijvoorbeeld dit:

<!-- START : blok_naam -->
<p>Hier de inhoud van het blok, bijvoorbeeld een formulier of foutmelding.</p>
<!-- EINDE : blok_naam -->

Zo'n blok staat dan gewoon in de template. Alleen kun je aangeven of het moet worden weergegeven, anders wordt het verwijderd.

Ik heb ondertussen al wat geprobeerd en ik heb het volgende:

> Functie om de comment-tags om een blok te verwijderen.
<?php
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->(.+?)<!-- EINDE : ".$blok_naam." -->/si", "\\1", $this->pagina);
}
?>

> In de functie waar de pagina wordt gemaakt worden alle bloks verwijderd waar de comment-tags nog omstaan.
<?php
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->/si", "", $this->pagina);
?>

Dit werkt! Alleen heb ik een probleem. Als een blok wordt verwijderd blijft er een witregel in de bron-code. Ook als de comment-tags worden verwijderd krijg je een witregel. De content ziet er dan bijvoorbeeld zo uit:

<div id="content">
Dit is de content!

<br /> Blok 1


</div>

Onder <br /> Blok 1 stond eerst blok 2. Maar omdat die is verwijderd komen er witregels.

Ik hoop dat dit een beetje duidelijk is :P

Hoe kun je dus voorkomen dat er witregels komen?
<?php

$this->pagina = preg_replace"/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);

?>
Het werkt helemaal! Heel erg bedankt!!! Ik heb hier een week naar gezocht!

Hier is de hele code van de template parser. In de error functie zit volgens mij nog een foutje. Als de hoofd-template niet kan worden geopend krijg je geen foutmelding. Misschien weet je hoe dat komt? Verder werkt het goed. Als je verder nog fouten ziet...

<?php
class template
{
var $pagina = "";
var $error = array();

// De template zetten
function template($bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!$lees_template = fopen($bestand, "r"))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> kon niet worden gelezen!";
}
// De template openen en de inhoud in $this->pagina zetten
else
{
$this->pagina = fread($lees_template, filesize($bestand));
fclose($lees_template);
}
}

// Een sub-template invoegen
function invoegen($invoeg_naam, $bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Sub-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!fopen($bestand, "r"))
{
$this->error[] = "Sub-template <b>".$bestand."</b> kon niet worden gelezen!";
}
else
{
// De sub-template openen en de invoeg naam in $this->pagina met de inhoud vervangen
ob_start();
include($bestand);
$this->pagina = str_replace("<!-- INVOEGEN : ".$invoeg_naam." -->", ob_get_contents(), $this->pagina);
ob_end_clean();
}
}

// Plaatshouders vervangen
function vervang($plaatshouder, $vervangingswaarde)
{
$this->pagina = str_replace("{".$plaatshouder."}", $vervangingswaarde, $this->pagina);
}

// Blokken zetten
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->[\r\n]*(.+?)<!-- EINDE : ".$blok_naam." -->[\r\n]*/si", "\\1", $this->pagina);
}

// Geef de inhoud van de pagina
function maak_pagina()
{
// Kijken of $this->pagina is gevuld
if($this->pagina == "")
{
$this->error[] = "Er is een lege hoofd-template opgegeven!";
}
// Als er errors zijn
elseif(count($this->error) != 0)
{
echo "<h1>Fout</h1>\n<ul>\n";
foreach($this->error as $error)
{
echo "<li>".$error."</li>\n";
}
echo "</ul>";
}
// Als alles goed is
else
{
// Blokken verwijderen met comment-tags erom
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);
// Niet vervangde plaatshouders verwijderen
$this->pagina = preg_replace("/\{(.*)\}/", "", $this->pagina);
// De pagina weergegeven
echo $this->pagina;
}
}
}
?>
Oeps... Ik ben iets helemaal vergeten. Met deze parser kun je een block maar 1 keer zetten!

Weet iemand hoe blocks werken in bijvoorbeeld Template Power?? Daar kun je een block wel 2 keer weergeven.

Alvast bedankt!!

Reageren