将多个HTML文件合并为一个并返回输出

时间:2011-10-14 23:09:51

标签: php templates

我正在尝试找到将多个html文件合并为一个html文件的最简洁方法。这样我就可以轻松更改部分HTML或仅在某些页面上显示它们。文件列表如下:

  1. page.tpl(页眉,页脚,头部信息)
  2. sidebar.tpl(包含侧边栏和侧边栏)
  3. nav.tpl(包含嵌套UL中的导航链接)
  4. page.tpl文件如下所示:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Page Title</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="author" content="Brandon" />
        <meta name="robots" content="noindex,nofollow" />
        <meta name="keywords" content="" />
        <meta name="description" content="" />
        <?php print $stylesheets; ?>
        <?php print $scripts; ?>
    </head>
    <body>
    <section id="wrapper">
    <header>Header Title</header>
    <nav><?print $nav; ?></nav>
    <section><?php print $content; ?></section>
    <aside> <?php print $sidebar; ?><aside>
    <footer>&copy; 2011 Brandon License: GPLv2</footer>
    </section>
    </body>
    </html>
    

    我必须包括一切的主要功能是:

    function theme($tpl, $vars = array()) {
        extract($vars);
        ob_start();
    
        require($tpl);
        $template = ob_get_contents();
    
        ob_end_clean();
    
        return $template;
    }
    

    $ tpl设置为page.tpl文件。

    我在主题函数上方尝试$vars['nav'] = file_get_contents('nav.tpl');只是为了给它一些数据。如果我删除$ tpl变量和require()函数,我会看到UL导航列表,但是当我将page.tpl文件重新添加回来时,我收到此错误:

    Warning: extract() expects parameter 1 to be array, null given
    

    这有效(显示UL导航列表):

    $vars['nav'] = file_get_contents('nav.tpl');
    function theme($vars = array()) {
        extract($vars);
        ob_start();
    
        $template = ob_get_contents();
    
        ob_end_clean();
    
        return $template;
    }
    

    这不是:

    $vars['nav'] = file_get_contents('nav.html');
    theme('page.html', $vars) //page.html is set to correct directory.
    function theme($tpl, $vars = array()) {
        extract($vars);
        ob_start();
    
        require($tpl);
        $template = ob_get_contents();
    
        ob_end_clean();
    
        return $template;
    }
    

    任何有关让它正常工作的帮助将不胜感激。

    UPDATE :这是我当前的index.php文件:

        <?php
    
        define('ROOT_DIR', getcwd());
    
        require_once(ROOT_DIR . '/core/includes/boot.inc');
    
        boot_start(BOOT_FULL); 
    
    // Based off of Drupal's drupal_bootstrap(). Set's ini_set's, database 
    //and starts sessions. This works just fine and I haven't coded any 
    //theme/template code into it. The only thing boot_start() does for theme is 
    //load the .inc file that has the theme() function. The .inc gets included
    // otherwise I would have gotten a "call to unknown function" error.
    
        $vars['nav'] = file_get_contents(ROOT_DIR . '/core/templates/nav.tpl');
        theme('./core/templates/page.tpl', $vars);
    

    我不太明白为什么我从extract()收到错误。当我添加$vars['nav']而不包括'include($ tpl)'时,提取工作正常。直到我尝试包含page.tpl文件。

    应该在每个输出任何内容的页面请求上加载page.tpl文件。所以我认为我只需要主题($ vars)而不是主题($ tpl,$ vars = array())

    有没有办法可以包含page.tpl而不将其传递给theme(),同时传递$ vars以便$ vars ['nav']覆盖page.tpl中的<?php print $nav; ?>标记?感谢。

    已解决:伙计,我不敢相信我花了很长时间才解决这个问题。由于theme()返回并且没有回显数据,我不得不分配$theme = theme('page.tpl', $vars);然后echo $theme;除了一些PHP通知,它还可以。

1 个答案:

答案 0 :(得分:0)

我个人只想为各个部分制作一个文件。然后包括它们。

<?php include('relative/link.php'); ?>

如果你想编辑一个部分中的内容,我会使用变量 的header.php

echo $foo;

的index.php

$foo='bar';
include('header.php');

当我们包含一个文件时,它会抓取内容并将其注入当前文件中,然后进行处理。