2012-01-20 138 views
5

我已經寫了不少大型網站不能正常工作,所以我決定用包括功能,使其更容易改變的旗幟,菜單,頁腳等包括PHP,當包含PHP代碼是在不同的目錄中的文件

只要文件在同一個文件目錄中,一切都可以正常工作。從我在'stackoverflow'上找到的另一篇文章中,我發現如何爲包含文件工作的路徑。

我遇到的問題是,即使實際的網頁可以找到包含的文件,它仍然無法正常工作,因爲它似乎無法爲實際鏈接找到正確的目錄。

我要去嘗試和使用的示例代碼來說明我的意思...... 比方說,這是我的文件目錄

  1. 一些網站
  2. [CSS] [文章] [INC ] page.php文件使page2.php
  3. page3.php

所以,如果我想使page2.php鏈接page.php文件的鏈接將<a href="page2.php"> 但是,如果我想鏈接page3.php與page2.php鏈接將是<a href="../page2.php">

而我認爲這是衝突的地方。 menu.php中的文件目錄不適用於所有頁面。

我真的很感謝任何幫助。

編輯:

我會盡量解釋有關網站的結構更好一點。對不起,如果我有點困惑(我有時難以解釋我的意思,因爲英語不是我的第一語言)。

這是我的網站文件目錄的例子。

我想使用include函數的唯一原因是,我可以在所有網頁中使用相同的橫幅圖像,菜單導航或頁腳。

file hierarchy

比方說,我menu.php(在 '文件夾INC'),這將被包含在所有的頁面看起來像

<ul> 
<li><a href="index.php" class="navon">Home Page</a></li> 
<li><a href="contact.php">Contact us</a></li> 
</ul> 

當我使用

<?php include ("inc/menu.php"); ?> 

(或任何適當定向的文件)

一切都以我想要的方式出現它是,但問題是,當我按index.php或任何其他鏈接到一個網頁從不同的目錄,它不起作用。

+0

