PHP: 简单的模板引擎

4

我有一个叫做load_template()的函数。

这个函数有两个参数:

  • $name => 模板名称
  • $vars => 键值对数组,用于替换模板中的变量。

我希望它的工作方式是这样的:

在模板 ('test') 中,我想要能够编写以下内容:

<?php echo $title; ?>

然后调用

load_template('test', array('title' => 'My Title'));

我该如何做到这一点呢?


输出缓存方法。 我已经想出了下面的代码。
我相信它可以改进。

public static function template($name, $vars = array()) {
  if (is_file(TEMPLATE_DIR . $name . '.php')) {
    ob_start();
    extract($vars);
    require(TEMPLATE_DIR . $name . '.php');
    $contents = ob_get_contents();
    ob_end_clean();
    return $contents;
  }
  throw new exception('Could not load template file \'' . $name . '\'');
  return false;
}

你能展示一下你目前的进展吗? - jasonbar
如果需要返回内容,ob-way是可以的。然而,我认为除了一些罕见的特殊情况外,它没有什么用处。为什么不直接让它进入浏览器呢? - Your Common Sense
标准包含有什么问题吗?您是否正在模板化变量名称?为什么 $title = "My Title"; include "test.templ" 不足? - Captain Giraffe
2个回答

10
function load_template($name, $vars)
{
  extract($vars);
  include $name;
}

如果你希望将输出捕获到一个变量中,可以使用ob_startob_get_clean来包装代码。


2

你是说像这样的吗?

function load_template($name, $vars)
{
  include('template/'.$name.'.tpl'); //.tpl, .inc, .php, whatever floats your boat
}

template/whatever.tpl中,你需要这样写:

...
<title><?php echo $vars['title'] ?></title>
...

...
<?php if (!empty($vars['content'])): //template still needs to know if the content is empty to display the div ?>
    <div id="content">
<?php echo $vars['content']; ?>
    </div>
<?php endif; ?>
...

当然,这假设输出直接打印。您可以让tpl文件直接打印,或生成一个字符串,或缓冲tpl文件的输出并从load_template返回它。

不太对。我想要在处理后能够将加载的模板作为字符串返回。另外,我会添加extract($vars),这样就不必从数组中引用变量了。 - Hailwood
是的,在这种情况下,“extract”是正确的选择。其实我完全忘记它了,只要确保正确处理$vars['vars']和$vars['name']即可。 - zzzzBov
摆脱所有那些 if (!empty 的废话,这是业务逻辑的工作。模板应该始终提供完整的变量集。 - Your Common Sense

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接