【问题标题】:How to pass parameters to PHP template rendered with 'include'?如何将参数传递给使用“包含”呈现的 PHP 模板?
【发布时间】:2010-11-21 16:32:18
【问题描述】:

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

任何想法如何做到这一点?我真的很难过 :) 还有其他方法可以渲染模板吗?

【问题讨论】:

    标签: php templates parameters include


    【解决方案1】:

    考虑包含一个 PHP 文件,就像您将代码从包含复制粘贴到包含语句所在的位置一样。这意味着你继承了当前的作用域

    因此,在您的情况下,$param 在给定模板中已经可用。

    【讨论】:

    • 为了增加差异性,请尝试从您的包含中返回一个值 (return 42;) 并捕获该值:$result = include 'filethatreturns42.php'; ;)
    • 还有一个问题是,如果你想调用一个在模板加载器上可见的函数,你必须在模板中再次要求它,否则会引发错误
    【解决方案2】:

    $param 应该已经在模板中可用。当你 include() 一个文件时,它的作用域应该与包含它的位置相同。

    来自http://php.net/manual/en/function.include.php

    当一个文件被包含时,它的代码 contains 继承变量范围 包含的行的 发生。任何可用的变量 调用文件中的那一行将是 在被调用文件中可用,来自 那一点向前。然而,所有 中定义的函数和类 包含的文件具有全局范围。

    你也可以这样做:

    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。

    【讨论】:

    • 非常好,谢谢!是的,我更喜欢使用哈希作为参数,以便将来可以轻松修改函数。
    • 这就是像 CodeIgniter 这样的框架的工作方式。您加载一个模板文件并将一组值传递给它,这些值将被提取并在模板中使用。
    【解决方案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);
    }
    

    display 将模板直接输出到屏幕上。 render 会将其作为字符串返回。它利用 ob_get_contents 来返回函数的打印输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多