自己动手的通用标题/ footer.php

时间:2012-02-09 17:32:49

标签: php uri

我想制作通用页眉/页脚包含文件 这里的通用意味着适用于任何目录级别的文件,而无需在“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

3 个答案:

答案 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;
    }
}