需要你的PHP模板帮助。我是PHP的新手(我来自Perl + Embperl)。无论如何,我的问题很简单:
代码看起来像这样:
$rows = execute("select * from blogs where date='$date' order by date DESC");
foreach ($rows as $row){
print render("/templates/blog_entry.php", $row);
}
function render($template, $param){
ob_start();
include($template);//How to pass $param to it? It needs that $row to render blog entry!
$ret = ob_get_contents();
ob_end_clean();
return $ret;
}
任何想法如何实现这一目标?我真的很难过:)有没有其他方法来渲染模板?
答案 0 :(得分:31)
考虑包含一个PHP文件,就好像您将包中的代码复制粘贴到include-statement所在的位置。这意味着您继承了当前的范围。
因此,在您的情况下,$ param已在给定模板中可用。
答案 1 :(得分:19)
$ param应该已经在模板中可用了。当你包含()一个文件时,它应该与它所包含的范围相同。
来自http://php.net/manual/en/function.include.php
当包含文件时,代码就是它 包含继承变量范围 包含的行 发生。任何可用的变量 调用文件中的那一行将是 在被调用文件中可用,来自 那一点。但是,所有 中定义的函数和类 包含文件具有全局范围。
您还可以执行以下操作:
print render("/templates/blog_entry.php", array('row'=>$row));
function render($template, $param){
ob_start();
//extract everything in param into the current scope
extract($param, EXTR_SKIP);
include($template);
//etc.
然后$ row可用,但仍称为$ row。
答案 2 :(得分:1)
当我在简单的网站上工作时,我使用以下帮助函数:
function function_get_output($fn)
{
$args = func_get_args();unset($args[0]);
ob_start();
call_user_func_array($fn, $args);
$output = ob_get_contents();
ob_end_clean();
return $output;
}
function display($template, $params = array())
{
extract($params);
include $template;
}
function render($template, $params = array())
{
return function_get_output('display', $template, $params);
}
显示将模板直接输出到屏幕。 render会将其作为字符串返回。它利用ob_get_contents返回函数的打印输出。