2009-09-28 11 views
8

Mam trudności ze ścieżkami w systemie cms, który próbuję zbudować, Zasadniczo mam folder z moim header.php i stopką Pliki .php wewnątrz.Sposób korzystania z PHP obejmuje wiele katalogów/podkatalogów ze względnymi ścieżkami

Są one zawarte w index.php i działają poprawnie. Ale kiedy spróbuję użyć tego samego w pliku w moim podkatalogu administracyjnym, obrazy i CSS są zepsute, oczywiście dlatego, że względna ścieżka jest teraz błędna.

Moje pytanie brzmi: jak mogę to pokonać?

Po przeczytaniu kilku innych pytań tutaj i różnych innych źródeł, myślę, że absolutne ścieżki są drogą naprzód, ale zawsze używałem ścieżek względnych, więc różne koncepcje użycia plików konfiguracyjnych do określenia bezwzględnej ścieżki są myląc mnie.

Zwykle udaje mi się załatwić sprawy, ale to był długi dzień i jestem zdziwiony!

Odpowiedz

19

i przeważnie mają plik o nazwie config w moim głównym aplikacji i mnie to określić stałą dla ścieżki bazowej i kilku innych:

define('APP_BASE_PATH', dirname(__FILE__)); 
define('APP_FUNCTIONS_PATH', APP_BASE_PATH . '/functions'); 

i I obejmują moich plików jak

include (APP_BASE_PATH . 'includes/another_file.php'); 
include (APP_FUNCTIONS_PATH . '/function_file.php'); 

w ten sposób mogę umieścić moją aplikację w dowolnym katalogu, a także mogę przenosić pliki bez obawy.

również przy użyciu pełnej ścieżki sprawia, że ​​to szybciej

+0

Ok, więc definiuję stałą ścieżkę do mojego katalogu głównego i przechowuję ten plik (config.php lub podobny) w katalogu głównym moich aplikacji. Następnie muszę dołączyć plik config.php do wszystkich moich plików, w ten sposób mogę wywołać stałą i mieć dostęp do ścieżki głównej. Mogę następnie użyć ścieżki głównej do linku do moich css i obrazów, w ten sposób moje wpisy header.php i footer.php będą działały w dowolnym katalogu? –

2

lub ...

include ($ _ SERVER [ 'DOCUMENT_ROOT'] '/ includes/header.php'.);

+0

działa tylko wtedy, gdy zainstalujesz aplikację na ścieżce głównej –

+1

Prawda, ale biorąc pod uwagę, że zaczynał od względnych ścieżek, jestem prawie pewien, że to nadal odpowiada na pytanie, a także z nie mniejszą zwięzłością. – catfarm

5

Wolę ustawiać zmienne środowiskowe (w Apache, używając .htaccess lub .conf). W ten sposób możesz dowolnie przenosić wszystkie pliki w katalogu webroot i będzie miał dostęp do tych zmiennych.

SetEnv lib /library/folder/ 
SetEnv public /my/web/root/ 
SetEnv environ DEVELOPMENT 

Ponadto można użyć zmiennej o nazwie „environ” wymienione w powyższym fragmencie .htaccess aby dołączyć plik określonego serwera jako plik konfiguracyjny we wszystkich skryptach i ustawić różne zmienne tam.

require_once getenv('lib')."Configs/Config_".getenv('environ').".php"; 

Ciesz się swoją wolnością!

+0

Cześć dzięki SetEnv zaoszczędź mój dzień. PHP CGI nie może użyć wartości php_inna include_path w pliku htaccess. ustawienie php to ścieżka globalna jest niemożliwe z mojego googling. Tak więc ta opcja SetEnv AppPath "/ home/account /" może być używana we wszystkich php: getenv ("AppPath"). "Zawiera/*. Php". Jest to lepsze niż użycie php.ini lub set_include_path() lub ini_set(), które są trudne do utrzymania. – CallMeLaNN

1

Ścieżki względne i bezwzględne w PHP są nieco kruche, ponieważ zależą nie tylko od bieżącego katalogu pliku włączającego, ale także od bieżącego katalogu roboczego.

Potrzebujesz dwuczęściowego rozwiązania.

Po pierwsze potrzebujesz readresatora. Zasadniczo jest to plik włączający, który służy jako jednopunktowe wezwanie dla wszystkich innych stron. Jego zadaniem jest objęcie reszty infrastruktury. Wszystkie twoje strony nazywają to przekierowanie i tylko ten przekierowujący (ale możesz je połączyć).

Ten redirector teraz robi

include_once dirname(__FILE__).'/include/include.php'; 

ta pozwala zmienić swoją infrastrukturę include pliku lub lokalizację i wszystko trzeba aktualizować to jeden plik.Wywołanie dirname() rozwiązuje wszystkie problemy względne i bezwzględne i szuka następnego kroku względem siebie. Z definicji zmienia się to tylko po zmianie, więc zawsze będzie działać.

Druga część to niestandardowy includer, dzięki któremu możesz wywoływać zawartość według nazwy za pomocą funkcji, która przechodzi do właściwego pliku. Pogrzebanie tego w twoim katalogu infrastruktury jest tam, gdzie jest. Staje się wtedy czarną skrzynką, której strony poza tym obszarem dzwonią bez wiedzy i bez potrzeby dowiedzenia się, jak to działa i gdzie jest. To eliminuje potrzebę stosowania stałych ścieżek do fragmentów stron, ponieważ masz jedno miejsce, robiąc to za Ciebie.

+0

Woah - wyjaśnienie lub rozwiązanie wymaga uproszczenia ... – Yarin

0

Miałem ten podobny problem i opublikowałem to zapytanie w tym łączu w SO. Adres URL to: Issue with PHP include with global path.

Podczas pracy nad rozwiązaniami podanymi przez ludzi i oglądaniem różnych wątków (w tym tego, który zacytowałem w moim rozwiązaniu w dolnej części mojego wpisu), miałem sposób! Również napisałem rozwiązanie. Może to pomóc komuś, kto boryka się z podobnym problemem.

Powiązane problemy