2009-09-28 26 views
8

Tengo dificultades con las rutas en un sistema cms que intento construir, básicamente tengo una carpeta con mi header.php y pie de página .php archivos dentro.Cómo usar un PHP incluye en múltiples directorios/subdirectorios con rutas relativas

Estos están incluidos en index.php y funcionan bien. Pero cuando intento utilizar el mismo incluye en un archivo dentro de mi subdirectorio de administrador, las imágenes y el CSS están rotos, obviamente porque la ruta relativa ahora es incorrecta.

Así que mi pregunta es, ¿cómo puedo superar esto?

Después de leer algunas de las otras preguntas aquí y otras fuentes, creo que las rutas absolutas son el camino a seguir, pero siempre he usado rutas relativas, por lo que los diversos conceptos de usar archivos de configuración para especificar una ruta absoluta son Me confunde.

Por lo general, logro resolver las cosas por mí mismo, pero ha sido un día largo y estoy perplejo.

Respuesta

19

i Solemos ser tener un archivo llamado config en mi raíz de la aplicación y en ella i definir una constante para la ruta de la base y algunos otros:

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

e incluyo mis archivos como

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

de esa manera puedo ubicar mi aplicación en cualquier directorio, además puedo mover archivos sin muchas preocupaciones.

también mediante ruta completa hace que el más rápido incluyen

+0

Ok, entonces defino la ruta constante a mi directorio raíz y almaceno ese archivo (config.php o similar) en mi raíz de aplicaciones rirectory. Luego tengo que incluir el archivo config.php en todos mis archivos, de esa manera puedo llamar a la constante y tener la ruta de acceso de raíz disponible para mí. Puedo usar la ruta de acceso raíz para vincular mi CSS y las imágenes, de ese modo mis inclinaciones header.php y footer.php funcionarán en cualquier directorio? –

2

o ...

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

+0

solo funciona si instala la aplicación en la ruta raíz –

+1

Cierto, pero teniendo en cuenta que estaba usando rutas relativas para empezar, estoy bastante seguro de que esto todavía responde a la pregunta, y con brevedad no menos. – catfarm

5

Prefiero configurar las variables de entorno (en Apache, utilizando .htaccess o .conf). De esta forma puede mover todos sus archivos libremente a cualquier lugar en webroot y tendrá acceso a esas variables.

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

También puede utilizar la variable llamada 'ambiental' mencionado en el fragmento anterior .htaccess para incluir un archivo específico servidor como archivo de configuración en todos los scripts y establecer diversas variables allí.

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

¡Disfrute de su libertad!

+0

Hola gracias SetEnv ahorra mi día. Php CGI no puede usar php_value include_path en el archivo htaccess. establecer php include path globally es imposible desde mi Google. Por lo tanto, este SetEnv AppPath "/ home/account /" se puede usar en todos los php include getenv ('AppPath'). 'Includes/*. Php'. Esto es mejor que usar php.ini o set_include_path() o ini_set() que es difícil de mantener. – CallMeLaNN

1

Las rutas relativas y absolutas en PHP son un poco frágiles porque dependen no solo del directorio actual del archivo incluido, sino también del directorio de trabajo actual.

Así que necesita una solución de dos partes.

En primer lugar, necesita un redirector. Básicamente, este es un archivo de inclusión que sirve como punto de llamada único para todas las demás páginas. Su trabajo es ir e incluir el resto de su infraestructura. Todas sus páginas llaman a este redirector y solo a este redirector (pero puede encadenarlas).

Este redirector hace ahora

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

Esto le permite cambiar su infraestructura de archivo de inclusión, o la ubicación y todo lo que tiene que actualizar es un archivo.La llamada dirname() resuelve todos los problemas relativos y absolutos y lo hace buscar el siguiente paso relativo a sí mismo. Y, por definición, esto solo cambia cuando lo cambias, por lo que siempre funcionará.

La segunda parte es un includer personalizado para que pueda llamar al contenido por nombre con una función y vaya y obtenga el archivo correcto. Enterrar esto en su directorio de infraestructura es donde va. Luego se convierte en una caja negra que las páginas fuera de esta área llaman sin saber y sin necesidad de saber cómo funciona o dónde está. Esto elimina la necesidad de constantes de ruta para incluir fragmentos de página porque tiene un lugar que lo hace todo por usted.

+0

woah- ya sea la explicación o la solución necesita un poco de simplificación ... – Yarin

0

He tenido este problema similar y he publicado esta consulta en este enlace en SO. La URL es: Issue with PHP include with global path.

Mientras trabajaba en las soluciones dadas por las personas y observaba varios hilos (incluido este, que había citado en mi solución en la parte inferior de mi publicación), ¡tenía algo! Yo también había publicado la solución. Puede ayudar a alguien que se enfrenta a un problema similar.

Cuestiones relacionadas