我想制作通用页眉/页脚包含文件
这里的通用意味着适用于任何目录级别的文件,而无需在“includes”目录中调用“header.php”时在任何更深层次添加“../”。
好的。
我可以用
<?php include $_SERVER[‘DOCUMENT_ROOT’].”/includes/header.php”;?>
将它放在任何地方,但header.php包含对.css文件的相对引用,而.css文件包含其相对引用(例如“background:url(../ images / o.gif);”和在每一个新的层面上,所有这些让我陷入了“../../”的泥潭。
当然,我可以在每个级别复制.css和../images但它看起来有点尴尬,与伟大的php的原理和精神相反(在一个地方控制所有)。
尊敬你的 sehrguey ogoltsoff
答案 0 :(得分:3)
您可以让CSS中的url
成为绝对路径(以/
开头)。然后,无论用户浏览过您网站的哪个位置,它都能正常运行。
或者,您可以使用网址重写mod_rewrite
使用户访问的网址保持在最高级别。
答案 1 :(得分:1)
以编程方式正确调用css图像和此类用途../是不好的形式。你应该总是使用绝对路径/css/style.css /images/image.png /js/script.js等...
我通常使用页眉和页脚的常量定义应用程序目录。
define('APPDIR', $_SERVER['DOCUMENT_ROOT']);
使包含其他文件更容易,而不必一遍又一遍地写出doc root的所有变量。
虽然在我看来一切都在向框架发展,但你应该考虑唱Symfony,Codeigniter等。如果这是一个3页的交易,直接用PHP做,但如果你正在做一个全面的应用程序,这是新的开发,你自己是一个不利用框架的伤害。
答案 2 :(得分:1)
您想要封装变化的内容,即请求的某个位置(从浏览器查看)到您网站的根URL(再次从浏览器中查看)的相对路径。
为此你首先需要知道根URL和请求的URL,在PHP中这可能是这样的:
$rootURL = 'http://example.com/mysite/basedir/';
$requestURI = $_SERVER['REQUEST_URI']; # e.g. /mysite/basedir/subdir/index.php
然后,PHP提供了各种字符串函数来将其转换为相对路径:
'../' + X
例如,您可以将其放入执行此操作的类中:
$relative = new RelativeRoot($rootURL, $requestURI);
echo $relative; # ../
echo $relative->getRelative('style/default.css'); # ../style/default.css
这样一个类的一个例子是:
/**
* Relative Path to Root based on root URL and request URI
*
* @author hakre
*/
class RelativeRoot
{
/**
* @var string
*/
private $relative;
/**
* @param string $rootURL
* @param string $requestURI
*/
public function __construct($rootURL, $requestURI)
{
$this->relative = $this->calculateRelative($rootURL, $requestURI);
}
/**
* @param string $link (optional) from root
* @return string
*/
public function getRelative($link = '')
{
return $this->relative . $link;
}
public function __toString()
{
return $this->relative;
}
/**
* calculate the relative URL path
*
* @param string $rootURL
* @param string $requestURI
*/
private function calculateRelative($rootURL, $requestURI)
{
$rootPath = parse_url($rootURL, PHP_URL_PATH);
$requestPath = parse_url($requestURI, PHP_URL_PATH);
if ($rootPath === substr($requestPath, 0, $rootPathLen = strlen($rootPath)))
{
$requestRelativePath = substr($requestPath, $rootPathLen);
$level = substr_count($requestRelativePath, '/');
$relative = str_repeat('../', $level);
# save the output some bytes if applicable
if (strlen($relative) > strlen($rootPath))
{
$relative = $rootPath;
}
}
else
{
$relative = $rootPath;
}
return $relative;
}
}