Как передать параметры в шаблон PHP, отображаемый с помощью «include»? - PullRequest
12 голосов
/ 21 августа 2009

нужна ваша помощь с шаблонами 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 ]

31 голосов
/ 21 августа 2009

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

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

19 голосов
/ 21 августа 2009

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

1 голос
/ 14 декабря 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...