2009-07-24 10 views
7

Ok, je crée une interface d'administration pour mon blog personnalisé à l'adresse url/admin.Rendre php inclut du travail dans un sous-répertoire

Est-il possible pour moi de pouvoir utiliser les mêmes inclusions (y compris le chargement automatique), que le répertoire racine.

Si possible, je voudrais aussi pouvoir corriger automatiquement les liens dans la navigation afin qu'ils vont que index.php dans/change à ../index.php quand on accède à partir de/admin.

Merci, Nico

Répondre

18

La meilleure pratique pour cela est de définir une constante « absolute_path » qui contient le répertoire que tout est situé sous. Après cela, vous pouvez simplement copier et coller tout, car il définit le chemin 'full', qui ne change pas de répertoire en répertoire.

Exemple

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

or 

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

Puis, à tout moment, vous pouvez simplement faire ceci pour inclure un fichier

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

ah, mais comment puis-je savoir ce que ce chemin devrait être? –

+1

Vous voulez probablement jeter un oeil à PHP Info pour une variable de serveur, ou le définir vous-même. Si vous le définissez vous-même, assurez-vous que c'est le répertoire dans lequel TOUS les fichiers tombent. –

3

meilleure façon serait d'utiliser Pathes/URL absolues.

Pour les URL, définir une variable/constante quelque part, qui pointe à la racine de votre application, comme:

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

ou

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

et l'utiliser dans tous les liens, comme:

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

De cette façon, toujours OK (et le jour où vous installez votre projet sur un autre serveur, ou dans un sous-directeur y, vous n'avez qu'une constante/variable à modifier, et tout fonctionne toujours)

Pour includes/requires, utilisez toujours des chemins absolus; une solution consiste à utiliser dirname, comme ceci:

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

__FILE__ est le fichier en cours, où vous écrivez cette ligne; dirname obtient le chemin d'accès (le chemin d'accès complet) au répertoire contenant ce fichier.

Avec cela, vous n'avez jamais à vous soucier des chemins relatifs de vos fichiers.

+0

+1 pour les chemins absolus –

+0

Est-ce que les chemins abs vous ralentissent? Dites si vous ne faites pas que garder vos liens en ligne droite, mais que le flux de vos programmes est limité. – Smandoli

0

Encore une autre réponse serait similaire à la combinaison des deux premières suggestions. Vous pouvez définir la constante:

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

Ensuite, en supposant que config.php doit être inclus dans de nombreux fichiers du site, vous pouvez utiliser l'instruction suivante pour y parvenir:

include(ABSPATH.'config.php'); 

Hope this helps.

0

Une autre option que j'ai utilisée pour functions.php dans le passé est un autochargeur de 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."); 

    } 
}); 

Cela fonctionne dans certaines circonstances et m'a été utile dans le passé quand je ne veux pas définir une URL absolue de la racine $.

Questions connexes