IF-statement aan template-parser toevoegen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Write Down

Write Down

21/04/2011 21:42:28
Quote Anchor link
Beste PHP'ers

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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
{#IF/START}
blabla HTML blabla
{#IF/END}


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)
PHP script in nieuw venster Selecteer het PHP script
1
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);

?>


Misschien interessant om een paar stukjes code te geven van mijn huidige parser. Om bv {$COPYRIGHT} in te stellen doe ik het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$oTemplate
->addAssigment('copyright', '&copy'.date('Y').' - phpHulp');
?>


Hoe ik de rest allemaal regel, doet niet ter zake. Het belangrijkste stukje code is het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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])];
        }
    }

?>


Mijn vraag is dus: hoe kan ik die nieuwe functionaliteit het best maken?
 
PHP hulp

PHP hulp

26/12/2024 16:50:34
 

21/04/2011 21:44:39
Quote Anchor link
Andere regex maken die het totaal weghaalt als het niet getoond moet worden en anders alleen dat template-tag-gedoe van je weghaalt.
 
Write Down

Write Down

21/04/2011 22:20:06
Quote Anchor link
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?
 

21/04/2011 22:39:03
Quote Anchor link
Dit kan gewoon met één regex, juist om die inhoud te bepalen.
 
Write Down

Write Down

21/04/2011 22:43:37
Quote Anchor link
Bedankt Karl, ik ga even zoeken hoe, geen idee @ the moment :-)


Toevoeging op 22/04/2011 12:47:42:

Ik ben uitgekomen op:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$pattern
= '/{\$([A-Z0-9_-]+)#START}(.+?)\{\$([A-Z0-9_-]+)#STOP}/'
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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}


Ziet iemand de fout?
Gewijzigd op 22/04/2011 00:46:10 door Write Down
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.