2009-07-24 21 views
7

Ok, estoy creando una interfaz de administrador para mi blog personalizado en url/admin.Hacer que php incluya trabajo en un subdirectorio

Es posible para mí poder utilizar los mismos includes (incluida la carga automática), como el directorio raíz.

Si es posible, también me gustaría poder corregir automáticamente los enlaces en la navegación para que cambien a index.php en/cambios a ../index.php cuando se accede desde/admin.

Gracias, Nico

Respuesta

18

La mejor práctica para esto es definir una constante 'absolute_path' que contiene el directorio que todo se encuentra debajo. Después de eso, puede simplemente copiar y pegar todo, porque está definiendo la ruta 'completa', que no cambia de un directorio a otro.

Ejemplo

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

or 

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

A continuación, en cualquier momento usted puede simplemente hacer esto para incluir un archivo

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

ah, pero ¿cómo puedo saber cuál debería ser esta ruta? –

+1

Probablemente quiera echar un vistazo a PHP Info para una variable de servidor, o definirlo usted mismo. Si lo defines tú mismo, asegúrate de que sea el directorio al que pertenecen TODOS los archivos. –

3

La manera más fácil sería utilizar Pathes absolutos/URL.

Para las direcciones URL, definir una constante/variable de alguna parte, que apunta a la raíz de su aplicación, como:

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

o

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

y utilizarlo en todos los eslabones, como:

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

De esta manera, siempre está bien (y el día que instala su proyecto en otro servidor, o en un subdirectorio y, usted solo tiene una constante/variable para modificar, y todo sigue funcionando)

Para incluye/requiere, siempre use pathes absolutos también; Una solución es utilizar dirname, así:

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

__FILE__ es la imagen actual, en el que está escribiendo esta línea; dirname obtiene la ruta (la ruta completa) al directorio que contiene ese archivo.

Con eso, nunca tendrá que preocuparse por las rutas relativas de sus archivos.

+0

+1 para rutas absolutas –

+0

¿Las rutas de abs disminuyen la velocidad? Di si no solo mantienes tus enlaces rectos, sino más abajo en el flujo del programa. – Smandoli

0

Sin embargo, otra respuesta sería similar a la combinación de las dos primeras sugerencias. Se podría definir la constante:

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

Entonces, suponiendo que config.php necesidades que se incluirán en muchos archivos del sitio, puede utilizar la siguiente instrucción para lograr esto:

include(ABSPATH.'config.php'); 

Espero que esto ayude.

0

Otra opción que he usado para functions.php en el pasado es un autocargador de clase.

//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."); 

    } 
}); 

Esto funciona bajo ciertas circunstancias y ha sido de gran ayuda para mí en el pasado, cuando no quiero definir una URL raíz $ absoluta.

Cuestiones relacionadas