[PHP] Vars in templates vervangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 15:18

WhiteDog

met zwarte hond

Topicstarter
Ik heb een tijdje geleden een template systeem gebouwd die een text file met html uitleest en alles tusse {} vervangt door de waarde van een variable. bv.

$user = "ik";
test {user} test >>> test ik test

Ik include hiervoor volgend stukje code vanaf een aparte file:
PHP:
1
2
3
4
5
6
7
8
<?
    $html = implode('', file("test.tpl"));
    $html = preg_replace('/\{(.+?)\}/', '${"\1"}', $html);
    $html = str_replace('"',"'",$html);
    eval ("\$html= \"$html\";");
    $html = str_replace("'",'"',$html);
    print $html;
?>

Dit werkt vrij goed maar nu moet ik een template inlezen, vars vervangen en dit alles naar een variable sturen.

ik zou dus bovenstaand stukje code in een functie willen gieten. het probleem met functies is echter dat je ELKE variable die je wil gebruiken vanuit een bovenliggend php script als "global" moet declareren binnen je functie. Gezien het grote aantal vars doe ik dit liever niet.

Iemand die me kan helpen met het omzetten van mijn include zodat ik een output kan doen naar een var? Dus iets zoals:
PHP:
1
2
3
4
5
6
7
8
9
<?
    function parse_template($template_file)
        $html = implode('', file($template_file));
        $html = preg_replace('/\{(.+?)\}/', '${"\1"}', $html);
        $html = str_replace('"',"'",$html);
        eval ("\$html= \"$html\";");
        $html = str_replace("'",'"',$html);
        return $html;
?>


Het moet trouwens niet met {userid}, als ik gewoon $userid in mijn text file zou kunnen gebruiken zou het nog beter zijn :) Ik vrees echter dat ik voor een totaal andere aanpak ga moeten kiezen...

[ Voor 13% gewijzigd door WhiteDog op 11-01-2005 12:19 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Het kan makkelijk (en eng), door alle globals binnen je functiescope te importeren:

PHP:
1
2
3
4
function parse_template($template_file) {
  extract($GLOBALS);
  // ...
}


Doe dit niet! Het is vies en traag.

Een betere oplossing is de parameters bij elke aanroep expliciet meegeven (in de vorm van een associatieve array):

PHP:
1
2
3
4
function parse_template($template_file, $parameters) {
  extract($parameters);
  // ...
}


Het enige nadeel is dat je hiervoor veel bookkeeping moet doen aan de client-kant (door het opbouwen en bijhouden van de array).

Wat ik tegenwoordig zelf doe en behoorlijk goed werkt (en Smarty werkt volgens mij ook zo), is de functionaliteit in een klasse stoppen en die klasse de lijst van parameters laten bijhouden. Het is gebaseerd op hetzelfde principe als de vorige oplossing, maar ik vind het zelf fijner werken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Templates {
  var $parameters = array();

  function assign($name, $value) {
    $this->parameters[$name] = $value;
  }

  function assignAll($parameters) { 
    // Slikt een associatieve array, makkelijk als je meer variabelen tegelijk 
    // wilt toekennen (zoals bijvoorbeeld alle waarden uit een database rij die je
    // met mysql_fetch_assoc hebt opgehaald)
    foreach ($parameters as $name=>$value) {
      $this->assign($name, $value);
    }
  }

  function parse($template_file) {
    extract($this->parameters);
    // ...
  }
}

// In het gebruik:

$tpl =& new Templates();
$tpl->assign("what", "World");
echo $tpl->parse("hello_something");

[ Voor 5% gewijzigd door Verwijderd op 11-01-2005 12:26 ]


Acties:
  • 0 Henk 'm!

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 15:18

WhiteDog

met zwarte hond

Topicstarter
Het is dit geworden (voorlopig):

PHP:
1
2
3
4
5
6
7
8
9
function parse_template($template_file)  {
    extract($GLOBALS); 
    $html = implode('', file($template_file));
    $html = preg_replace('/\{(.+?)\}/', '${"\1"}', $html); 
    $html = str_replace('"',"'",$html); 
    eval ("\$html= \"$html\";"); 
    $html = str_replace("'",'"',$html); 
    return $html; 
}


het werkt alleszins, waarvoor mijn dank _/-\o_
Als iemand een "beter" systeem weet om vanaf één functie en zonder vars te declareren dit kan doen mag hij/zij dit altijd even melden :)

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Waarom niet gewoon een strreplace met 2 arrays aanroepen? Of zie ik een probleem niet wat je wel hebt?

Acties:
  • 0 Henk 'm!

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 15:18

WhiteDog

met zwarte hond

Topicstarter
djluc schreef op dinsdag 11 januari 2005 @ 15:24:
Waarom niet gewoon een strreplace met 2 arrays aanroepen? Of zie ik een probleem niet wat je wel hebt?
In een functie kan je niet zomaar alle variablen gebruiken die op dat moment in gebruik zijn (aanroepend php script). Het zijn net die vars die ik nodig heb. Via bovenstaande methodes kan het dus wel :)

Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 19:50

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Ik heb hier zelf ook aan gewerkt en heb veel gehad aan dit voorbeeld van drm :)

Acties:
  • 0 Henk 'm!

  • iH8
  • Registratie: December 2001
  • Laatst online: 17-06-2024

iH8

wh00ps wrong topic, sorry mensen |:(

[ Voor 89% gewijzigd door iH8 op 12-01-2005 10:22 ]

Aunt bunny is coming to get me!

Pagina: 1