Foros del Web » Programando para Internet » PHP »

duda con menu obtenido desde base de datos

Estas en el tema de duda con menu obtenido desde base de datos en el foro de PHP en Foros del Web. hola a todos, tengo un menu horizontal construido en base a listas <ul>, cada elemento <li> es una seccion, dentro de cada seccion tengo tambien ...
  #1 (permalink)  
Antiguo 22/03/2010, 02:07
 
Fecha de Ingreso: junio-2006
Ubicación: Antofagasta
Mensajes: 216
Antigüedad: 17 años, 10 meses
Puntos: 7
Pregunta duda con menu obtenido desde base de datos

hola a todos, tengo un menu horizontal construido en base a listas <ul>, cada elemento <li> es una seccion, dentro de cada seccion tengo tambien subsecciones construidas con otras listas...

-----------------------------------------
| SECCION 1 | SECCION 2 | SECCION 3 | SECCION X |
-----------------------------------------
| contenido1a |
- - - - - - - -
| contenido1b |
- - - - - - - -
| contenido1x |
- - - - - - - -

bueno, supongo que se entiende como es el menu, como todos esos menus desplegables que hay en muchas paginas

el codigo es asi:

Código HTML:
<ul>
    <li>seccion 1
        <ul>
            <li>contenido 1a</li>
            <li>contenido 1b</li>
        </ul>
    </li>
    <li>seccion 2
        <ul>
            <li>contenido 2a</li>
            <li>contenido 2b</li>
        </ul>
    </li>
    <li>seccion 3</li>
</ul> 
las secciones principales son siempre las mismas y nunca cambian pero lo que va dentro de cada seccion es variable ya que cada seccion puede tener X elementos. Lo guardo en base de datos de la siguiente forma:

tabla contenido
id - titulo - seccion - contenido
-------------------------------------------
1 - contenido1 a - seccion 1 - el texto bla bla....
2 - contenido2 a - seccion 2 - el texto de esta seccion....
....

por lo tanto cada ves que quiero agregar contenido a una de las secciones, voy al formulario que tengo para tal efecto, le doy un titulo (dicho titulo es el que aparecera en los elementos del menu en esa seccion), selecciono a que seccion pertenece y agrego el contenido... hasta ahi todo bien.

Ahora el problema se me presenta cuando quiero construir el menu horizontal sacando los titulos de la base de datos ya que no se como podría agruparlos en cada sección.

una solucion es hacer tantas consultas como secciones tenga, por ejemplo:

- abro el <UL> y el <LI> para la primera seccion...
- consulta mysql 1: traigo todo los registros en donde seccion sea igual a "seccion 1", y creo una nueva lista con cada "subseccion" por asi llamarlo que van dentro de SECCION 1.
- consulta 2: repito el mismo paso anterior pero esta vez para SECCION 2 y asi sucesivamente hasta completar el menu.

creo que no es la forma mas optima de realizar lo que necesito, estoy seguro que debe haber una forma mejor pero en este momento no se me ocurre.

tal ves podría hacer una sola consulta agrupando los registros por seccion y guardandolos en arrays (un array para cada seccion) y luego creo las listas recorriendo los arrays y me evito hacer tantas consultas a la base de datos.

Si alguien me puede dar una ayuda para aclararme como deberia hacerlo estaria agradecido.

espero no haberme extendido mucho en mi post y ojalá haya sido claro en explicar mi duda.

Saludos
  #2 (permalink)  
Antiguo 22/03/2010, 06:14
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: duda con menu obtenido desde base de datos

Yo tengo un método que funciona muy bien, pero te voy a explicar el método que te resutlará más fácil.

