【问题标题】:How to use PHP include to insert an HTML stub across all pages in a website如何使用 PHP 包含在网站的所有页面中插入 HTML 存根
【发布时间】:2009-11-30 06:23:27
【问题描述】:

我正在开发一个简单的网站。它将有近 20 页。它有 3 级层次结构。

Home
MenuStub
   Category1
      Page1
      Page2
   Category2
      Page1
      Page2
   ....
      ....
      ....

主导航将有 4 - 5 个项目代表每个“类别” 这对于所有页面都是恒定的。我什至不打算 突出显示当前类别或任何内容。

之前我决定将菜单 HTML 存根单独放在一个单独的文件中 并使用 PHP include 将其包含在所有页面中。

但是,相对路径可能令人沮丧。假设菜单存根 文件位于根目录。

因此,在根级页面中,php 包含将如下所示

include "menustub.html";

在二级页面中,应该说

include "../menustub.html";

在第三级页面中,应该说

include "../../menustub.html";

首先,这是包含单个文件的最佳方式吗 跨网站的所有页面?

其次,如果网站变大,还有更多的层次 添加,维护这将是一个问题。如果我突然 决定将整组页面移动一个(或多个)级别 向上或向下,我应该手动去更改相对路径 在每个文件中。

我在这里遗漏了什么吗?有没有通用的指向方法 到一个特定的文件,每个页面都会理解,不管 它位于哪里?

拥有存根并将其包含在所有页面中的最佳方式是什么 没有这些维护噩梦?

【问题讨论】:

    标签: php html include


    【解决方案1】:

    解决此问题的常用方法是使用include_path:在您的配置中,将包含此类文件的目录添加到包含路径中,您可以简单地这样做

    include "menustub.html";
    

    从任何地方。 见http://se2.php.net/manual/en/ini.core.php#ini.include-path 它可以从 php.ini 和代码中设置。不确定是否可以在 .htaccess 文件中设置

    另一种方法是设置根目录变量并始终使用它:

    include "{$rootDir}/menustub.html";
    

    还有使用自动追加/前置的选项,这意味着您告诉 php 始终追加或前置文件,请参阅http://se2.php.net/manual/en/ini.core.php (auto_prepend_file)

    $rootDir 可以从配置中设置,也可以使用 $_SERVER['DOCUMENT_ROOT'] 自动设置。如果您将其用于共享文件(在多个 Web 应用程序之间共享),前者是很好的,如果文件位于一个 webapp 目录结构下,则后者是为了方便。

    【讨论】:

    • 您也可以使用$_SERVER['DOCUMENT_ROOT'] 元素来查找您的HTTP 服务器的根目录,您可以在第二个示例中使用它来代替{$rootDir}。例如。 include($_SERVER['DOCUMENT_ROOT'] . '/menustub.html');.
    • 嗨 Brimstedt 我想了解更多关于 include_path 的信息。听起来像我追求的解决方案。是所有 php 代码(在我的网站内)都知道的全局事物吗(无论代码在哪里)。就像我定义 include_path 并在那里放置一个文件 - test.html - 我可以简单地使用 include "test.html" 而不管我包含在哪个文件中。我说对了吗?
    • atli:很好的评论,我将它添加到答案中:添加了文档链接
    • 嗨。感谢您的编辑,php 的链接包含路径。我会通过它:)
    • 阿特利。我可以使用 DOCUMENT_ROOT,但调试模式和部署之间的区别是什么?在生产服务器中,文件可能直接位于 DOCUMENT_ROOT 下,但在调试期间,在我使用的 XAMPP 中,我将为我的网站创建一个单独的文件夹。所以它将是 DOCUMENT_ROOT+一些文件夹+文件名。我必须记住每次部署时都删除那个额外的文件夹。
    【解决方案2】:

    让索引文件执行所有包含操作会更加动态,并使用 GET 参数告诉它要包含哪个页面。

    例如,考虑这样的目录结构:

    /
      index.php
      /ui
        header.html
        menu.html
        footer.html
        Cat1/
          Page1.html
          Page2.html
        Cat2/
          Page3.html
          Page4.html
    

    如果你总是调用索引文件,包括你想看到的类别和页面的名称,比如:index.php?category=Cat1&page=Page1,你可以这样做:

    <?php
    // Include a header and a menu, defined in their own HTML files.
    include('ui/header.html');
    include('ui/menu.html');
    
    // Set up a list of valid categories and their sub pages.
    $pages = array(
        'Cat1' => array(
            'Page1',
            'Page2'
        ),
        'Cat2' => array(
            'Page3',
            'Page4'
        )
    );
    
    // Find the category and page to use.
    if(isset($_GET['category'], $pages[$_GET['category']])) {
        $category = $_GET['category'];
    } else {
        $category = 'Cat1';
    }
    if(isset($_GET['page'], $pages[$category][$_GET['page']])) {
        $page = $_GET['page'];
    } else {
        $page = 'Page1';
    }
    
    // Include the selected content page.
    include("ui/{$category}/{$page}.html");
    
    // Include a footer
    include('ui/footer.html');
    ?>
    

    通过这种方式,您可以根据需要将内容扩展至尽可能多的深度,而无需在每个新文件中重复包含。

    【讨论】:

    • 嗨,阿特利。在我的其他网站之一中,我正在遵循您的方法的简化版本。但是,我没有为我当前的网站考虑它,因为我觉得有问题。也许我这样想是错的。这是最佳实践吗?就像,总是单独显示索引页面,但根据参数包含 HTML 存根?如果是这样,URL 看起来会有点奇怪,对吧?而不是像example.com/games/fps/quake3 这样好看的URL,它看起来像example.com?cat=games&subcat=fps&page=quake3。我怎样才能使用你的方法,但显示一个像第一个一样漂亮的 URL?
    • 当你开始处理更多动态的东西时——使用更复杂的设计方法——这确实成为标准方法,是的。我建议你尽量早点习惯它。 -- 关于 URL 问题。查看 URL 重写。如果您使用 Apache,则可以通过使用 mod_rewrite 模块来完成此操作。 (见http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
    • 嗨.. 感谢您确认这是推荐/标准方法。另外,感谢 mod_rewrite 模块。也会调查的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2014-05-11
    • 2017-02-18
    • 2022-12-24
    • 2019-07-17
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多