Как реализовать отображение как smarty в PHP? - PullRequest
1 голос
/ 19 ноября 2009
$smarty->assign('name',$value);
$smarty->display("index.html");

Так что он автоматически заменяет $variables в index.html, который экономит echo?

Ответы [ 4 ]

1 голос
/ 19 ноября 2009

взято из предыдущего вопроса

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');

в шаблоне

<?= $foobar ?>

будет выводить foobar .... если вам нужно создать собственный синтаксис, вы можете использовать preg_replace_callback

например:

function replace_var($matches){
    global $data;
    return $data[$matches[1]];
}
preg_replace_callback('/{$([\w_0-9\-]+)}/', 'replace_var');
1 голос
/ 19 ноября 2009

Используя класс Templater из предыдущего ответа , вы можете изменить функцию рендеринга на использование регулярных выражений

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');

И следующий файл шаблона:

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

будет отображать:

Это моя переменная Мое значение

Отказ от ответственности: на самом деле не запускайте это, чтобы увидеть, работает ли оно! Смотрите руководство по PHP на preg_replace, пример # 2: http://php.net/manual/en/function.preg-replace.php

1 голос
/ 19 ноября 2009

Вы можете использовать что-то вроде этого:

// 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
0 голосов
/ 19 ноября 2009

Функциональность, которую вы описываете, обрабатывается функцией extract php, например:

// 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";

Но я бы настоятельно советовал вам использовать один из классов, опубликованных Sergey или RageZ, поскольку в противном случае вы будете изобретать велосипед заново, в PHP доступно множество низкопрофильных и высокопроизводительных шаблонных классов, для многих на самом деле:)

...