如何将参数传递给使用'include'呈现的PHP模板?

时间:2009-08-21 14:29:37

标签: php templates parameters include

需要你的PHP模板帮助。我是PHP的新手(我来自Perl + Embperl)。无论如何,我的问题很简单:

  • 我有一个小模板来渲染一些项目,让它成为博客文章。
  • 我知道使用此模板的唯一方法是使用'include'指令。
  • 我想通过所有相关的博客文章在循环中调用此模板。
  • 问题:我需要将参数传递给此模板;在这种情况下引用代表博客文章的数组。

代码看起来像这样:

$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;
}

任何想法如何实现这一目标?我真的很难过:)有没有其他方法来渲染模板?

3 个答案:

答案 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返回函数的打印输出。