Código PHP:
Ver original
  1. //Sea $items la variable donde tienes el resultado extraido y en forma de array de
  2. //la base de datos mediante mysql_fetch_assoc por ejemplo:
  3. $cats = array();
  4. foreach($items as $i){
  5.     if(!isset($cats[$i['seccion']]){
  6.            $cats[$i['seccion']] = array();
  7.     }
  8.     $cats[$i['seccion']][] = $i;
  9. }
  10.  
  11. //Para mostrar:
  12. echo '<ul>';
  13. foreach($cats as $k=>$i){
  14.     if(count($cats) == 0) continue;
  15.     echo '<li>'.$k.'<ul>';
  16.     foreach($i as $j){
  17.         echo '<li><a href="" title="">'.$j['titulo'].'</a></li>';
  18.     }
  19.     echo '</li>';
  20. }
  21. echo '</ul>';

Si lees un poco verás que puse un link con href="" y title="". Allí es donde tienes que rellenar tú, no vi los campos de descripción o dirección en la tabla.


Originalmente usaba este sistema, hasta que consideré usar sistemas de varios niveles, para lo que necesitaba posibilidad de subordniación. Eso se hace añadiendo un elemento a la base de datos llamado id (que es índice primario y autoincrementado) y un elemento llamado subordinado_a (que indica el id del elemento al que está subordinado). Cómo el AutoIncrement nunca empieza en 0, el subordinado_a=0 indica que está en la raíz. Por último indicar que para hacer esto tienes que crear las secciones en la base de datos con subordinado_a = 0, pero creo que no sirve tan facil para lo que quieres.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #3 (permalink)  
Antiguo 22/03/2010, 08:05
 
Fecha de Ingreso: marzo-2010
Ubicación: Rosario
Mensajes: 20
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: duda con menu obtenido desde base de datos

Hola Greco2,

El ejemplo que puse AnesGy esta muy bueno y me parece muy performante.
Antes de ver este ejemplo lo que yo hubiera hecho es traerme todos los registros a una matriz, ya que si es de un menú vamos a necesitar todos, después ordenar la matriz por sección. Para mostrar, recorro registro por registro la matriz, y voy mostrando en el mismo menú horizontal todos los registros que tengan la misma sección que la anterior, vas guardando la sección anterior en una variable y en la próxima vuelta se remplaza sola. Sino tiene la misma sección cerras y pasas al menú siguiente manejándote con las etiquetas de la lista (<ul></ul><li></li>) y mostras de vuelta.

Espero que se entienda, igualmente te recomiendo el ejemplo de AnesGy.

Saludos.
  #4 (permalink)  
Antiguo 22/03/2010, 21:44
 
Fecha de Ingreso: junio-2006
Ubicación: Antofagasta
Mensajes: 216
Antigüedad: 17 años, 10 meses
Puntos: 7
Respuesta: duda con menu obtenido desde base de datos

Hola, gracias por responder.

Estoy tratando de entender el ejemplo de AnesGy pero no lo logro endender.
Revisando el codigo solo tuve que agregar un ")" que faltaba en el primer IF.

Hice la consulta a la tabla donde tengo alojadas las "sub-secciones" y al momento de construir las listas en ves de generar un <LI> por cada seccion, me genera un <LI> por cada row del registro y luego hace lo mismo en la lista que debe ir dentro de cada LI. y en todos los LI solo muestra la primera

Explico un poco el resultado que tengo:

por ejemplo esta es mi tabla 'contenido':

ID - TITULO - SECCION - OTRO_DATO
------------------------------
1 - internacional - noticia - otro dato
2 - nacional........ - noticia - otro dato
3 - futbol........... - deporte - bla bla
4 - tenis............. - deporte - bla bla

la consulta a la base de datos:
Código PHP:
$sql mysql_query("SELECT * FROM contenido" $link);
$items mysql_fetch_assoc($sql);
// aqui el codigo ejemplo de AnesgY... 
o lo que obtengo es:

Código HTML:
<ul>
  <li>1
    <ul>
      <li>1</li>
    </ul>
  </li>
  <li>i
    <ul>
      <li>i</li>
    </ul>
  </li>
  <li>n
    <ul>
      <li>n</li>
    </ul>
  </li>
  <li>o
    <ul>
      <li>o</li>
    </ul>
  </li>
</ul> 
como se ve, genera el meno leyendo solo el primer registro de la tabla y tomando la primera letra de cada campo para generar un <LI> nuevo.

Bueno, me estoy alargando mucho, lo que quiero hacer es lo siguiente:

- yo tengo en la pagina una lista donde cada elemento <LI> es una seccion diferente.
- en una tabla de la base de datos tengo almacenadas las sub-secciones, cada registro es una subseccion diferente y almacenan a parte de su titulo, la seccion a la que perenecen
- quiero crear una nueva lista (subsecciones) dentro de cada elemento de la primera lista (secciones), agrupando los registros que correspondan a cada seccion.

Código PHP:
<ul>
  <
li>NOTICIAS
    
// aqui crear una nueva lista con los registros correspondientes a noticias
    // por ejemplo:
    // <ul>
    //   <li>nacional</li>
    //   <li>internacional</li>
    // <ul>
  
</li>
  <
li>DEPORTE /*aqui otra lista para subsecciones de deporte*/</li>
  <
li>OTRA_SECCION /*aqui otra lista para subsecciones de  otra_seccion*/</li>
</
ul
es es ala parte que no logro hacer o no se me ocurre como poder hacerla sin tener que hacer tantas consultas a la base de datos como secciones tenga.

Como dije al principio de este post, no logro entender el ejemplo de AnesgY por mas que le doy vuelta por eso no me funciona.

Saludos
  #5 (permalink)  
Antiguo 22/03/2010, 23:55
 
Fecha de Ingreso: junio-2006
Ubicación: Antofagasta
Mensajes: 216
Antigüedad: 17 años, 10 meses
Puntos: 7
Respuesta: duda con menu obtenido desde base de datos

Hola, yo nuevamente, bueno, despues de darle vuelta y vuelta y probar creo que ya lo tengo solucionado, realicé lo siguiente:

Código PHP:
// conexion a la DB...
// consulta a la tabla...
$sql mysql_query("SELECT * FROM contenido"$link);

while(
$items mysql_fetch_assoc($sql)){
    
// Seccion "NOTICIAS"
    
if ($items['seccion']=='Noticia'){
        
$sec1[] = "<li>".$items['nombre']."</li>";
    }
    
    
// Seccion "DEPORTES"
    
if ($items['seccion']=='Deportes'){
        
$sec2[] = "<li>".$items['nombre']."</li>";
    }
    
    
// otra seccion
    
if ($items['seccion']=='otra seccion'){
        
$sec3[] = "<li>".$items['nombre']."</li>";
    }

y para mostrar las listas hice lo siguiente:
Código PHP:
<ul>
    <li>NOTICIAS
        <ul>
            <?php
            
foreach($sec1 as $i){
                echo 
$i;
            }
            
?>
        </ul>
    </li>
    <li>DEPORTES
        <ul>
            <?php
            
foreach($sec2 as $i){
                echo 
$i;
            }
            
?>
        </ul>
    </li>
    <li>OTRA SECCION
        <ul>
            <?php
            
foreach($sec3 as $i){
                echo 
$i;
            }
            
?>
        </ul>
    </li>
</ul>
con las listas quedan como quiero
  • NOTICIAS
    • nacional
    • internacional
    • ...
  • DEPORTES
    • futbol
    • tenis
    • ...
  • OTRA SECCION
    • ...
    • ...

Hasta el momento me ha funcionado bien en local, espero que funcione cuando lo implemente en el servidor final.

Saludos
  #6 (permalink)  
Antiguo 23/03/2010, 17:16
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: duda con menu obtenido desde base de datos

Perdona, se me fue un poco la cabez al escribir el código, hay un error en el prorama que muestra el menú:

Código PHP:
Ver original
  1. //Sea $items la variable donde tienes el resultado extraido y en forma de array de
  2. //la base de datos mediante mysql_fetch_assoc por ejemplo:
  3. $cats = array();
  4. foreach($items as $i){
  5.     if(!isset($cats[$i['seccion']])){
  6.            $cats[$i['seccion']] = array();
  7.     }
  8.     $cats[$i['seccion']][] = $i;
  9. }
  10.  
  11. //Para mostrar:
  12. echo '<ul>';
  13. foreach($cats as $k=>$i){
  14.     if(count($i) == 0) continue;
  15.     echo '<li>'.$k.'<ul>';
  16.     foreach($i as $j){
  17.         echo '<li><a href="" title="">'.$j['nombre'].'</a></li>';
  18.     }
  19.     echo '</ul></li>';
  20. }
  21. echo '</ul>';

Esta vez si que la he probado (y lo he hecho por k no me gusta nada tu código, es absolutamente inflexible). Entonces, para cargar los datos haces la query a la base de datos y

Código PHP:
Ver original
  1. $result = mysql_query($myquery,$mylink);
  2. $items = array();
  3. while($row=mysql_fetch_assoc($result)){
  4.  $items = $row;
  5. }

si ves que no funciona me haces un var_dump al array de $items (y por eso me gusta sacarlo antes y no montar directamente el while en el bucle de control, además de que es posible que se necesiten los datos después en futuras modificaciones) o un print_r (el print_r me basta y es mas simple).
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it

Etiquetas: Ninguno
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 21:15.