我試着這裏提到的一些東西,但我認爲我對PHP的理解和知識太基本,不知道我在做什麼。到目前爲止,我使用PHP的方式是基於複製+粘貼+研究代碼需要更改以使其適用於我。我想我首先需要做的是首先獲得更多關於PHP的知識,以便在答案中提到的所有其他代碼對我來說似乎都不是黑魔法。 :( – Vetaxili

+0

我已經嘗試從在線教程學習PHP之前,但我總是發現,無論我使用寫人的教程總是假設我知道某些代碼的一部分,而這是當我的'學習'停止,因爲我得到非常困惑,再次陷入困境,我很欣賞別人的努力,但我很抱歉,我還不夠好,不能正確地實施它:( – Vetaxili

+0

不要驚慌,這不是一個不常見的問題。因爲你提供了更多的細節,我嘗試了一個答案,我認爲_能夠更好地滿足你的特定需求,它還顯示瞭如何使用'class ='來突出顯示當前頁面, 「current」'。 – Herbert

回答

4

問題:在你的菜單中的鏈接是相對於在其中menu.php包含的頁面。例如,在art1.php中包含menu.php會使contact.php的鏈接指向http://yoursite.com/articles/contact.php而不是http://yoursite.com/contact.php

解決方案:使用在你的菜單鏈接絕對網址:突出當前頁面

<ul> 
    <li><a href="http://yoursite.com/index.php" class="navon">Home Page</a></li> 
    <li><a href="http://yoursite.com/contact.php">Contact us</a></li> 
</ul> 

一種方法是做這樣的事情在menu.php:

<?php 
// DO NOT CHANGE THESE 
$server = 'http://'.$_SERVER["SERVER_NAME"]; // domain name or localhost 
$this_page = $server . $_SERVER["PHP_SELF"]; // name of the script that 
               // includes menu.php 

/* 
* This array holds the menu items. I put in a few examples. 
* 
* The key (left side/before =>) is the URL to a page. 
* It takes the form "$server/path/to/somepage.php" 
* Make sure to include $server at the beginning. 
* 
* The value (right side/after =>) is the text that will appear in the menu. 
* 
* This is the only part you need to change to fit your site. 
* Make sure you put a comma after each item, except the last one. 
*/ 
$menuitems = array(
    "$server/index.php"     => 'Home Page', // notice the 
    "$server/home_page/page1.php"   => 'Page 1',  // comma after 
    "$server/home_page/articles/art1.php" => 'Article 1', // each item 
    "$server/contact.php"     => 'Contact Us' // except the last 
); 


// The rest just generates an unordered list in HTML 
// You do not need to change anything below. 

$doc = new DOMDocument(); 
$menu = $doc->createElement('ul'); 
$doc->appendChild($menu); 

// this creates the list of links in your menu 
foreach ($menuitems as $url=>$label) { 
    $item = $doc->createElement('li'); 
    $menu->appendChild($item); 

    $link = $doc->createElement('a',$label); 
    $link->setAttribute('href', $url); 

    // if the current page matches the current link, 
    // set class="current" on that link 
    if ($url === $this_page) 
     $link->setAttribute('class', 'current'); 

    $item->appendChild($link); 
} 

echo $doc->saveHTML($menu); 
?> 
+0

這是快速而髒的編碼,所以如果有人注意到任何錯誤或潛在的改進,請讓我知道。 :) – Herbert

+1

我花了幾個小時(約8 lol)觀看教程,爲了更好地理解PHP,我做了更多的閱讀(相信我,我的大腦變成了一個炒雞蛋)。我從頭開始做所有事情。我設法讓鏈接和圖片起作用。在'正常'的php文件中我加入\t \t <?php include($ _SERVER ['DOCUMENT_ROOT']。「/mainfolder/inc/menu.php」); ?> 在我包括目錄文件夾是路徑: \t

  • Home Page
  • 我想這就是你所謂的絕對URL(我承認我不知道它是什麼之前(更多的研究:P))。 – Vetaxili

    +0

    我希望我不會開始很煩人(我有很多問題,想知道更多:P)。我試圖研究在這裏使用的代碼的特定部分,但通常信息非常普遍,所以仍然沒有給出令人滿意的答案。你能夠推薦任何關於PHP的聊天室嗎? – Vetaxili

    2

    在PHP中,包含的文件將顯示爲它們所包含的文件的一部分。因此,如果您在page2.php中有圖像和鏈接,並將page2包含到page1.php中,那麼您的所有圖像和鏈接都將顯示爲與page1.php相關。因此,page2.php位於子文件夾中,並且當您將其包含到page1.php中時,圖像來源將會錯誤。

    解決這個問題的一個辦法是讓所有的圖片來源和網站鏈接相對於根而不是相對於php文件。因此,設計根源文件夾和鏈接,如果站點位於域頂部,則使用「/」,如果站點位於子文件夾中,則使用「/ sometopfolder」,然後從該位置開始。

    +0

    +1表示包含文件中的路徑與包含它的文件有關,就像複製包含文件中的代碼並將其粘貼到「父」文件中(因爲沒有更好的單詞) 。 – Herbert

    4

    你的問題有一些錯誤和格式問題,所以我可能會挑錯它。但你需要包含你的包含文件的路徑,否則PHP將不知道在哪裏看。

    例如,如果必須在文件夾INC和使page2.php你想在page3.php使page2.php你會使用這樣的:

    include('inc/page2.php'); 
    

    如果您希望包括第3頁。內使page2.php PHP這將是這樣的:

    include('../page3.php'); 
    

    您也可以使用完整路徑,包括文件,像這樣:

    include('/home/user/vhosts/yoursite/public_html/inc/page2.php'); 
    

    儘管我建議創建一些配置文件來將站點的基本文件夾設置在一個地方,然後在需要的地方重新使用它。

    這是非常基本的PHP的東西,所以我建議遵循一些教程,然後再跳入構建這樣的網站。谷歌是你的朋友,但這裏是一個開始:http://php.net/manual/en/tutorial.php

    -1

    我可能會建議你使用framework或創建own基本的MVC(框架)

    然後,你必須在何處以及如何

    什麼被加載更好的控制

    如何編寫類herehere

    如果您的網站將是「大」開始爲你的意思下去,並適當程序從一開始......看在澳OP和MVC - 從長遠來看它會幫助你。

    +0

    很好的建議,但並沒有真正回答這個問題。 – Herbert

    +0

    @赫伯特並不完全......但它確實解決了這個問題......這意味着任何文件都可以被調用,而且它並不重要。 例如如果他叫「/ page1」,「/ page2」或甚至page2/getMembers - 它的全部由框架控制。 – Stevanicus

    3

    使用初始網關php文件,可以說,你的結構是這樣的:

    文件夾:

    /downloads 
    /templates 
    /templates/my_design 
    /templates/my_design/css 
    /templates/my_design/js 
    /system 
    

    所以,你需要的是一個切入點,你的每一頁電話:

    /index.php 
    

    在這個文件中,你鏈接您的系統配置文件,讓說:

    require_once '/system/config.inc.php' 
    

    現在在config.inc中。PHP的您設置一個常數根:

    define('PAGE_ROOT','/home/user/vhosts/example.com/httpdocs/'); 
    

    現在你可以在你的網頁鏈接eveywhere包括這個常數如下:

    include PAGE_ROOT.'/templates/my_design/theme.php'; 
    

    現在你的子頁面,你可以使用兩種不同approches:

    首先,使用參數

    index.php?section=guestbook 
    

    在index.php文件中解析參數,以便知道必須包含哪個php文件。

    ,mod_rewrite的

    隨着mod_rewrite的,你也可以導致每個頁面調用你的index.php

    RewriteEngine On 
    RewriteRule .* index.php 
    RewriteBase/
    
    example.com/section/guestbook 
    

    在這裏你設置一個類,讓說urlworker();它將請求的uri分成不同的部分,所以你又知道你必須包含哪個站點。

    3

    使用絕對路徑

    <?php include ($_SERVER['DOCUMENT_ROOT']."/inc/menu.php"); ?> 
    
    +0

    這麼簡單,我花了很多研究來了解真正的絕對路徑是什麼,它有什麼用途以及如何正確使用它。 – Vetaxili