Criar menu dinamico

Utiliza javascript, vasta procurares no google que tens montes de tutorials para te ajudar!

Alguma duvida que tenhas pergunta aqui...
 
basta fazeres uma query...obteres tudo o que queres na base de dados e ordenares/formatares como queres...

se tens dúvidas específicas posta

cumps ;)
 
basta fazeres uma query...obteres tudo o que queres na base de dados e ordenares/formatares como queres...

se tens dúvidas específicas posta

cumps ;)

O problema e que eu nao consigo imaginar compor exemplo, tiro la 3 opções do sub menu, crio, mas se forem 4, eu nao estou a conseguir imaginar o codigo.
 
Se forem só menus (sem sub menus) é simples. Como te disseram lês tudo. Depois, para cada registo (e cada registo tem o nome e o link) com um ciclo vais imprimir codigo:
equanto (houver registos) {
imprimir "<a href=$link>$menu</a>";
}

Se for com submenos arranjas mais dois campos na tabela: ID, IDPai. Atrvés de funções recrussivas e com javascript ou mesmo php chegas lá. Tornas o que está em cima numa funçao com um parametro. A primeira vez que a chamas vai com o parametro de idpai = 0 (menus principais) e dentro de cada volta do ciclo voltas a chamar a mesma funçao mas o parametro vai ser o o id do proprio.
Isto fica facilitado com hash mas isso tinha de voltar a ver como funiona. Como são só menus os queries à DB são poucos e leves mas é sempre bom fazer o minimo possivel pois nunca sabes quantos lá vao estar.

Código:
funcao menu(idpai) {
     $resultado = dbquery("selecciona todos de menu onde IDPai = 'idpai'"); //vais ler os menus e guarda-los em $resultado

     enquanto ($registos = $resultado) { //vais precorrer os menus
          imprimir "<a href=$registo['link']>$registo['menu']</a>"; //vais imprimi-los
          menu($registo['id']); //vais voltar a fazer isto tudo [B]mas[/B] para o idpai != 0, neste caso vai ler todos cujo o idpai na tabela seja o id do menu actual
     }
}

menu(0);
Isto é pseudo-codigo/algorito simples. Há mais para tornar isto mais eficiente e tudo isso.

exemplo:

tens a tebela:
id - idp - menu
1 - 0 - musica
2 - 0 - filmes
3 - 1 - rock
4 - 1 - blues
5 - 2 - accao
6 - 2 - comedia

vamos chamar a menu() passado 0:
menu(0);

a primeira coisa que faz é imprimir: <a>musica</a>;

Mas quando imprime isso volta a chamar a menu(), desta vez com 1 pois 1 é o id de registo "musica", entao:
menu(1);

Desta vez a primeira coisa que ele imprime é: <a>rock</a>; porque rock tem como idpai 1. Seguindo a mesma logico ele agora devia chamar outra vez a menu(). E chama com 3 mas como nao há registos cujo idpai = 3 ele nao vai imprimir nada. Então vai imprimir: <a>blues</a>; pois é o segundo registo e ultimo cujo idpai = 1.
E voltamos ao primeiro ciclo. Desta vez vai imprimir: <a>filmes</a>; que é o segundo registo de quando idpai = 0.
A coisa repetece para accao e comedia.


É confuso, sim, mas é util e "universal". Podes ter quantos menus e submenus que quiseres.
 
Última edição:
Se forem só menus (sem sub menus) é simples. Como te disseram lês tudo. Depois, para cada registo (e cada registo tem o nome e o link) com um ciclo vais imprimir codigo:
equanto (houver registos) {
imprimir "<a href=$link>$menu</a>";
}

Se for com submenos arranjas mais dois campos na tabela: ID, IDPai. Atrvés de funções recrussivas e com javascript ou mesmo php chegas lá. Tornas o que está em cima numa funçao com um parametro. A primeira vez que a chamas vai com o parametro de idpai = 0 (menus principais) e dentro de cada volta do ciclo voltas a chamar a mesma funçao mas o parametro vai ser o o id do proprio.
Isto fica facilitado com hash mas isso tinha de voltar a ver como funiona. Como são só menus os queries à DB são poucos e leves mas é sempre bom fazer o minimo possivel pois nunca sabes quantos lá vao estar.

Código:
funcao menu(idpai) {
     $resultado = dbquery("selecciona todos de menu onde IDPai = 'idpai'"); //vais ler os menus e guarda-los em $resultado

     enquanto ($registos = $resultado) { //vais precorrer os menus
          imprimir "<a href=$registo['link']>$registo['menu']</a>"; //vais imprimi-los
          menu($registo['id']); //vais voltar a fazer isto tudo [B]mas[/B] para o idpai != 0, neste caso vai ler todos cujo o idpai na tabela seja o id do menu actual
     }
}

menu(0);
Isto é pseudo-codigo/algorito simples. Há mais para tornar isto mais eficiente e tudo isso.

