2009-07-24 19 views
7

Ok, sto creando un'interfaccia di amministrazione per il mio blog personalizzato su url/admin.Fare php include lavorare in una sottodirectory

È possibile che io sia in grado di utilizzare gli stessi inclusi (incluso autoload) come directory principale.

Se possibile, vorrei anche essere in grado di correggere automaticamente i collegamenti nella navigazione in modo che facciano quel index.php in/cambia in ../index.php quando si accede da/admin.

Grazie, Nico

risposta

18

La pratica migliore per questo è di definire una costante 'ABSOLUTE_PATH' che contiene la directory che tutto si trova sotto. Dopodiché, puoi semplicemente copiare e incollare tutto, perché sta definendo il percorso "completo", che non cambia da una directory all'altra.

Esempio

define("ABS_PATH", $_SERVER['DOCUMENT_ROOT']); 

or 

define("ABS_PATH", dirname(__FILE__)); 
// This defines the path as the directory the file is in. 

Poi in qualsiasi punto si può semplicemente fare questo per includere un file

include(ABS_PATH . "/path/to/file"); 
+0

ah, ma come faccio a sapere che cosa dovrebbe essere questo percorso? –

+1

Probabilmente vorrai dare un'occhiata a PHP Info per una variabile del server, o definirla tu stesso. Se lo definisci tu stesso, assicurati che sia la directory in cui rientrano TUTTI i file. –

3

Il modo più semplice sarebbe quella di utilizzare assoluti sentieri/URL.

Per gli URL, definire una costante/variabile da qualche parte, che punta alla radice della vostra applicazione, come:

define('ROOT_URL', 'http://www.example.com'); 

o

$root_url = 'http://www.example.com'; 

e utilizzarlo in ogni link, come:

<a href="{$root_url}/my-page.php">blah</a> 

in questo modo, sempre OK (e il giorno si installa il progetto su un altro server, o in un vicedirettore y, hai solo una costante/variabile da modificare, e tutto funziona ancora)

Per include/richiede, utilizzare sempre anche percorsi assoluti; una soluzione è quella di utilizzare dirname, in questo modo:

include dirname(__FILE__) . '/my_file.php'; 
include dirname(__FILE__) . '/../my-other-file.php'; 

__FILE__ è il file corrente, in cui si sta scrivendo questa linea; dirname ottiene il percorso (il percorso completo) nella directory che contiene quel file.

Con ciò, non devi mai preoccuparti dei relativi percorsi dei tuoi file.

+0

+1 per i percorsi assoluti –

+0

I percorsi abs rallentano? Dì se non stai mantenendo i tuoi collegamenti dritti, ma giù nel flusso del programma. – Smandoli

0

Un'altra risposta sarebbe simile alla combinazione dei primi due suggerimenti. Si potrebbe definire la costante:

define('ABSPATH', dirname(__FILE__).'/'); 

Poi, partendo dal presupposto che config.php deve essere incluso in molti file del sito quindi è possibile utilizzare la seguente istruzione per raggiungere questo obiettivo:

include(ABSPATH.'config.php'); 

Spero che questo aiuti.

0

Un'altra opzione che ho usato per functions.php in passato è un autoloader di classe.

//Class Autoloader 
spl_autoload_register(function ($className) { 

    $className = strtolower($className); 
    $path = "includes/{$className}.php"; 

    if (file_exists($path)) { 

     require_once($path); 

    } else { 

     die("The file {$className}.php could not be found."); 

    } 
}); 

Questo funziona in determinate circostanze ed è stato utile per me in passato, quando io non voglio definire un URL $ radice assoluta.