Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Crear un menu en PHP a partir de un directorio

Estas en el tema de Crear un menu en PHP a partir de un directorio en el foro de PHP en Foros del Web. Hola, necesito ayuda con la creacion de un menu a partir de un directorio. Mis articulos estan dentro de un Folder q se llama Articulos, ...
  #1 (permalink)  
Antiguo 08/04/2013, 07:48
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Pregunta Crear un menu en PHP a partir de un directorio

Hola, necesito ayuda con la creacion de un menu a partir de un directorio.
Mis articulos estan dentro de un Folder q se llama Articulos, dentro de el se encuentran varios archivos PDF, q en su membrete contienen el año de publicacion y el numero de articulo, ejemplo:
Articulo_2013_1.pdf
Articulo_2013_2.pdf
Articulo_2014_1.pdf
Articulo_2014_2.pdf
Articulo_2015_1.pdf
Articulo_2015_2.pdf

Y lo q quiero conseguir es un menu desplegable con CSS no tan complejo como este ejemplo:

Por favor escoja su articulo -> 2013 -> Articulo # 1
Articulo # 2

Alguien tiene una idea de como podria hacerlo?
  #2 (permalink)  
Antiguo 08/04/2013, 11:35
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Crear un menu en PHP a partir de un directorio

Puedes leer fácilmente el listado de .pdf usando glob().
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 08/04/2013, 12:29
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por Triby Ver Mensaje
Puedes leer fácilmente el listado de .pdf usando [URL="http://www.php.net/glob"]glob()[/URL].
Lo hice, pero ahora cada hijo crea un nueva rama Padre para representarse.
Osea Me explico, en vez de salir:
Año 2013 -> Articulo 1,2 y 3
Obtengo este resultado
Año 2013 -> 1 , Año 2013 -> 2, Año 2013 -> 3

Aqui un ejemplo de mi codigo:

Código PHP:
$counter 0// Set counter to 0
    
