我正在开发一个简单的网站。它将有近20页。它有一个3级层次结构。
Home
MenuStub
Category1
Page1
Page2
Category2
Page1
Page2
....
....
....
主导航将有4到5个项目代表每个“类别” 对于所有页面,这将是不变的。我甚至不打算 突出显示当前类别或任何内容。
以前我决定将菜单HTML stub单独放在一个单独的文件中 并使用PHP include将其包含在所有页面中。
但是,相对路径可能令人沮丧。假设菜单存根 文件位于根目录。
因此,在根级页面中,php include会像
一样读取include "menustub.html";
在二级页面中,应该说
include "../menustub.html";
在第三级页面中,应该说
include "../../menustub.html";
首先,这是包含单个文件的最佳方式 在网站的所有页面上?
其次,如果网站变大,还有更多层次 添加,维持这将是一个问题。如果我突然 决定将一整套页面移动一个(或几个)级别 向上或向下,我应该手动去改变相对路径 在每个文件中。
我在这里遗漏了什么吗?是否有一种普遍的方式来指出 对于特定文件,每个页面都会理解,无论如何 它所在的位置?
拥有存根并将其包含在所有页面中的最佳方法是什么 没有这些维护噩梦?
答案 0 :(得分:3)
解决此问题的常用方法是使用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目录结构下。
答案 1 :(得分:1)
让索引文件执行所有包含操作会更加动态,并使用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');
?>
通过这种方式,您可以根据需要扩展内容,而无需在每个新文件中重复包含。