Как передать параметры шаблону PHP, представленному с помощью '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;
}

Любые идеи, как это сделать? Я действительно в тупике:) Есть ли другой способ визуализации шаблона?

Ответ 1

Рассмотрим в том числе PHP файл, как если бы вы копировали код из include в позицию, в которой стоит include-statement. Это означает, что вы наследуете текущую область действия.

Итак, в вашем случае $param уже доступен в данном шаблоне.

Ответ 2

Параметр

$должен быть уже доступен внутри шаблона. Когда вы включаете() файл, он должен иметь ту же область, в которой он был включен.

from 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.

Ответ 3

Я использую следующие вспомогательные функции, когда я работаю на простых веб-сайтах:

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 для возврата напечатанного вывода функции.