2012-01-20 10 views
5

Piszę dość dużą stronę internetową, więc zdecydowałem się użyć funkcji włączania, aby ułatwić zmianę banera, menu, stopki itp.Dołącz PHP, nie działa, gdy dołączony kod php jest dla plików w różnych katalogach

Wszystko działa poprawnie, o ile plik znajduje się w tym samym katalogu plików. Z innego wpisu znalezionego na "stackoverflow" znalazłem sposób, w jaki zrobiłem ścieżkę do włączonego pliku działającego.

Problem polega na tym, że nawet jeśli rzeczywista strona internetowa może znaleźć dołączony plik, nadal nie działa, ponieważ wydaje się, że nie jest w stanie znaleźć właściwego katalogu dla rzeczywistego łącza.

Zamierzam spróbować użyć przykładowy kod, aby pokazać, co mam na myśli ... powiedzmy, że jest moim katalogu plik

  1. Niektóre strony
  2. [CSS] [artykuły] [inc ] page.php page2.php
  3. page3.php

więc jeśli chcesz połączyć page.php z page2.php link byłby <a href="page2.php"> Ale jeśli chcę połączyć page3.php z page2.php link byłby <a href="../page2.php">

I myślę, że to tutaj jest konflikt. To, że katalog plików w menu.php nie działa dla wszystkich stron.

Byłbym wdzięczny za pomoc w tej sprawie.

EDIT:

Postaram się wyjaśnić trochę lepiej o strukturze witryny. Przepraszam, jeśli jestem trochę zagmatwany (czasami trudno mi wyjaśnić, co mam na myśli, ponieważ angielski nie jest moim pierwszym językiem).

To jest przykładowy katalog plików mojej witryny.

Jedynym powodem, dla którego chcę korzystać z funkcji, jest możliwość korzystania z tych samych obrazów banerów, nawigacji po menu lub stopki na wszystkich stronach internetowych.

file hierarchy

Powiedzmy moja menu.php (w folderze inc ''), które zostaną ujęte w wszystkich stron wygląda tak

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

Gdy używam

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

(lub dowolny odpowiednio ukierunkowany plik)

wszystko pojawia się tak, jak chcę tak jest, ale problem polega na tym, że kiedy wciskam index.php lub jakikolwiek inny link do strony internetowej z innego katalogu, to nie działa.

+0

