views:

287

answers:

4
$smarty->assign('name',$value);
$smarty->display("index.html");

So that it automatically replaces $variables in index.html which saves a lot of echo?

A: 

You can use something like this:

// assigns the output of a file into a variable...
function get_include_contents($filename, $data='') {
    if (is_file($filename)) {
        if (is_array($data)) {
            extract($data);
        }
        ob_start();
        include $filename;
        $contents = ob_get_contents();
        ob_end_clean();
        return $contents;
    }
    return false;
}


$data = array('name'=>'Ross', 'hobby'=>'Writing Random Code');
$output = get_include_contents('my_file.php', $data);
// my_file.php will now have access to the variables $name and $hobby
Sergey Kuznetsov
A: 

taken from the previous question

class Templater {

    protected $_data= array();

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

    function render($template_file) {
       extract($this->_data);
       include($template_file);
    }
}

$template= new Templater();
$template->assign('myvariable', 'My Value');
$template->render('path/to/file.tpl');

in the template

<?= $foobar ?>

would print foobar .... if you need to make your own syntax you can use preg_replace_callback

for example :

function replace_var($matches){
    global $data;
    return $data[$matches[1]];
}
preg_replace_callback('/{$([\w_0-9\-]+)}/', 'replace_var');
RageZ
thanks to this user for the code http://stackoverflow.com/users/212700/unknown-google
RageZ
Can someone understand how it replaces the variable of $myvariable here?I just don't see that part.
Mask
A: 

Using the Templater class from the previous answer you could change the render function to use regular expressions

function render($template_file) {
  $patterns= array();
  $values= array();
  foreach ($this->_data as $name=>$value) {
    $patterns[]= "/\\\$$name/";
    $values[]= $value;
  }
  $template= file_get_contents($template_file);
  echo preg_replace($patterns, $values, $template);
}

......

$templater= new Templater();
$templater->assign('myvariable', 'My Value');
$templater->render('mytemplate.tpl');

And the following template file:

<html>
<body>
This is my variable <b>$myvariable</b>
</body>
</html>

Would render:

This is my variable My Value

Disclaimer: haven't actually run this to see if it works! See the PHP manual on preg_replace, example #2: http://php.net/manual/en/function.preg-replace.php

pygorex1
A: 

The functionality you describe is handled by the extract php function, for example:

// Source: http://www.php.net/manual/en/function.extract.php
$size = "large";
$var_array = array("color" => "blue", "size"  => "medium", "shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size\n";

But i would strongly advise you to use one of the classes posted by Sergey or RageZ since else you'll be reinventing the wheel, there are plenty of lowprofile and highend template classes available in PHP, to many actually :)

ChrisR