2009-09-28 11 views
8

Ho difficoltà con i percorsi in un sistema cms che sto tentando di costruire, fondamentalmente ho una cartella con il mio header.php e footer file .php all'interno.Come utilizzare un PHP include attraverso più directory/sottodirectory con percorsi relativi

Questi sono inclusi in index.php e funzionano bene. Ma poi quando tento di usare lo stesso include in un file nella mia sottodirectory di amministrazione, le immagini e il CSS sono interrotti, ovviamente perché il percorso relativo ora è sbagliato.

Quindi la mia domanda è, come posso superare questo?

Dopo aver letto alcune delle altre domande qui e varie altre fonti, penso che i percorsi assoluti siano la via da seguire, ma ho sempre usato percorsi relativi, quindi i vari concetti di utilizzo dei file di configurazione per specificare un percorso assoluto sono mi confonde.

Di solito riesco a risolvere le cose per conto mio, ma è stata una lunga giornata e sono perplesso!

risposta

19

i Di solito hanno un file chiamato config nella mia radice di applicazione e in essa ho definire una costante per il percorso di base e pochi altri:

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

e includo miei file come

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

In questo modo posso posizionare la mia applicazione in qualsiasi directory, inoltre posso spostare i file senza molte preoccupazioni.

utilizzando anche il percorso completo rende il più veloce includono

+0

Ok, quindi definisco il percorso costante alla mia directory principale e memorizzo quel file (config.php o simile) nella mia directory root delle applicazioni. Devo quindi includere il file config.php in tutti i miei file, in questo modo posso chiamare la costante e avere a disposizione il percorso root. Posso quindi usare il percorso root per collegarmi al mio css e alle immagini, in questo modo le mie inclzioni header.php e footer.php funzioneranno in qualsiasi directory? –

2

o ...

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

+0

funziona solo se si installa l'aplicazione nel percorso radice –

+1

Vero, ma considerando che stava usando percorsi relativi per cominciare sono abbastanza sicuro che questo risponda ancora alla domanda, e con brevità non meno. – catfarm

5

Preferisco impostare le variabili di ambiente (in Apache, usando .htaccess o .conf). In questo modo puoi spostare liberamente tutti i tuoi file ovunque in webroot e avrà accesso a tali variabili.

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

Inoltre è possibile utilizzare la variabile denominata 'environ' di cui sopra frammento di .htaccess per includere un file specifico server come file di configurazione in tutti i vostri script e impostare diverse variabili lì.

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

Goditi la tua libertà!

+0

Ciao grazie SetEnv salva la mia giornata. Php CGI non è in grado di utilizzare php_value include_path nel file htaccess. impostare il percorso di php include a livello globale è impossibile dal mio googling. Quindi questo SetEnv AppPath "/ home/account /" può essere utilizzato in tutti i php include getenv ('AppPath'). 'Include/*. Php'. Questo è meglio che usare php.ini o set_include_path() o ini_set() che è difficile da mantenere. – CallMeLaNN

1

I percorsi relativi e assoluti in PHP sono un po 'fragili perché dipendono non solo dalla directory corrente del file incluso, ma anche dalla directory di lavoro corrente.

Quindi è necessaria una soluzione in due parti.

In primo luogo, è necessario un redirector. Fondamentalmente, questo è un file include che funge da punto singolo di chiamata per tutte le altre pagine. Il suo compito è quello di andare e includere il resto della vostra infrastruttura. Tutte le tue pagine chiamano questo redirector e solo questo redirector (ma puoi incatenarle).

Questo redirector ora fa

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

Questo consente di modificare l'infrastruttura di file di inclusione, o la posizione e tutto quello che dovete aggiornare è un unico file.La chiamata dirname() risolve tutti i problemi relativi e assoluti e cerca la fase successiva relativa a se stessa. E per definizione questo cambia solo quando lo cambi, quindi funzionerà sempre.

La seconda parte è un includer personalizzato in modo da poter chiamare contenuto per nome con una funzione e va e ottiene il file giusto. Seppellire questo nella directory della tua infrastruttura è dove va. Diventa quindi una scatola nera che le pagine al di fuori di quest'area chiamano senza sapere e senza bisogno di sapere come funziona o dove si trova. Ciò elimina la necessità che le costanti del percorso includano i frammenti di pagina perché hai un unico posto che fa tutto per te.

+0

woah - o la spiegazione o la soluzione richiede qualche semplificazione ... – Yarin

0

Ho riscontrato questo problema simile e ho inserito questa query in questo collegamento in SO. L'URL è: Issue with PHP include with global path.

Mentre lavoravo alle soluzioni fornite dalle persone e guardando vari thread (incluso questo - che avevo citato nella mia soluzione nella parte inferiore del mio post), ho avuto un modo! Anch'io avevo pubblicato la soluzione. Può aiutare qualcuno che sta affrontando un problema simile.

Problemi correlati