Vamos a ver, estoy realizando un pequeño CMS tipo Joomla (digo el panel y como está dividido), no tengo ningún problema en nada... excepto... en como hacer cuando por ejemplo hay un menú dentro de otro menu por ejemplo:
- Inicio
- Donde Estamos
--> En Valencia
--> En Barcelona
-----> En Tarrassa
-----> Otros lugares
--> En Alicante
--> En Madrid
- Servicios que ofrecemos
Es decir, un sección dentro de otra, así hasta 3 nivele en este caso.
El problema es que en el desplegable para seleccionar la 'sección' me salen en lista:
CitarInicio
Donde Estamos
En Valencia
En Barcelona
En Tarrassa
Otros lugares
En Alicante
En Madrid
Servicios que ofrecemos
y yo quiero que me salgan tipo
CitarInicio
Donde Estamos
|-> En Valencia
|-> En Barcelona
|---> En Tarrassa
|---> Otros lugares
|-> En Alicante
|-> En Madrid
Servicios que ofrecemos
Y no tengo ni idea de como hacerlo. Los tengo en la base de datos y todas las secciones tienen un ID y un ID_Padre que el ID_Padre es la sección dentro de la que van o si es el Índice(la principal el valor es 0).
Había pensado en un While dentro de otro While dentro de otro, pero me gustaría algo que no sea tan cutre, sobretodo por que si tiene 5 niveles ya la he cagado.
¡Un saludo!
entonces quiere decir que:
CitarInicio ID_PADRE=0
Donde Estamos ID_PADRE=0
|-> En Valencia ID_PADRE=1
|-> En Barcelona ID_PADRE=1
|---> En Tarrassa ID_PADRE=2
|---> Otros lugares ID_PADRE=2
|-> En Alicante ID_PADRE=1
|-> En Madrid ID_PADRE=1
Servicios que ofrecemos ID_PADRE=0
Si esto es asi, trata de tener una idea segun este codigo:
//$items[] es un array('nombre','id','id_padre')
foreach($items as $item){
echo (($item['id_padre']>0)?'|'.str_repeat('-',$item['id_padre']).'>':NULL)." {$item['nombre']}";
}
Lógicamente faltan links y tendrias que adaptarlo a TU diseño HTML, que si trabajas con listas, en vez de agregar caracteres ("|-->"), agregar
<ul>.
Espero serte de ayuda, si no trabajas de esta forma con los items, o no podes implementarlo, un poco de código no viene mal, aunque esta bien que por ahora no quieras dar código.
PD: Yo también estoy con un proyectito algo asi: "Blotg!" un blog programado unicamente por mi, llevo ya 3 semanas de su comienzo y ya estoy imprimiendo/subiendo/modificando posts,tags,categorias y comentarios. Ya lo vas a ver por aca...
fijate en usar una solucion recursiva sino te queres enroscar con los while
Yo creo que de esa solucion recursiva que hablas ya se encargo, porque por lo que pienso guarda en la base de datos con un "ID_PADRE" y ya ahi entra en juego la logica con respecto a este id.
Me gustaría publicarlo para uso no empresarial, pongo parte del código:
<option value="0">Índice</option>');
while ($valores = mysql_fetch_array($resultados)){
echo('<option value="'.$valores["ID"].'">'.$valores["Titulo"].'</a><br>');
};
El $valores es un array que contiene: ID, ID_padre y Titulo.
El value de la opción tiene que ser el ID y el título lo que aparezca en el seleccionador. Lo único que me falta es poner lo de -> -->.
Lo que está claro que esa parte la tengo que cambiar, que no puede ir con WHILE.
edit: jaja entendi el problema tarde , =P
No SmogMX, no tiene nada que ver con eso, pero gracias por el intento.
Tiene algo que ver más bien con lo de 'Castg!'.
No me he fijado del todo bien en el código, pero así por encima yo hice un proyecto parecido e hice algo así:
El mismo while que tú, mas o menos, pero dentro del while pones un swtich.
Si el ID_PADRE == 0 por ejemplo no pones nada, si es 1 pones delante -> y si es 2, pones delante -->, de esta forma conseguirás la estructura en árbol que buscas. Así al menos lo hice yo y me funcionó bastante bien.
Cita de: Spider-Net en 4 Marzo 2011, 18:37 PM
No me he fijado del todo bien en el código, pero así por encima yo hice un proyecto parecido e hice algo así:
El mismo while que tú, mas o menos, pero dentro del while pones un swtich.
Si el ID_PADRE == 0 por ejemplo no pones nada, si es 1 pones delante -> y si es 2, pones delante -->, de esta forma conseguirás la estructura en árbol que buscas. Así al menos lo hice yo y me funcionó bastante bien.
Pero no serviría puesto que en la base de datos no está el nivel de cada uno 0, 1 o 2, por que puede llamar hasta 10.
//...
'<option value="0">Índice</option>');
while ($valores = mysql_fetch_array($resultados)){
echo('<option value="'.$valores["ID"].'">'(($valores['ID_padre']>0)?'|'.str_repeat('-',$valores['ID_padre']).'>':NULL)..$valores["Titulo"].'</a><br>');
};
Así tendría que funcionar bien, eso creo... jeje.
Mmmm... Castg! me da error, he intentado arreglarlo pero no anda bien.
Pero una cosa, timas el ID_padre como la cantidad de guines que hay que poner ¿No?
Es que eso no es :-/
aaaaaaaaa, entonces, id_padre que es? Por qué no me dlo dijiste antes con el ejemplo que te di? :¬¬ :¬¬
CitarInicio ID_PADRE=0
Donde Estamos ID_PADRE=0
|-> En Valencia ID_PADRE=1
|-> En Barcelona ID_PADRE=1
|---> En Tarrassa ID_PADRE=2
|---> Otros lugares ID_PADRE=2
|-> En Alicante ID_PADRE=1
|-> En Madrid ID_PADRE=1
Servicios que ofrecemos ID_PADRE=0
Que error te da?
Esa variable ID_PADRE no tiene sentido de la manera en que la están implementando. o.O
Me parece que para hacer ese menu, nunca lo he intentado con niveles "infinitos". Solamente lo hago de 2 niveles. Nivel Padre y Nivel Hijos, por decirlo asi. Y luego las relaciono.
Cita de: dimitrix en 4 Marzo 2011, 19:43 PM
Mmmm... Castg! me da error, he intentado arreglarlo pero no anda bien.
Pero una cosa, timas el ID_padre como la cantidad de guines que hay que poner ¿No?
Es que eso no es :-/
basicamente la funcion de cast hace lo mismo que lo que te habia puesto pero nada mas que yo no sabia que id_padre era un datos.
creo que recien entiendeo el problema
estoy igual que freeze, no entiendo la funcion de la varible "ID_PADRE" , solo te dice el nivel al que pertenece pero no da informacio util de los niveles superiores
solo para saber si entendi, vos queres algo asi pero mas elegante?
' <option value="0">Índice</option>');
$valores = mysql_fetch_array($resultados);
while ($valores){
$nivelActual=$valores["ID_PADRE"];
while($valores["ID_PADRE"]==$nivelActual){
echo('<option value="'.$valores["ID"].'">'.$valores["Titulo"].'</a><br>');
$valores = mysql_fetch_array($resultados);
}
};
Castl! El problema es que el ID_padre no tiene nada que ver con el nivel, me explico.
Si por ejemplo:
CitarInicio ID=1
Donde Estamos ID=2
|-> En Valencia ID=3
|-> En Barcelona ID=4
|---> En Tarrassa ID=5
|---> Otros lugares ID=6
|-> En Alicante ID=7
|-> En Madrid ID=8
Servicios que ofrecemos ID=8
ID Padre sería
CitarInicio ID_padre=0
Donde Estamos ID_padre=0
|-> En Valencia ID_padre=2
|-> En Barcelona ID_padre=2
|---> En Tarrassa ID=4
|---> Otros lugares ID=4
|-> En Alicante ID=2
|-> En Madrid ID=2
Servicios que ofrecemos ID=0
¿Lo entendeis ahora?
La razón de por que se hace así y no directamente de otra forma, es por que así desde el panel de control se puede mover las carpetas de un lugar a otro.
Perfecto, agregá otra coluimna en tu base de datos: "njerarquia" siendo:
CitarInicio njerarquia=0
Donde Estamos njerarquia=0
|-> En Valencia njerarquia=1
|-> En Barcelona njerarquia=1
|---> En Tarrassa njerarquia=2
|---> Otros lugares njerarquia=2
|-> En Alicante njerarquia=1
|-> En Madrid njerarquia=1
Servicios que ofrecemos ID=0
Así, ID_Padre queda intacto para lo que vos lo utilices, y mi función correría tranquila y correcta
Castg! hay un problema, por ejemplo:
CitarInicio njerarquia=0
Donde Estamos njerarquia=0
|-> En Valencia njerarquia=1
|-> En Barcelona njerarquia=1
|---> En Tarrassa njerarquia=2
|---> Otros lugares njerarquia=2
|-> En Alicante njerarquia=1
|-> En Madrid njerarquia=1
Servicios que ofrecemos njerarquia=0
|-> webs njerarquia=1
|-> PHP njerarquia=1
¿Cómo podrías saber que 'webs' pertenece a 'Servicios que ofrecemos' y no a 'Donde estamos'.
Es complicadisimo! No se si el problema es que te enquilombaste mucho! veo que puedo seguir haciendo, sino, me parece que vas a tener que cambiar de método, aunque no lo creo...
Tienes que organizarte mejor.
Item y Subitem serían 2 tablas distintas.
Cada Item principal debe tener un ID. Y los subitems un pID, con el que relacionarias. (ID padre). La cuestion es que solo funcionaria para un solo nivel, no encuentro la forma de hacerlo de otra forma sin agrander el numero de tablas de una manera poco estética.
bueno yo l otra ves tenia un problema muy parecido, no consegui la solucion absoluta, pero lo que hice fue que hice un algoritmo que revisara todo el array y a cada padre le pusiera sus hijos, y despues con bucles anidados irlos mostrandos, lo de los bucles anidados no me gustaba mucho, asi que trate de hacer una funcion recursiva, pero cuando la haci no daba error, pero toda la pantalla se ponia en blanco, la postee aqui pero nadie vio mi error, por eso me quede con los bucles anidados si te interesa ver el codigo me avisas y lo posteo.
Cita de: bomba1990 en 5 Marzo 2011, 05:42 AM
bueno yo l otra ves tenia un problema muy parecido, no consegui la solucion absoluta, pero lo que hice fue que hice un algoritmo que revisara todo el array y a cada padre le pusiera sus hijos, y despues con bucles anidados irlos mostrandos, lo de los bucles anidados no me gustaba mucho, asi que trate de hacer una funcion recursiva, pero cuando la haci no daba error, pero toda la pantalla se ponia en blanco, la postee aqui pero nadie vio mi error, por eso me quede con los bucles anidados si te interesa ver el codigo me avisas y lo posteo.
Ok muchas gracias, lo haré hasta 4 niveles que nunca se suele usar tanto y listo!
Muchas gracias a todos.
Mirá, estoy corto de tiempo en este momento para realizar un script, tal vez más tarde pueda meterle un poco de mano, pero se me ocurrió esto:
Cargas de la bd todos los items con id_padre=0. Recorres estos valores cargados uno por uno. Para cada uno, cargas de la bd todos los items con id_padre=id_item_actual (entendes?) y entonces vas guardando los datos en una variable array. --> Recursivo
Una imagen te puede ayudar más: (cuando ya se está en el bucle, se encuentra una subcategoria y se empieza otro bucle, justamente se empieza OTRO bucle, para después completar el/los comenzados anteriormente. Con empezar bulce me refiero a llamar a una función cuando existan items con id_padre=item actual, asi quedaría Recursivo)
(http://i54.tinypic.com/565wy.jpg)
Al final lo he conseguido hacer de otra forma, aunque el diseño es una *****, por lo menos se puede ver algo xD
(http://img219.imageshack.us/img219/3227/salioendo.png)
Entonces como es que lo solucionaste?
Cita de: Castg! en 9 Marzo 2011, 13:57 PM
Entonces como es que lo solucionaste?
Lo hice hasta 4 niveles, luego con un 'Count' contaba cuentas líneas se había impreso, después hacía un SELECT para mirar las secciones que existían en la db (count2).
Si count==count2 todo perfecto.
Si count!=count2 te muestra que ciertas secciones no se han mostrado y te da la opción de ir a un panel que ya había programado donde salen todas las secciones y puedes modificar el ID_padre (por si era de una sección que ya no existe) o cambiar a otra o dejarlo como está. (Puesto que en el menú, sí saldría bien, el problema lo tenía en el panel de control).
Si quieres verlo te paso el code por privado.
Muchas gracias