How to pass parameters to PHP template rendered wi

2019-03-09 17:18发布

need your help with PHP templating. I'm new to PHP (I'm coming from Perl+Embperl). Anyway, my problem is simple:

  • I have a small template to render some item, let it be a blog post.
  • The only way i know to use this template is to use 'include' directive.
  • I want to call this template inside a loop going thru all the relevant blog posts.
  • Problem: I need to pass a parameter(s) to this template; in this case reference to array representing a blog post.

Code looks something like this:

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

Any ideas how to accomplish this? I'm really stumped :) Is there any other way to render a template?

3条回答
孤傲高冷的网名
2楼-- · 2019-03-09 17:25

$param should be already available inside the template. When you include() a file it should have the same scope as where it was included.

from http://php.net/manual/en/function.include.php

When a file is included, the code it contains inherits the variable scope of the line on which the include occurs. Any variables available at that line in the calling file will be available within the called file, from that point forward. However, all functions and classes defined in the included file have the global scope.

You could also do something like:

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.

Then $row would be available, but still called $row.

查看更多
小情绪 Triste *
3楼-- · 2019-03-09 17:43

Consider including a PHP file as if you were copy-pasting the code from the include into the position where the include-statement stands. This means that you inherit the current scope.

So, in your case, $param is already available in the given template.

查看更多
SAY GOODBYE
4楼-- · 2019-03-09 17:47

I use the following helper functions when I work on simple websites:

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

display will output the template to the screen directly. render will return it as a string. It makes use of ob_get_contents to return the printed output of a function.

查看更多
登录 后发表回答