Próbowałam kilka rzeczy, o których tu wspomniano, ale myślę, że moje zrozumienie i znajomość PHP jest zbyt podstawowe, aby dokładnie wiedzieć, co robię. Dotychczasowy sposób pracy z PHP opierał się na kopiowaniu + wklejaniu + badaniu, który kod wymaga zmian, aby działał on dla mnie. Domyślam się, że najpierw muszę zdobyć więcej wiedzy o PHP, więc wszystkie inne kody, które zostały wymienione w odpowiedziach, nie będą dla mnie czarną magią. :( – Vetaxili

+0

Próbowałem już wcześniej nauczyć się PHP z tutoriali online, ale zawsze znajduję to, że jakikolwiek tutorial, którego używam, osoba pisząca to zawsze zakłada, że ​​znam pewne fragmenty kodu, i to jest, gdy moje "uczenie się" zatrzymuje, ponieważ dostaję Jestem bardzo zdezorientowany i utknąłem, doceniam inne wysiłki w udzielaniu odpowiedzi na moje pytanie i przykro mi, że nie jestem wystarczająco dobry, aby prawidłowo go wdrożyć. :( – Vetaxili

+0

Nie martw się, to nie jest rzadki problem. upvotes, które otrzymałeś, jest to bardzo dobre pytanie, ponieważ dostarczyłeś więcej szczegółów, spróbowałem odpowiedzi, która wydaje mi się, że lepiej pasuje do twoich konkretnych potrzeb, a także pokazuje, jak podświetlić bieżącą stronę za pomocą 'class = "current" '. – Herbert

Odpowiedz

4

Problem: Linki w menu są w stosunku do stron, w których menu.php jest włączone. Na przykład dodanie menu.php w art1.php powoduje, że link do contact.php wskazuje na http://yoursite.com/articles/contact.php, a nie na http://yoursite.com/contact.php.

Rozwiązanie: używać bezwzględnych adresów URL w linkach menu:

<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> 

Jednym ze sposobów, aby podświetlić bieżącej strony jest coś takiego w 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

To szybkie i brudne kodowanie, więc jeśli ktoś zauważy jakiekolwiek błędy lub potencjalne ulepszenia, uprzejmie daj mi znać. :) – Herbert

+1

Spędziłem kilka godzin (około 8 lol) oglądając tutoriale i zrobiłem więcej czytania, aby lepiej zrozumieć PHP (Uwierz mi, mój mózg zamienił się w jajecznicę). Zacząłem robić wszystko od zera. Udało mi się uruchomić linki i obrazy. W "normalnych" plikach php dodałem \t \t iw moim zawierać ścieżkę do folderu z katalogu jest: \t

  • Home Page
  • Myślę, że to, co nazywasz bezwzględny adres URL (muszę przyznać, że nie wiem, co było wcześniej (więcej badań: P)). – Vetaxili

    +0

    Mam nadzieję, że nie zacznę być bardzo irytujący (mam wiele pytań i chcę wiedzieć więcej: P). Próbowałem zbadać określone części kodu, które były tutaj używane, ale informacje były zazwyczaj bardzo ogólne, więc wciąż nie dały mi satysfakcjonującej odpowiedzi. Czy byłbyś w stanie polecić jakieś pokoje czatowe dotyczące PHP? – Vetaxili

    2

    W PHP dołączone pliki pojawią się jako część pliku, do którego są włączone. Więc jeśli masz obrazy i linki w page2.php i dołączasz page2 do page1.php, wszystkie twoje obrazy i linki będą wyglądać w stosunku do page1.php. Więc page2.php znajduje się w podfolderze i masz obrazy dla strony 2 w tym samym podfolderze, kiedy umieścisz go w page1.php twoje źródła obrazu będą błędne.

    Jednym ze sposobów jest to, aby wszystkie źródła obrazu i łącza do stron były względne względem katalogu głównego, a nie względem pliku php. Zaprojektuj swoje źródła i linki, zaczynając od folderu głównego, "/", jeśli witryna znajduje się na górze domeny lub "/ sometopfolder", jeśli witryna zaczyna się w podfolderze, a następnie stamtąd.

    +0

    +1 za wzmiankę o tym, że ścieżki w dołączonym pliku są względne w stosunku do pliku, który go zawiera.To jest jak kopiowanie kodu w dołączonym pliku i wklejanie go w pliku" rodzica "(z braku lepszego słowa) . – Herbert

    4

    Twoje pytanie zawiera kilka błędów i problemów z formatowaniem, więc może być źle odebrane. Ale musisz podać ścieżkę do dołączonych plików, w przeciwnym razie php nie będzie wiedział, gdzie szukać.

    Na przykład, jeśli masz page2.php w folderze inc i chcesz dołączyć page2.php w page3.php chcesz użyć czegoś takiego:

    include('inc/page2.php'); 
    

    jeśli chciał to PAGE3. php wewnątrz page2.php byłoby coś takiego:

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

    można również skorzystać z pełną ścieżką do pliku, to coś takiego:

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

    Mimo to zalecam utworzenie pliku konfiguracyjnego, aby ustawić podstawowy folder witryny w jednym miejscu, a następnie użyć go ponownie tam, gdzie jest to potrzebne.

    To jest całkiem podstawowe rzeczy php, więc proponuję najpierw wykonać kilka tutoriali, zanim wskoczę do tworzenia witryny podobnej do tej. Google jest twoim przyjacielem, ale tu jest początek: http://php.net/manual/en/tutorial.php

    -1

    radziłbym użyć framework lub Załóż own podstawowe MVC (ramy)

    Wtedy masz większą kontrolę nad tym, co jest ładowany, gdzie i jak

    jak napisać klas here i here

    Jeśli witryna ma być „wielki” start jak chciałem iść i program, to właściwie od samego początku ... spojrzeć na o OP i MVC - pomoże ci to na dłuższą metę.

    +0

    Dobra rada, ale tak naprawdę nie odpowiada na pytanie. – Herbert

    +0

    @Herbert nie do końca ... ale rozwiązuje problem ... oznacza to, że można wywołać dowolny plik i nie ma znaczenia, gdzie się znajduje. np. jeśli wywołał "/ page1", "/ page2" lub nawet page2/getMembers - wszystko kontrolowane przez framework. – Stevanicus

    3

    Zastosowanie początkowy plik brama php, powiedzmy, że jesteś struktura wygląda następująco:

    foldery:

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

    Więc co trzeba jest punktem wyjścia dla każdej strony jesteś powołanie:

    /index.php 
    

    W tym pliku możesz połączyć swój plik konfiguracyjny systemu, powiedzmy:

    require_once '/system/config.inc.php' 
    

    Teraz w config.inc.php ustawić stałą dla root:

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

    Teraz można wszędzie pełno sprzątaczek w linku strona zawiera z tym stałym jak następuje:

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

    teraz za swoimi podstronami można użyć dwóch różnych approches:

    Pierwszy, Praca z parametrami

    index.php?section=guestbook 
    

    W pliku index.php analizujesz parametry, dzięki czemu wiesz, który plik php musisz dołączyć.

    drugie, mod_rewrite

    Z mod_rewrite można również prowadzić każdą rozmowę stronę do index.php

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

    Tutaj ustawia klasę, powiedzmy urlworker(); który dzieli żądany uri na różne części, dzięki czemu ponownie wiesz, którą stronę musisz dołączyć.

    3

    Zastosowanie ścieżka bezwzględna

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

    Tak proste i zajęło mi wiele badań, aby zrozumieć, czym właściwie jest absolutna ścieżka, jaki jest jej użytek i jak właściwie go używać. – Vetaxili