Reflexionemos ahora sobre c�mo podr�amos mejorar nuestro c�digo. La primera cosa que podemos hacer es a�adir el filtro para que no aparezcan, por ejemplo, directorios tales como cgi-bin. Adem�s, no todos los ficheros deber�an ser visibles para todo el mundo: queremos mostrar �nicamente los scripts PHP y las p�ginas HTML. Para esto haremos uso de tres arrays, en los cuales almacenaremos valores que servir�n para realizar el filtro: el primero contendr� los directorios que no deseamos mostrar, el siguiente los ficheros, y el �ltimo las extensiones de los ficheros que podr�n ser visualizados. Adem�s, ser�a �til crear una funci�n que devuelva la extensi�n del archivo que se le suministre como par�metro.
function get_extension($name) { $array = explode(".", $name); $retval = strtolower(array_pop($array)); return $retval; }
Puede ser que este m�todo no sea el m�s eficaz, pero funciona : la cadena $name es dividida en los elementos de un array utilizando . como separador; el �ltimo elemento del array es devuelto. Desgraciadamente, este truco no funcionar� en el caso de extensiones que contengan un punto en el nombre, por ejemplo .tar.gz. Si queremos que estos ficheros tambi�n sean mostrados, tenemos que hacer uso del c�digo presentado en el Listado 7.
function get_extension($name) { $array = explode(".", $name); array_shift($array); $retval = strtolower(join(".", $array)); return $retval; }
Utilizando esta funci�n podremos tomar en cuenta ficheros con la extensi�n .tar.gz. Sin embargo, ya no podremos trabajar con ficheros cuyos nombres contienen un punto. La soluci�n a este problema consiste en hacer una prueba de correcci�n para cada extensi�n encontrada. Este m�todo puede ser m�s lento y dif�cil que los descritos anteriormente, en particular para los ficheros que contienen varias extensiones.
La funci�n strtolower() devuelve en letras min�sculas la cadena alfanum�rica suministrada como par�metro. Es muy importante hacer esto, sobre todo para las extensiones de tipo .PHP, que en otro caso podr�an ser ignoradas.
Cuando ya los arrays y las funciones est�n listas, har� falta modificar dos l�neas en el bucle que escanea el directorio actual (Listado 8).
... if(is_dir($file) && $file != "." && $file != ".." && !in_array($file, $excludedir)) ... elseif(is_file($file) && $file != basename($PHP_SELF) && array_key_exists(get_extension($file),$display) && !in_array($file, $excludefile)) ...
Si alguna vez llegan a cambiar los requerimientos de filtrado, ser� sencillo adaptar el script a las nuevas condiciones agregando o borrando los elementos de los arrays. Hay que tener en cuenta solamente que la declaraci�n del array fuera de la funci�n (como es necesario en este caso) implica que las variables deben ser tambi�n declaradas como �globales�.
N�tese que, si bien los ficheros y los directorios excluidos son guardados como valores en sus arrays, las extensiones de los ficheros a mostrar son, en cambio, almacenadas como claves. Es as� porque, en el array de extensiones, podemos poner como valores los nombres de los archivos gr�ficos (iconos) que utilizaremos para visualizar el tipo de cada fichero. De esta manera todo lo que concierne a los tipos de ficheros es declarado y almacenado en un solo lugar.
El script creado a partir de los elementos mencionados hasta ahora debe funcionar correctamente en el directorio principal del servidor, pero todav�a tenemos que atar algunos cabos sueltos para poder generar los enlaces a los ficheros (los cuales nos ser�n necesarios m�s tarde, para facilitar un poco m�s el uso del mapa). Por ejemplo, debemos almacenar en alguna parte los nombres de los directorios inicial y principal del servidor. Lo haremos de la manera presentada en el Listado 9.
... if(is_dir($file) && $file != "." && $file != ".." && !in_array($file, $excludedir)) ... elseif(is_file($file) && $file != basename($PHP_SELF) && array_key_exists(get_extension($file),$display) && !in_array($file, $excludefile)) ...
�Qu� es lo que est� sucediendo aqu�? $REQUEST_URI contiene la ruta relativa al fichero utilizado con respecto al directorio principal (root) del servidor (las siguientes l�neas eliminan el nombre del fichero de esta ruta). Esto puede parecer innecesario si queremos solamente mostrar el directorio del script y sus posibles subdirectorios, pero si lo que nos interesa es el contenido entero del servidor, y el script ha sido puesto en un lugar determinado (por razones de seguridad, por ejemplo), esta posibilidad puede eventualmente resultar muy �til. Si adem�s agregamos las siguientes l�neas:
$root = str_replace($prefix, "", $root); $prefix = "";
la ruta relativa al directorio principal del servidor web ser� eliminada de la ruta actual. $root puede ser utilizado para invocar la funci�n que presenta el contenido de los directorios y permite ver todo el contenido del servidor. Sin embargo, antes de hacerlo siempre es mejor asegurarse si esto est� permitido en nuestro sistema.