IF-statement aan template-parser toevoegen
Ik heb een template-parser ontwikkeld, vrij simpel, maar net wat ik nodig heb. Ik zit echter te denken om toch nog een kleine uitbreiding te doen. Smarty heeft ook zoiets aan boord als ik me niet vergis. Ik zou graag het het volgende bereiken.
Ik zou dit bijvoorbeeld willen toepassen op een formulier. Wanneer een formulier gepost is, dan moet het niet meer getoond worden. Dus alles tussen {#IF/START} en {#IF/END} moet weggefilterd worden. Ik zou een functie willen maken als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$oTemplate = new Template();
/* Indien ik het gedeelte wil verbergen */
$oTemplate->setIf('if', true);
/* Indien ik het gedeelte wil weergeven */
$oTemplate->setIf('if', false);
/* Dus algemeen */
$oTemplate->setIf($IfBlockName, false/true);
?>
$oTemplate = new Template();
/* Indien ik het gedeelte wil verbergen */
$oTemplate->setIf('if', true);
/* Indien ik het gedeelte wil weergeven */
$oTemplate->setIf('if', false);
/* Dus algemeen */
$oTemplate->setIf($IfBlockName, false/true);
?>
Misschien interessant om een paar stukjes code te geven van mijn huidige parser. Om bv {$COPYRIGHT} in te stellen doe ik het volgende:
Hoe ik de rest allemaal regel, doet niet ter zake. Het belangrijkste stukje code is het volgende:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$this->_sOutput = preg_replace_callback('/{\$([A-Z0-9_-]+)}/', array($this, 'replaceVariable'), $this->_sContent);
}
}
private function replaceVariable($match)
{
if(!key_exists(strtolower($match[1]), $this->_aReplacements)) {
throw new Error('Er is een template-parameter niet goed ingesteld: ' . $match[0] . '::' . $match[1]);
}else {
return $this->_aReplacements[strtolower($match[1])];
}
}
?>
$this->_sOutput = preg_replace_callback('/{\$([A-Z0-9_-]+)}/', array($this, 'replaceVariable'), $this->_sContent);
}
}
private function replaceVariable($match)
{
if(!key_exists(strtolower($match[1]), $this->_aReplacements)) {
throw new Error('Er is een template-parameter niet goed ingesteld: ' . $match[0] . '::' . $match[1]);
}else {
return $this->_aReplacements[strtolower($match[1])];
}
}
?>
Mijn vraag is dus: hoe kan ik die nieuwe functionaliteit het best maken?
Andere regex maken die het totaal weghaalt als het niet getoond moet worden en anders alleen dat template-tag-gedoe van je weghaalt.
Het lijkt me dat ik 2 regex'en nodig heb. Wat ik me echter afvraag, hoe zorg ik er voor dat de inhoud tussen die twee blocken kan bepalen?
Dit kan gewoon met één regex, juist om die inhoud te bepalen.
Toevoeging op 22/04/2011 12:47:42:
Ik ben uitgekomen op:
Echter zit er nog een probleempje in. Alles gaat goed, als alles op één lijn staat. Wanneer dat niet zo is, werkt het niet.
Dus:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
//dit werkt perfect
{$VOORBEELD#START} content blabla <br /> html {$VOORBEELD#STOP}
//dit werkt niet
{$VOORBEELD#START}
content blabla
<br />
html
{$VOORBEELD#STOP}
{$VOORBEELD#START} content blabla <br /> html {$VOORBEELD#STOP}
//dit werkt niet
{$VOORBEELD#START}
content blabla
<br />
html
{$VOORBEELD#STOP}
Ziet iemand de fout?
Gewijzigd op 22/04/2011 00:46:10 door Write Down