exemplo:

tens a tebela:
id - idp - menu
1 - 0 - musica
2 - 0 - filmes
3 - 1 - rock
4 - 1 - blues
5 - 2 - accao
6 - 2 - comedia

vamos chamar a menu() passado 0:
menu(0);

a primeira coisa que faz é imprimir: <a>musica</a>;

Mas quando imprime isso volta a chamar a menu(), desta vez com 1 pois 1 é o id de registo "musica", entao:
menu(1);

Desta vez a primeira coisa que ele imprime é: <a>rock</a>; porque rock tem como idpai 1. Seguindo a mesma logico ele agora devia chamar outra vez a menu(). E chama com 3 mas como nao há registos cujo idpai = 3 ele nao vai imprimir nada. Então vai imprimir: <a>blues</a>; pois é o segundo registo e ultimo cujo idpai = 1.
E voltamos ao primeiro ciclo. Desta vez vai imprimir: <a>filmes</a>; que é o segundo registo de quando idpai = 0.
A coisa repetece para accao e comedia.


É confuso, sim, mas é util e "universal". Podes ter quantos menus e submenus que quiseres.

Obrigado.
 
Fiz uma coisa em php que funciona bem com isso. Se precisares, diz.

EDIT: e que só faz um query à base de dados. Ou seja, é leve.
 
PHP:
mysql_connect("localhost","root"); mysql_select_db("menu");
$res = mysql_query("select * from menu"); $ci = 0;
while ($rows = mysql_fetch_array($res)) {
    $menu[$ci] = $rows;
    $ci++;
}

function menu($pai,$menu) {
    $ci = 0;
    echo "<ul>\r\n";
    while ($ci >= 0) {
        if ($menu[$ci]['id'] != "" && $menu[$ci]['id'] != null) {
            if ($menu[$ci]['idpai'] == $pai) {
                echo "<li>"; echo $menu[$ci]['menu']; echo "</li>\r\n";
                menu($menu[$ci]['id'],$menu);
            }
            $ci++;
        }
        else $ci = -1;
    }
    echo "</ul>\r\n";
}
menu("0",$menu);


Agora é só adaptadres isso à tua base de dados. Depois com uns css personalizas esses botoes todos.
Se a tabela se chamar menu e tiver os campos "id", "idpai" e "menu" só precisares de alterar alterar o mysql_select_db para o nome da tua base de dados. E se tiveres a base de dados com password ou utilizador diferentes também tens de corrigir isso no mysql_connect.

Faz é uma coisa: o campo "id" e "idpai" são inteiros e o "id" alem de PK é AI. Todos os campos são nao nulos.

Depois disto é so adicionares um registo do genero:
1; 0; musica;
2; 1; rock;

Tens o menu rock dentro do musica. Começa com o id em 1 e não em 0. Já nao me lembro porque (lol) mas faz isso. Ah, tem a ver com o idpai. O idpai = 0 quer dizer que está no inicio do menu
 
PHP:
mysql_connect("localhost","root"); mysql_select_db("menu");
$res = mysql_query("select * from menu"); $ci = 0;
while ($rows = mysql_fetch_array($res)) {
    $menu[$ci] = $rows;
    $ci++;
}

function menu($pai,$menu) {
    $ci = 0;
    echo "<ul>\r\n";
    while ($ci >= 0) {
        if ($menu[$ci]['id'] != "" && $menu[$ci]['id'] != null) {
            if ($menu[$ci]['idpai'] == $pai) {
                echo "<li>"; echo $menu[$ci]['menu']; echo "</li>\r\n";
                menu($menu[$ci]['id'],$menu);
            }
            $ci++;
        }
        else $ci = -1;
    }
    echo "</ul>\r\n";
}
menu("0",$menu);
Agora é só adaptadres isso à tua base de dados. Depois com uns css personalizas esses botoes todos.
Se a tabela se chamar menu e tiver os campos "id", "idpai" e "menu" só precisares de alterar alterar o mysql_select_db para o nome da tua base de dados. E se tiveres a base de dados com password ou utilizador diferentes também tens de corrigir isso no mysql_connect.

Faz é uma coisa: o campo "id" e "idpai" são inteiros e o "id" alem de PK é AI. Todos os campos são nao nulos.

Depois disto é so adicionares um registo do genero:
1; 0; musica;
2; 1; rock;

Tens o menu rock dentro do musica. Começa com o id em 1 e não em 0. Já nao me lembro porque (lol) mas faz isso. Ah, tem a ver com o idpai. O idpai = 0 quer dizer que está no inicio do menu
Ok obrigado
deu muito jeito.
 
Com o menu dinâmico, eu crio as ligações para uma nova pagina, mas com eu vou fazer para nova pagina ser a pagina corresponde-te a opção do menu dinâmico. Eu estava a pensar usar Cookies mas não sei se é a melhor escolha?
 
Back
Topo