Problema urgente, perdendo a esperança!!! [RESOLVIDO]

1. Problema urgente, perdendo a esperança!!! [RESOLVIDO]

João Cagnoni
joaocagnoni

(usa Debian)

Enviado em 23/12/2008 - 20:13h

Gente, meu problema a primeira vista parece muito simples, mas tentei em vários fóruns e ninguém conseguiu me ajudar.

Eu preciso fazer um sistema para exibir categorias dentro de categorias, de forma infinita, por exemplo:

- Animais
-- Mamíferos
--- Humanos
---- Homens
----- Altos
------ Acima de 1,80
------ Acima de 1,90
------- Alguém
-------- Etc, etc...
----- Baixos
---- Mulheres
--- Vacas
-- Répteis
--- Crocodilos
--- Jacarés
- Insetos
-- Barata
-- Mosquito

Obviamente eu inventei estas categorias somente para exemplificar a vocês. Meu problema é que não achei nenhuma opção lógica de se exibir as categorias desta forma.

O único jeito que consegui é colocando while dentro de while, mas descartei esta opção, pois eu precisaria de pelo menos 20 whiles em meu código, o que seria muito difícil alterar o código depois.

A lógica que pensei é criar um banco de dados com os campos - id, raiz, titulo - onde ID seria a identificação da categoria, raiz seria a ID da categoria que esta categoria pertence (0 para nenhuma), e título obviamente o título dela.

Este problema seria quase a mesma coisa que exibir a lista de diretórios que tem no Windows Explorer (desculpa comunidade Linux, mas não lembro o nome desta utilidade no Linux).

Alguma luz? Estou desesperado atrás disso, ninguém sabe um jeito.

Feliz natal a todos!


  


2. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 23/12/2008 - 21:17h

não sei se há alguma restrição em seu projeto, mas por que você não usa dom xml?


dê uma olhada nesses links para pegar o 'click' da coisa:
http://www.w3schools.com/php/php_xml_dom.asp
http://www.php.net/manual/pt_BR/book.domxml.php


3. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

João Cagnoni
joaocagnoni

(usa Debian)

Enviado em 23/12/2008 - 21:20h

Poderia explicar melhor como isso resolveria meu problema?


4. muito loco

thiago
iceoz

(usa Debian)

Enviado em 23/12/2008 - 22:05h

muito loco tudo isso vc realmente tah com um problemão nun to com muito tempo mais vo dah a ideia ve se tenta aproveita. voce pode criar uma tabela assim como vc falo. tenha id_pai, id, titulo. depois dai que vem o pepino to certo hehe. primeira coisa tenha um registro raiz. tipo o / do linux. dai vc seleciona todos os registros no banco que tenha como pai a / e pra cada registro vc faz o msm procedimento so que ao invez de procurando como pai a pasta atual que é filha da /. complexo neh. um jeito facil de faze isso é fazendo uma função que chame ela msm. dai vai de vc fazer o tratamento de quando não tiver mais filhos voltar essas coisas. mais jah te digo facil nun vai ser hehe.


5. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

João Cagnoni
joaocagnoni

(usa Debian)

Enviado em 23/12/2008 - 23:26h

Dá pra fazer uma função chamar ela mesma?


6. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

Relsi H. Maron
relsi.ramone

(usa Ubuntu)

Enviado em 23/12/2008 - 23:27h

Se eu entendi bem, um menu hierárquico pode lhe dar uma luz.

Aqui mesmo no VOL tem um script:

http://www.vivaolinux.com.br/script/Menu-Dinamico-(PHP-+-MySQL)-5-niveis

vê se serve, se não servir procura por esse tipo de script que vai ajudar.

hgs

Relsi
http://relsiramone.blogspot.com
-----------------------------------------------
Index Librorum - Um espaço livre para a literatura livre
http://www.relsi.info/blog
Creative Commons - Porque ser livre é o que importa
http://www.creativecommons.org.br/


7. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

richard marques dos santos
slackrichard

(usa Slackware)

Enviado em 24/12/2008 - 00:29h

vamos la a solução que utilizei foi implementado no postgres ok então ai vai primeiro as tabelas

subordinacao
id serial
filho integer
pai integer

agora uma function no banco
primeira function

DECLARE
root ALIAS FOR $1;
depth ALIAS FOR $2;
tempRow1 subordinacao%ROWTYPE;
tempRow2 subordinacao%ROWTYPE;
BEGIN
-- Using PostgreSQL 7.3.4.
-- Docs: http://www.postgresql.org/docs/7.3/static/plpgsql.html
-- See chapter 19, especially 19.6

FOR tempRow1 IN SELECT filho, pai FROM subordinacao WHERE pai = root
LOOP
RETURN NEXT tempRow1;
FOR tempRow2 IN SELECT filho, pai FROM
getsubord(tempRow1.filho, depth+1) LOOP
RETURN NEXT tempRow2;
END LOOP;
END LOOP;
RETURN;
END;

segunda function

DECLARE
root ALIAS FOR $1;
tempRow subordinacao%ROWTYPE;
BEGIN
FOR tempRow IN SELECT filho, pai FROM getsubord(root, 0) LOOP
RETURN NEXT tempRow;
END LOOP;
RETURN;
END;

tabela individuo

id serial
descricao varchar(30)

a tabela subordinação e preenchida com os dados da tabela individuo lembrando que voce não pode colocar um filho sendo pai de se mesmo nem um neto sendo pai de um avo.

depois disso feito basta voce fazer uma select em getsubor ok


8. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

João Cagnoni
joaocagnoni

(usa Debian)

Enviado em 24/12/2008 - 13:52h

Caro relsi.ramone, era quase isso. Repare que na descrição do script que você mandou o usuário deixou claro "Esse script é um menu dinâmico hierarquico de 5 níveis.". 5 níveis também sei fazer, meu problema é para fazer com infinitos níveis, entendeu?

@slackrichard

Só tem este jeito? Não entendi nada desse código :(


9. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

Marcelo A. B. Slomp
mslomp

(usa Slackware)

Enviado em 24/12/2008 - 14:30h

"... infinitos níveis..."

foi por isso mesmo que citei o dom.
obtenha os dados do bd, construa um xml, mesmo que 'virtual' e então apenas implemente um parser xml simples, que independe do número de níveis, esgotando a busca por si só, sem o 'efeito montanha-russa' com loops mirabolantes.
dê uma pesquisada sobre dom + db + xml.


10. Re: Problema urgente, perdendo a esperança!!! [RESOLVIDO]

João Cagnoni
joaocagnoni

(usa Debian)

Enviado em 24/12/2008 - 16:44h

É que eu nunca me aventurei com XML, e tenho pressa para terminar esse sistema. Não tem outro jeito? =/

Muito obrigado a todos que estão ajudando.

edit: Estive lendo no manual do PHP sobre o DOM. As vezes existem maravilhas que nós desconhecemos. Gostei muito, era tudo o que eu precisava! Mas o meu problema ainda é tempo, então gostaria de saber se alguém sabe de algum jeito mais fácil de resolver o meu problema. Obrigado!


11. Cara eu acho que isso é facil

Rodrigo Kulb
RodrigoKulb

(usa Ubuntu)

Enviado em 24/12/2008 - 17:17h

Bom se eu entendi realmente sua pergunta, acredito ser simples. então vamos la

Crie uma tabela no banco de dados com os seguintes campos:



idCategoria
idCatPai
nomeCat
statusCat

PRONTO

com seu exemplo, pratica de uso.

idCategoria -> 1
idCatPai -> 0
nomeCat -> Animais
statusCat -> 1

idCategoria -> 2
idCatPai -> 1
nomeCat -> Mamíferos
statusCat -> 1

idCategoria -> 3
idCatPai -> 2
nomeCat -> Humanos
statusCat -> 1

idCategoria -> 4
idCatPai -> 3
nomeCat -> Altos
statusCat -> 1

idCategoria -> 5
idCatPai -> 4
nomeCat -> Acima de 1,80
statusCat -> 1

idCategoria -> 6
idCatPai -> 4
nomeCat -> Acima de 1,90
statusCat -> 1

isto não tem fim você pode ter varias categorias dentro de varias categorias o segredo é montar uma estrutura de programa bem organizada.









12. Bem, o problema é conhecimento

Gedalias Costa
gedalinux

(usa Slackware)

Enviado em 24/12/2008 - 17:20h

Entendo o seu problema e tem solução, mas vejo que o seu caso
pessoal está meio sem solução. Entenda, meu caro és um programador e parece
nem mesmo conhecer recursividade, quando pergunta se uma funcao pode chamar a si
mesma. Dizendo isto terei dificuldade em explicar associações, sejam elas em banco ou Orientadas a Objeto.

Muitos colegas tentaram te ajudar, mas eles pareciam ver sua arvore crescendo
somente em um galho, não é o seu caso.

Sua arvore parte de um elemnto raiz e deve mergulhar infinitamente até as folhas da arvore e sem deixar os galhos paralelos da hierarquia de lado. Como parece haver dificuldade de compreensao em arquiteturas de sistemas, so vou passar os
assuntos que envolvem essa solução, considerando que é muito complexo para explicar em um forum com poucas linhas:

Se for programacao estruturada:

RECURSIVIDADE.
ASSOCIAÇÕES BD

se for Programação Orientada a Objetos(OOP) estudar;

ESTRUTURAS COMPOSTAS
ESTRUTURA DE DADOS (XML)
MANIPULACAO DE DOM (PREFERENCIALMENTE XML)
HIERARQUIAS DE CLASSES PARALELAS

A OOP é especialmente recomendada para estruturas hieráquicas, sendo elas seriais ou paralelas.

Agora, analisando o problema, vc deve estar fazendo um trabalho para web, entao pergunto.

Seu clientes irão ver a hierarquia completa?
Muito provavelmente não. Faça um paginador.
A hierarquia completa vai ao infinito?
Se for não caberá na página. Faça um paginador.
A montagem será rápida o suficiente para valer a pena?
Talvez não. Faça um paginador.
E a primeira versão de seu sistema?
Faça um paginador. Entregue o sistema planeje as
as respostas p'ra pergunta acima e analise se valerá apena
um trabalho tão grande sem finalidade.

Se vale a pena, Passe pra uma versão futura.

A Microsoft com o Windows,
A Comunidade Com o Linux,
A Apple com e muitos outras
ainda não entregaram a versão final de seu sistemas.

Agora se é tudo isso que vc quer, uma versão final vc
precisa estudar mais, que é por este motivo que vc ainda
achou a solucao, falta conhecimento e nossos forums não lhe
ensinarão o que voce deve aprender em um banco de escola ou
auto-didata....

Persevere e conquiste.

VIVA A LIBERDADE
USE LINUX, BSD

DIVULGUE O USO DE SOFTWARE LIVRE SEM TERMOS TÉCNICOS









01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts