Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: dimitrix en 4 Marzo 2011, 00:58 am



Título: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 00:58 am
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:

Citar
Inicio
Donde Estamos
En Valencia
En Barcelona
En Tarrassa
Otros lugares
En Alicante
En Madrid
Servicios que ofrecemos

y yo quiero que me salgan tipo

Citar
Inicio
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!


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 4 Marzo 2011, 03:54 am
entonces quiere decir que:
Citar
Inicio   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:
Código
  1. //$items[] es un array('nombre','id','id_padre')
  2. foreach($items as $item){
  3. echo (($item['id_padre']>0)?'|'.str_repeat('-',$item['id_padre']).'>':NULL)." {$item['nombre']}";
  4. }

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...


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Lunfardo en 4 Marzo 2011, 04:13 am
fijate en usar una solucion recursiva sino te queres enroscar con los while


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 4 Marzo 2011, 04:59 am
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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 12:47 pm
Me gustaría publicarlo para uso no empresarial, pongo parte del código:

Código
  1.   <option value="0">&Iacute;ndice</option>');
  2. while ($valores = mysql_fetch_array($resultados)){
  3. echo('<option value="'.$valores["ID"].'">'.$valores["Titulo"].'</a><br>');
  4. };
  5.  

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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Lunfardo en 4 Marzo 2011, 16:05 pm
edit: jaja entendi el problema tarde , =P


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 17:42 pm
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!'.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: 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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 18:44 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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 4 Marzo 2011, 19:10 pm
Código
  1. //...
  2. '<option value="0">&Iacute;ndice</option>');
  3. while ($valores = mysql_fetch_array($resultados)){
  4. echo('<option value="'.$valores["ID"].'">'(($valores['ID_padre']>0)?'|'.str_repeat('-',$valores['ID_padre']).'>':NULL)..$valores["Titulo"].'</a><br>');
  5. };
  6.  

Así tendría que funcionar bien, eso creo... jeje.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: 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 :-/


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 4 Marzo 2011, 20:03 pm
aaaaaaaaa, entonces, id_padre que es? Por qué no me dlo dijiste antes con el ejemplo que te di?  :¬¬ :¬¬
Citar
Inicio   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?


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Freeze. en 4 Marzo 2011, 20:15 pm
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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Lunfardo en 4 Marzo 2011, 20:15 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


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Lunfardo en 4 Marzo 2011, 20:40 pm
solo para saber si entendi, vos queres algo asi pero mas elegante?


Código
  1. '  <option value="0">&Iacute;ndice</option>');
  2.  $valores = mysql_fetch_array($resultados);
  3. while ($valores){
  4.  
  5.              $nivelActual=$valores["ID_PADRE"];
  6.              while($valores["ID_PADRE"]==$nivelActual){
  7.  
  8.              echo('<option value="'.$valores["ID"].'">'.$valores["Titulo"].'</a><br>');
  9.             $valores = mysql_fetch_array($resultados);
  10.             }
  11. };
  12.  
  13.  
  14.  


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 20:50 pm
Castl! El problema es que el ID_padre no tiene nada que ver con el nivel, me explico.


Si por ejemplo:
Citar
Inicio   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
Citar
Inicio   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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 4 Marzo 2011, 21:16 pm
Perfecto, agregá otra coluimna en tu base de datos: "njerarquia" siendo:
Citar
Inicio   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


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 4 Marzo 2011, 21:41 pm
Castg! hay un problema, por ejemplo:

Citar
Inicio   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'.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 5 Marzo 2011, 00:38 am
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...


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Freeze. en 5 Marzo 2011, 05:15 am
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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: 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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 5 Marzo 2011, 12:45 pm
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.


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 5 Marzo 2011, 13:27 pm
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)


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 9 Marzo 2011, 10:49 am
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)


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: Castg! en 9 Marzo 2011, 13:57 pm
Entonces como es que lo solucionaste?


Título: Re: Estoy realizando un CMS (pequeña duda de lógica)
Publicado por: dimitrix en 9 Marzo 2011, 15:30 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