【问题标题】:making relative path for include files为包含文件制作相对路径
【发布时间】:2014-12-21 19:40:03
【问题描述】:

我希望使用位于名为 /template 的文件夹中的页眉(包括 css、js 和图像)和页脚文件。然后,这些文件将包含在目录下的每个文件中,例如:

/template/header.php + footer.php
/home/index.php
/products/products.php
/products/hardware/types/hardware.php
/css
/js
/images

当我使用时:

include (__DIR__ . "/../template/header.php");

该文件已包含在内(尽管我需要更改每个文件并添加更多“/../”),但所有 css、js 和图像都已损坏。

这是我的头文件(位于 header.php,包含的文件之一):

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="images/favicon.ico">
<link rel="icon" type="image/gif" href="images/favicon.ico">
<link rel="stylesheet" type="text/css" href="../css/layout.css"/>
<link rel="stylesheet" type="text/css" href="../css/slider.css"/>
<link rel='stylesheet' type='text/css' href='../css/menus.css'/>
<link rel='stylesheet' type='text/css' href='../css/forms.css'/>
<link rel="stylesheet" href="css/jquery-ui.css" type="text/css" media="all"/>
<script type="text/javascript" src="../js/jquery.js"></script>
<script type="text/javascript" src="../js/jquery.elastic.source.js"></script>
<script type="text/javascript" src="../js/control.js"></script>

<title>APEC Energy - <?php echo($PageTitle);?> </title>
</head>

我现在正在尝试使用一个配置文件(这很难开始工作,但对我来说仍然不适合)。

config.php(放置在根文件夹中)(我需要在数组、文件路径或目录路径中放置更多信息吗?如果需要怎么办?):

<?php

$paths = array(
    "root" => "./",
        "controller"    => "controller",              
        "stylesheets"   => "css",
        "images"        => array(...),
        "javascript"    => array(...),

);

$projectName = "/";
function fInc($filePath){
    global $projectName;
    return '//'.$_SERVER['HTTP_HOST'].'/'.$projectName.'/'.$filePath;
}

?>

并在每个 .php 文件中调用包含文件的即时消息:

<?php
$rootDir = $_SERVER['DOCUMENT_ROOT']."/".(explode ('/', $_SERVER['PHP_SELF'])[1]);
require_once($paths['helper']['html']."template/header.php");
?>

当我使用 var_dump($paths) 时,它会打印出“NULL”

但现在只是得到一个空白屏幕?

谢谢

【问题讨论】:

    标签: php


    【解决方案1】:

    我总是在每个 php 的第一行包含一个config.php

    require_once($_SERVER['DOCUMENT_ROOT']."/".(explode ('/', $_SERVER['PHP_SELF'])[1])."/config.php");
    

    此代码应始终找到根目录,然后包含config.php 文件。 请注意,您可以将此文件放在您想要的任何位置 - 它总是会自行找到它的位置。如果您随后将该文件移动到另一个目录,则无需更改任何内容。

    这个配置文件定义了所有子目录和其他重要文件的路径,相对于根目录:

    $paths = array(
        "root" => "",
            "controller"    => "controller",              
            "stylesheets"   => "css",
            "images"        => array(
                 "icons"    => "img/icons",
                 "controls" => "img/controls"
                 ),
            "javascript"    => array(...),
            ...
    );
    

    这个数组意味着,根文件夹(你的public_html)包含目录“controller”、“stylesheets”、images”等等。图像要么放在“img/icons”或“img/controls”中.

    所有其他文件都包括在内:

    require_once($paths['helper']['html']."/form.php");
    

    这可能非常有用,因为它允许您重新构建完整的目录布局,并且您只需要更新您的 config.php。

    最后但并非最不重要的一点是,配置还包含这样的函数:

    $projectName = "YourProjectFolderName";
    function fInc($filePath){
        global $projectName;
        return '//'.$_SERVER['HTTP_HOST'].'/'.$projectName.'/'.$filePath;
    }
    

    它可用于转换将插入 HTML 文档的路径。

    编辑: 请注意,定义包含所有路径的数组只是一个建议。它在我的项目中帮助了我,因为我经常重组我的项目布局。如果你在你的项目中不这样做,你可以定义一个

    $rootDir = $_SERVER['DOCUMENT_ROOT']."/".(explode ('/', $_SERVER['PHP_SELF'])[1]);
    

    然后包含文件

    require_once($rootDir . "/home/index.php");
    

    这样,您将不再需要config.php

    【讨论】:

    • ok 看起来不错,只是需要了解一些元素。 1.在配置文件的顶部,我需要列出css或图像(等)文件吗?或按原样使用代码? 2.在require_once函数中(我认为你建议使用这个函数而不是include)我是否只是将“./form”编辑到我想要包含的文件中,以及aev“helper”和“html”原样. 3.项目文件夹名是顶层根文件夹名“public_html”?
    • 1.这取决于您的项目的大小。如果你有一个大项目,定义一个包含所有现有目录及其路径的数组,然后将其用于包含可能会很有用。 2. 是的,我推荐 require_once(); 3. 我不确定。要么是public_html,要么是.(如果是,你可以删除它)
    • 好的,非常感谢!会试一试,让你知道。
    • 对不起,您能否扩展您的答案以显示如何将文件或目录输入“图像”=> 数组?等等。第一部分是“控制器”还是“css”根目录下的文件夹名称?
    • 也无法让 rootdir 选项工作?我将这两个语句放入 更改了文件位置,但最终出现空白屏幕。在我弄清楚如何使用配置文件选项之前使用它会很好。这个声明的好处是它的普遍性,并且不需要我继续添加 /../../ 我越往下走。谢谢
    【解决方案2】:

    试试:

    <?php
    $basePath = dirname(__FILE__);
    // Or __DIR__, since PHP 5.3.0
    
    require_once($basePath . "relative/path/from/basePath"); 
    // replace the string with your real relative path
    


    编辑:

    Q1) 是的。 dirname(__FILE__) 描述了你的文件所在目录的绝对路径。

    Q2) 没有必要。如果您知道要包含的文件只是上一级或上两级,您也可以使用
    对于一个级别 - include("../filename.php");
    对于两个级别 - include("../../filename.php");
    等等..
    注意:但我还是建议使用绝对路径。


    供您参考:
    PHP: Absolute vs. relative paths

    【讨论】:

    • bast 路径是否是服务器端路径,例如。 /public_html/.还有什么包含声明会与此相关?经历了这么多。
    • 我会在每次使用包含时都输入这个语句吗?
    • 问题是,相对路径取决于文件的位置。当您将文件移动到其他位置时,您需要重写其内容以使其正常工作。
    • 这也能解决 CSS 和图像的问题吗?
    • 这包含正确的文件,并且之前已经这样做过,但它不处理刹车的css和图像链接。
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2015-11-08
    • 2019-04-21
    • 2013-04-09
    • 2012-04-08
    • 2014-11-15
    相关资源
    最近更新 更多