【问题标题】:do-it-yourself universal header/footer.php自己动手做通用页眉/页脚.php
【发布时间】:2012-03-02 05:09:02
【问题描述】:

我想制作通用页眉/页脚包含文件。
这里的通用意味着在从“includes”目录调用“header.php”时,无需在任何更深层次添加“../”即可适用于任何目录级别的文件。

好的。
我可以使用
<?php include $_SERVER[‘DOCUMENT_ROOT’].”/includes/header.php”;?>

在任何地方都有它,但 header.php 包含对 .css 文件的相对引用,而 .css 文件包含其相对引用(例如“background: url(../images/o.gif);”和所有这一切都让我在每个新级别都陷入了“../../”的泥潭。

当然,我可以在每个级别复制 .css 和 ../图像,但这似乎有点尴尬,并且与伟大的 php 的原则和精神背道而驰(控制在一个地方)。

尊敬的` 谢尔盖 ogoltsoff

【问题讨论】:

    标签: php uri


    【解决方案1】:

    您可以将 CSS 中的 url 设为绝对路径(以 / 开头的路径)。然后,无论用户浏览您网站的哪个位置,它都会起作用。

    或者,您可以使用 URL 重写 mod_rewrite 使用户访问的 URL 保持在顶层。

    【讨论】:

    • / 开头的路径(没有服务器名称等)根据定义也是相对路径。只是为了澄清。
    • 亲爱的 Borealid,感谢您在哪里挖网的简洁说明。
    【解决方案2】:

    调用 css 图像和类似使用 ../ 而在编程上正确是错误的形式。您应该始终使用绝对路径 /css/style.css /images/image.png /js/script.js 等...

    我通常用一个常量来定义应用程序目录的页眉和页脚。

    define('APPDIR', $_SERVER['DOCUMENT_ROOT']);
    

    使包含其他文件更容易一些,而不必一遍又一遍地写出文档根目录的所有变量。

    虽然在我看来一切都在朝着框架发展,但你真的应该考虑使用 Symfony、Codeigniter 等。如果是 3 页交易,请直接使用 php,但如果您正在开发一个全面的应用程序并且它是新开发的,那么您不使用框架就会对自己造成伤害。

    【讨论】:

    • 亲爱的thenetimp,你让我觉得是时候顺应潮流并加入一些古老的框架了。谢谢。
    • @sehrguey ogoltsoff:这可以给你带来一些好处,但很少有框架这样做总是有用的。 Symfony2 有一个很好的 HTTP 请求和响应抽象,这是您在这里处理的域。
    【解决方案3】:

    您想要封装变化的内容,即请求的某个位置(从浏览器查看)到您网站的根 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;
        }
    }
    

    【讨论】:

    • 亲爱的 hakre,你令人敬畏的艺术作品(这个 sn-p)在我的头顶上。感谢您所做的一切。
    猜你喜欢
    • 2018-02-02
    • 2011-08-17
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多