Template parser via includes - Get meegeven?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Rob Quist

Rob Quist

22/12/2010 13:09:39
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<html>
<head>
<title>{CMS:TITLE}</title>
</head>
<body>
<H1>{CMS:TITLE}</H1>
{CMS:CONTENT}
</body>
</head>

De parser loopt er zo doorheen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
parse_template("cms", "content" , $fetch["pagina_inhoud"]);
?>


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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?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
Gewijzigd op 22/12/2010 13:13:05 door Rob Quist
 
PHP hulp

PHP hulp

25/12/2024 18:18:41
 

22/12/2010 13:13:50
Quote Anchor link
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.
 
Joren de Wit

Joren de Wit

22/12/2010 13:19:08
Quote Anchor link
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?
 
Rob Quist

Rob Quist

22/12/2010 13:22:54
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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/>';
}


?>
Gewijzigd op 22/12/2010 14:57:00 door Rob Quist
 
Maarten PHP

Maarten PHP

22/12/2010 15:19:51
Quote Anchor link
kan je dat niet allemaal doen met str_replace ?
 
Rob Quist

Rob Quist

22/12/2010 15:26:35
Quote Anchor link
Hoe wou jij argumenten en hun waardes uitlezen via str_replate ? :P
 



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.