Beste iedereen,

Ik loop tegen een probleempje aan. Ik ben bezig met een CMS en heb een template parser gemaakt. De template parser werkt op deze manier:

TEMPLATE.HTML

<html>
<head>
<title>{CMS:TITLE}</title>
</head>
<body>
<H1>{CMS:TITLE}</H1>
{CMS:CONTENT}
</body>
</head>

De parser loopt er zo doorheen:

<?php
function parse_template($searchkind, $search , $replace)
	{
	     $this->template = eregi_replace ( "{".$searchkind.":".$search."}", $replace, $this->template);
	}?>


Oftuwel, in de index roep ik m zo aan:

<?php
parse_template("cms", "content" , $fetch["pagina_inhoud"]);
?>


Werkt helemaal toppie.
Nou heb ik alleen ook module support, dat werkt met includes:


<?php
$values=explode(";",getSetting('installed_modules'));
		foreach ($values as $filename) { 
		$_GET["display"]='frontend';
		$this->template=str_replace ( "{MODULE:".strtoupper(basename($filename, ".php"))."}", "<?php include('./modules/".$filename.".php'); ?>", $this->template);
		}
?>


Zo loopt hij door de geinstalleerde modules heen, en include de module waar nodig is. (via EVAL worden de includes uitgevoerd).

Nou weet ik dat je met includes een get zo mee kan sturen:


<?php
$_GET["extrawaarde"]="foo";
include("module.php"); //Module.php kan nu de get extrawaarde uitlezen
?>


Alleen, stel nou dat ik in mijn template get waardes mee wil sturen, dus zo ongeveer:

{MODULE:FOTOBOEK|album=2&foto=3}

Hoe kan ik dan 'album=2&foto=3' uitlezen, en deze code uitvoeren voor de include:


<?php
$_GET["album"]=2;
$_GET["foto"]=3;
?>


Hier loop ik vast. Ik verwacht iets met regular expressions, maar ik snap hier zelf bijna niks van. Zou een van jullie me kunnen helpen?

Alvast hartelijk bedankt!

Met vriendelijke groet,
Rob Quist
Ereg(i) is oud, gebruik preg_match.
Verder is deze bbcode parser hier op phphulp brak. Als je een php start tag hebt, moet je ook een php end tag hebben.
Je zult het betreffende gedeelte moeten matchen met een regex en de functie preg_match(). Met een goede regex kun je de variabelen en hun waarde wel uit die string halen en vervolgens in een variabele stoppen.

Een paar andere punten:
- De GET variabelen die jij gebruikt zijn geen GET variabelen. Deze komen normaal namelijk uit de url en dit kan nog wel eens een probleem opleveren als je een variabele met dezelfde naam in de url gebruikt. Gebruik elke willekeurige andere array ($aTemplateVars bijvoorbeeld), maar geen $_GET.
- Persoonlijk denk ik dat je het jezelf erg lastig maakt door op deze manier met includes te gaan werken. Het lijkt mij een mooi mix van PHP en HTML worden en dat wil je liever niet. Misschien moet je je opbouw nog eens goed overdenken?
hmm, dat ereg dat klopt, dit stukje van de template parser komt uit een script wat ik vroeger heb geschreven.
die $_GET is inderdaad iet wat verwarrend maar vond het wel een makkelijke uitweg.

Op welke manier raad je me dan aan om modules in te kunnen laden in pagina's, via een statische template?

Op deze manier kan de gebruiker namelijk heel makkelijk {MODULE:CONTACTFORM} toevoegen in de CMS en dan verschijnt er een mooi contactformuliertje.

Edit: Laten we het er nou op houden dat ik deze code graag wil blijven gebruiken.
Kan iemand mij helpen met een reguliere expressie maken om de extra waardes uit te kunnen lezen?

Oke, laat maar - Lang leve explode.


<?php

$string="{MODULE:TEST|argument1=abc&argument2=def&album=2&foto=1243}";

$array=explode("|",$string);

$array=explode("}",$array[1]);

$bigarray=explode("&",$array[0]);

foreach ($bigarray as $value) {
$variables=explode("=",$value);
echo 'Argument= '.$variables[0].' and value='.$variables[1].'<br/>';
}

?>

kan je dat niet allemaal doen met str_replace ?
Hoe wou jij argumenten en hun waardes uitlezen via str_replate ? :P

Reageren