foreach (glob("/usr/apps/webdata/backend/assets/newsletters/temp/*.pdf") as $pathToYear) { // Grab files from the newsletter folder and save them to variable
        
$th_filename basename($pathToYear); // Strip the newsletter filename from the path
        
$filename str_replace('newsletter_'''$th_filename); // Strip newsletter_ from the filename and save it to a different variable
        
$pathToFull '/usr/apps/webdata/backend/assets/newsletters/temp/' $filename// Rebuild the path to the full-size image
        
        //Function to  get Year & Issue# Values
        
$string $filename;                
                    if(
preg_match_all("#(\d{1,})#"$string$matchesPREG_SET_ORDER)) 
                    {
                            foreach(
$matches as $match
                              {
                                  
                            
$issue $match[0];
                            
                                while (list(
$key$value) = each($match)) 
                                {
                                
//YEAR
                                    
if (strlen ($value) == 4)
                                    {
                                    
$uyear $value;                                    
                                    }
                                
// ISSUE#
                                    
elseif (strlen ($value) == 1)
                                    {
                                    
$uissue $value;
                                    }
                                 }            
                           }
                     }    
        
//
        
echo '<div id=cssmenu>';
        echo 
'<ul>';
        echo 
'   <li class=has-sub last><a href=#><span>Please Select a Year:</span></a>';
        echo 
'      <ul>';
        echo 
"<li class='has-sub'><a href='#'><span>".$uyear." </span></a>";
        echo 
'            <ul>';
        echo 
"<li class=last><a href=# onclick=myPDF('".$filename."')> Issue# ".$uissue."</a></li>";
        echo 
'            </ul>';
        echo 
'         </li>';
        echo 
'      </ul>';
        echo 
'   </li>';
        echo 
'</ul>';
        echo 
'</div>';
        
        
        
$counter++; // Increment counter by 1 until no file exists
    

  #4 (permalink)  
Antiguo 08/04/2013, 12:41
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 20 años, 4 meses
Puntos: 56
Respuesta: Crear un menu en PHP a partir de un directorio

Holas, cyberjas2001.

El detalle en tu código es que has colocado toda la estructura de tu árbol dentro del ciclo: por eso es que, por cada iteración del ciclo, te vuelve a imprimir la cabecera.

Si estás generando "carpetas" a partir del nombre de los archivos, entonces debieras crear, por cada iteración, un indicador que te señale si ha habido cambio de año, entonces imprimir la parte HTML de la carpeta; si el año del archivo actual es igual al archivo anterior, no imprimes la carpeta. Algo así.

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #5 (permalink)  
Antiguo 08/04/2013, 12:47
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por quinqui Ver Mensaje
Holas, cyberjas2001.

El detalle en tu código es que has colocado toda la estructura de tu árbol dentro del ciclo: por eso es que, por cada iteración del ciclo, te vuelve a imprimir la cabecera.

Si estás generando "carpetas" a partir del nombre de los archivos, entonces debieras crear, por cada iteración, un indicador que te señale si ha habido cambio de año, entonces imprimir la parte HTML de la carpeta; si el año del archivo actual es igual al archivo anterior, no imprimes la carpeta. Algo así.

Saludos!
Hola Quinqui y gracias por respoder,
Y como seria la mejor manera de resolver eso? xq trate de hacer un IF anidado q no me ha dado resultado, me podrias ayudar con un ejemplo al menos? Gracias!
  #6 (permalink)  
Antiguo 08/04/2013, 13:11
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Crear un menu en PHP a partir de un directorio

Podría ser más fácil crear un arreglo del tipo:

Código PHP:
Ver original
  1. $menu = array(
  2.        2012 => array('pdf1', 'pdf2', 'etc'),
  3.        2013 => array('pdf1', 'pdf2', 'etc'),
  4. );

Más o menos así:
Código PHP:
Ver original
  1. $menu = array();
  2. $files = glob(/* filtro */);
  3. foreach($files as $pathToYear) {
  4.     // Obtienes nombre del archivo, supongamos $file
  5.     // Y año, supongamos $year, ya sea con substr() o alguna expresión regular
  6.  
  7.     // Si no existe el año en $menu, lo creas como array
  8.     if(!isset($menu[$year])) {
  9.         $menu[$year] = array();
  10.     }
  11.     // Agregas el archivo
  12.     $menu[$year][] = $file;
  13. }

Al final recorres ese arreglo para crear el menú.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 08/04/2013, 13:14
Avatar de quinqui  
Fecha de Ingreso: agosto-2004
Ubicación: Chile!
Mensajes: 776
Antigüedad: 20 años, 4 meses
Puntos: 56
Respuesta: Crear un menu en PHP a partir de un directorio

La solución que te da Triby te sirve para lo que me preguntas: de hecho, aunque hace que hagas 2 ciclos en vez de uno, el hecho de separar los procesos, hace que sea más entendible y amigable la impresión del árbol.

Saludos!
__________________
pipus.... vieeeeeji plomius!!!
*quinqui site*
  #8 (permalink)  
Antiguo 08/04/2013, 13:19
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por Triby Ver Mensaje
Podría ser más fácil crear un arreglo del tipo:

Código PHP:
Ver original
  1. $menu = array(
  2.        2012 => array('pdf1', 'pdf2', 'etc'),
  3.        2013 => array('pdf1', 'pdf2', 'etc'),
  4. );

Más o menos así:
Código PHP:
Ver original
  1. $menu = array();
  2. $files = glob(/* filtro */);
  3. foreach($files as $pathToYear) {
  4.     // Obtienes nombre del archivo, supongamos $file
  5.     // Y año, supongamos $year, ya sea con substr() o alguna expresión regular
  6.  
  7.     // Si no existe el año en $menu, lo creas como array
  8.     if(!isset($menu[$year])) {
  9.         $menu[$year] = array();
  10.     }
  11.     // Agregas el archivo
  12.     $menu[$year][] = $file;
  13. }

Al final recorres ese arreglo para crear el menú.
Hola Triby y gracias por tu respuesta, puse tu recomendacion en mi codigo pero solo me imprime el ultimo archivo? tal vez lo estoy ubicando mal? Me ayudas?
Código PHP:
$menu = array();
 
$counter 0// Set counter to 0
    
foreach (glob("/usr/apps/webdata/backend/assets/newsletters/temp/*.pdf") as $pathToYear) { // Grab files from the newsletter folder and save them to variable
        
$th_filename basename($pathToYear); // Strip the newsletter filename from the path
        
$filename str_replace('newsletter_'''$th_filename); // Strip newsletter_ from the filename and save it to a different variable
        
$pathToFull '/usr/apps/webdata/backend/assets/newsletters/temp/' $filename// Rebuild the path to the full-size image
        
        //Function to  get Year & Issue#
        
$string $filename;                
                    if(
preg_match_all("#(\d{1,})#"$string$matchesPREG_SET_ORDER)) 
                    {
                            foreach(
$matches as $match
                              {
                                  
                            
$issue $match[0];
                            
                                while (list(
$key$value) = each($match)) 
                                {
                                
//YEAR
                                    
if (strlen ($value) == 4)
                                    {
                                    
$uyear $value;                                    
                                    }
                                
// ISSUE#
                                    
elseif (strlen ($value) == 1)
                                    {
                                    
$uissue $value;
                                    }
                                 }            
                           }
                     }    
        
//
        // Si no existe el año en $menu, lo creas como array
        
if(!isset($menu[$uyear])) 
            {
            
$menu[$uyear] = array();
            }
    
// Agregas el archivo
            
$menu[$uyear][] = $uissue;
            
        
$counter++; // Increment counter by 1 until no file exists
        
    
}

        echo 
'<div id=cssmenu>';
        echo 
'<ul>';
        echo 
'   <li class=has-sub last><a href=#><span>Please Select a Year:</span></a>';
        echo 
'      <ul>';
        echo 
"<li class='has-sub'><a href='#'><span>".$uyear." </span></a>";
        echo 
'            <ul>';
        echo 
"<li class=last><a href=# onclick=myPDF('".$filename."')> Issue# ".$uissue."</a></li>";
        echo 
'            </ul>';
        echo 
'         </li>';
        echo 
'      </ul>';
        echo 
'   </li>';
        echo 
'</ul>';
        echo 
'</div>'
  #9 (permalink)  
Antiguo 08/04/2013, 13:22
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por quinqui Ver Mensaje
La solución que te da Triby te sirve para lo que me preguntas: de hecho, aunque hace que hagas 2 ciclos en vez de uno, el hecho de separar los procesos, hace que sea más entendible y amigable la impresión del árbol.

Saludos!
Asi es Quinqui y es exactamente lo q andaba buscando, meter mis valores en un array y luego presentar los elmentos de ese array en mi menu, de todos modos gracias!
  #10 (permalink)  
Antiguo 08/04/2013, 13:47
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Crear un menu en PHP a partir de un directorio

Lo que pasa es que tu echo no está dentro de un ciclo, que debería ser algo como:

Código PHP:
Ver original
  1. // Este if es sólo para asegurar que hay algo en el arreglo
  2. if(count($menu) > 0) {
  3.     // Supongo  que aquí deberías abrir <ul>
  4.     // así como el <li>Please select a year</li>
  5.     foreach($menu as $uyear => $docs) {
  6.           // Aquí deberías crear <li>$uyear<ul>
  7.           foreach($docs as $filename) {
  8.                // Aquí <li>$filename</li>
  9.           }
  10.          // Aquí cierras </ul> y </li> del año
  11.     }
  12.     // Aquí cierras el primer </ul>
  13. }
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 08/04/2013, 14:07
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por Triby Ver Mensaje
Lo que pasa es que tu echo no está dentro de un ciclo, que debería ser algo como:

Código PHP:
Ver original
  1. // Este if es sólo para asegurar que hay algo en el arreglo
  2. if(count($menu) > 0) {
  3.     // Supongo  que aquí deberías abrir <ul>
  4.     // así como el <li>Please select a year</li>
  5.     foreach($menu as $uyear => $docs) {
  6.           // Aquí deberías crear <li>$uyear<ul>
  7.           foreach($docs as $filename) {
  8.                // Aquí <li>$filename</li>
  9.           }
  10.          // Aquí cierras </ul> y </li> del año
  11.     }
  12.     // Aquí cierras el primer </ul>
  13. }
Al ponerlo dentro de mi menu, me genera 1 solo articulo x año:

Código PHP:
echo '<div id=cssmenu>';
    if(
count($menu) > 0) {        
        
        echo 
'<ul>';
        echo 
'   <li class=has-sub last><a href=#><span>Please Select a Year:</span></a>';
        echo 
'      <ul>';
                    foreach(
$menu as $uyear => $docs
                    {
                    echo 
"<li class='has-sub'><a href='#'><span>".$uyear." </span></a>";
                     foreach(
$docs as $filename
                    {
                    echo 
'            <ul>';
                    echo 
"<li class=last><a href=# onclick=myPDF('".$filename."')> Issue# ".$uissue."</a></li>";
                    }
        echo 
'            </ul>';
        echo 
'         </li>';
        echo 
'      </ul>';
        echo 
'   </li>';
                    }
        echo 
'</ul>';
    }
        echo 
'</div>'
  #12 (permalink)  
Antiguo 08/04/2013, 14:13
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Crear un menu en PHP a partir de un directorio

Antes de generar el menú incluye esta línea: var_dump($menu);

Si contiene los valores correctos, entonces revisa tu HTML, está mal formado, porque el UL que abres dentro de foreach($docs) debería estar antes de ingresar al ciclo.

Luego, de dónde sale $uissue?... no veo donde lo generas.
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 08/04/2013, 14:21
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por Triby Ver Mensaje
Antes de generar el menú incluye esta línea: var_dump($menu);

Si contiene los valores correctos, entonces revisa tu HTML, está mal formado, porque el UL que abres dentro de foreach($docs) debería estar antes de ingresar al ciclo.

Luego, de dónde sale $uissue?... no veo donde lo generas.
Al realizar el Dump este es mi resultado:
Código:
array(3) {
  [2013]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
  }
  [2014]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
  }
  [2015]=>
  array(2) {
    [0]=>
    string(1) "1"
    [1]=>
    string(1) "2"
  }
}
Por lo q veo esta correcto y si mi menu html esta mal distribuido y el $uissue lo saco del string Newsletter_2013_1.pdf, donde el 1 es el numero de articulo o $uissue. Lo use en tu codigo anterior:
Código PHP:
// Si no existe el año en $menu, lo creas como array
        
if(!isset($menu[$uyear])) 
            {
            
$menu[$uyear] = array();
            }
        
// Agregas el archivo
            
$menu[$uyear][] = $uissue
Estoy confundido, al parecer las llaves del menu estan bien ejecutadas?
  #14 (permalink)  
Antiguo 08/04/2013, 17:53
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: Crear un menu en PHP a partir de un directorio

Pues el array se está generando correctamente, ahora deberías revisar el código fuente generado en el navegador, para que veas dónde está mal formado el HTML.
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 09/04/2013, 07:05
 
Fecha de Ingreso: marzo-2013
Mensajes: 26
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear un menu en PHP a partir de un directorio

Cita:
Iniciado por Triby Ver Mensaje
Pues el array se está generando correctamente, ahora deberías revisar el código fuente generado en el navegador, para que veas dónde está mal formado el HTML.
Gracias Triby, encontre el problema y lo pude solucionar, las llaves de mi HTML estaban mal cerradas x eso se quedaba solo imprimiendo el primer articulo, asi q aqui queda mi HTML correcto y aparte hice una concatenacion de 2 variables para poder pasar ese resultado a mi funcion de impresion:

Código PHP:
   echo '<div id=cssmenu>';
    if(
count($menu) > 0) {        
        
    echo 
'<ul>';    
        echo 
'   <li class=has-sub last><a href=#><span>Please Select a Year:</span></a>';
        echo 
'   <ul>';
                    foreach(
$menu as $uyear => $docs
                    {
                    echo 
"<li class='has-sub'><a href='#'><span>".$uyear." </span></a>";
                     echo 
'            <ul>';
                    
                     foreach(
$docs as $filename
                    {
                    
$a"Newsletter_$uyear";
                    
$b="_$filename.pdf";
                    
$myissue $a.$b;
                    echo 
"<li class=last><a href=# onclick=myPDF('".$myissue."')> Issue# ".$filename."</a></li>";
                    }
        echo 
'            </ul>';
        echo 
'         </li>';
                    }
        echo 
'   </ul>';
        echo 
'   </li>';
                    
    echo 
'</ul>';
    }
        echo 
'</div>'
Gracias x tu ayuda!!!

Etiquetas: css, directorio, jquery, menu+deplegable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:15.