Fazer um menu com vários níveis. BD + PHP + JS + CSS

Posted by micox at Fevereiro 7th, 2008

Ae pessoal,

Há um tempo eu tinha criado um esquema e função PHP pra gerar um UL-LI para fazer um menu tipo pai e filhos, sendo que a quantidade de filhos e netos poderia ser infinita.

Hoje deu vontade de sair um pouco do javascript de sempre e postar essa parada aqui no blog. Desde a organização da tabela no Banco de Dados, função PHP pra gerar os UL-LI e finalizando com links pra estilizar este menu UL-LI.

Lá vai:

1) Para o menu (pai e filhos) será necessário apenas 1 tabela com o nome de ‘menus’. Só executar a seguinte SQL no Banco de dados:

CREATE TABLE `menus` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`pai_id` tinyint(3) unsigned NOT NULL default '0',
`ordem` tinyint(3) unsigned NOT NULL default '0',
`visivel` tinyint(3) unsigned NOT NULL default '1',
`nome` varchar(30) NOT NULL default '',
`link` varchar(150) default NULL,
PRIMARY KEY (`id`),
KEY `pai_id` (`pai_id`,`ordem`,`visivel`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT

O SQL acima manda criar uma tabela chamada ‘menus’ onde o truque está no campo pai_id.

Em cada registro, o campo pai_id irá apontar para o ID de outro registro na mesma tabela, indicando que ele é o seu pai.
Se a entrada não tiver pai, o campo pai_id deve ficar com 0 (zero).

Image Hosted by ImageShack.us - “Ó PÓOOOOI!!”

2) Preencha sua tabela lembrando de colocar visivel=1 para os menus que quer que sejam visíveis e colocando a ordem de cada menu.
O campo pai_id indica qual o ID do menu pai, se ele for um menu principal (pai) sem outro pai, este campo deve ficar com ‘0′.

Exemplo pra fazer o submenu:

comidas
- arroz
- feijao
guloseimas
- chocolate
- maquindonalds
---- sanduiche porco
---- sanduiche pequeno

Teremos:

comidas (pai_id=0)
- arroz (pai_id = id do 'comidas')
- feijao (pai_id = id do 'comidas')
guloseimas (pai_id=0)
- chocolate (pai_id = id do 'guloseimas')
- maquindonalds (pai_id = id do 'guloseimas')
---- sanduiche porco (pai_id = id do 'maquindonalds')
---- sanduiche pequeno (pai_id = id do 'maquindonalds')

3) Adicione a seguinte função à sua biblioteca de funções (você já tem que estar conectado ao bd antes de usar esta função né?):

function gera_menu($cod_ul_pai,$tabs,$id_do_pai){
    //gera um menu ul com submenus
    //by Micox - elmicox.blogspot.com - forum.ievolutionweb.com
    //exemplo: gera_menu("<ul>","    ",0)
    $recc = mysql_query("SELECT * FROM menus WHERE pai_id=$id_do_pai AND visivel=1 ORDER BY ordem");
    $ret = $cod_ul_pai."\r\n";
    if($recc==true){
        while($linha = mysql_fetch_array($recc,MYSQL_ASSOC)){
            if(isset($linha['link'])){
                $href = $linha['link'];
            }else{
                $href = '';
            }
            $ret .= $tabs."    <li><a href='$href'>".htmlentities($linha['nome'])."</a>";
            //testando se tem filhos
                $recfilho = mysql_query("SELECT * FROM menus WHERE pai_id=$linha[id] AND visivel=1 ORDER BY ordem");
                if(mysql_num_rows($recfilho)>0){
                    $ret .= "\r\n".$tabs."        ".gera_menu("<ul>",$tabs."        ",$linha['id'])."    ".$tabs;
                }
            //fim filhos
            $ret .= "</li>\r\n";
        }
    }
    $ret .= $tabs."</ul>\r\n";
    mysql_free_result($recc);
    return $ret;
}

4) Chame a função onde vc quer que gere o menu:

<?php echo gera_menu("<ul>","        ",0) ?>

5) Isso aí irá gerar um menu como este exemplo:

<ul>
  <li><a href='produtos.php?text=3'>Produtos e Serviços</a>
    <ul>
      <li><a href='produtos.php?Gravadores_Monolinha&cat=1&text=14'>Gravadores Monolinha</a></li>
      <li><a href='produtos.php?Gravadores_Multilinha&cat=2&text=15'>Gravadores Multilinha</a></li>
      <li><a href='produtos.php?Outros_produtos&cat=3&text=16'>Outros produtos</a></li>
    </ul>
  </li>
  <li><a href='conteudo.php?Revendas&text=4'>Revendas</a>
    <ul>
      <li><a href='conteudo.php?Brasil&text=17'>Brasil</a></li>
      <li><a href='conteudo.php?Internacional&text=18'>Internacional</a></li>
      <li><a href='conteudo.php?Seja_um_revendedor&text=19'>Seja um revendedor</a></li>
    </ul>
  </li>
  <li><a href='conteudo.php?Clientes&text=5'>Clientes</a></li>
  <li><a href='conteudo.php?Suporte&text=6'>Suporte</a></li>
</ul>

6) Pronto, agora é só estilizar com algum tutorial de menu, treemenu (menu em árvore), menu drop down horizontal, vertical, etc.

Té. Dúvidas, pergunta lá no fórum :)

Posted in funções, menus, php| 6 Comments | 

geraOptions - populando selects com praticidade - PHP

Posted by micox at Setembro 20th, 2007

Hoeeepáa

Bom, sabe toooda aquela burocracia que agente faz tooooda vez que vai gerar um select-option via PHP?

Pois é, vai parecer óbvio pra maioria dos meus leitores, mas pode ser de ajuda pra alguns: que tal reduzir esta complexidade em apenas uma funçãozinha simples pra chamar rapidamente e não ter que ficar se preocupando com executar a SQL, fazer o while do recordset, fazer o IF pra ver qual option vai ter o selected, etc??

Acredite: isto facilita pra caramba. Reduz a complexidade e o tamanho do código.

A função que gera os options. Guarde em sua biblioteca de funções:


function geraOptions($sql,$campo_valor,$campo_label,$valor_selecionado,$tabs='    '){
//by Nairon JCG - Micox - elmicox.blogspot.com - micoxjcg@yahoo.com.br - 12/01/07

    $reca = mysql_query($sql);
    $opts = "\r\n";
    if($reca){
        while($row = mysql_fetch_assoc($reca)){
        if($row[$campo_valor]==$valor_selecionado){
        $selected = "selected='selected'";
        }else{
        $selected = "";
        }
            $opts .= $tabs."    \r\n”;
        }
    }
    return $opts;
}

$sql - é a sql pra gerar os options
$campo_valor - o campo na sua tabela do BD que irá doar os valores para os VALUES dos options.
$campo_label - o campo na sua tabela do BD que irá doar os valores para os TEXTOS dos options.
$valor_selecionado - Se tal option tiver o value igual ao $valor_selectionado, ele ficará com selected=selected
$tabs - pra deixar seu código fonte que será gerado mais bonitim…

Exemplo de uso:


echo "<select id='estado' name='estado'>";
    echo geraOptions('SELECT * FROM estados','id_estado','nome_estado',$cod_estado_cliente,'    ');
echo "</select>";

Dúvidas?

PS.:Esta é mais uma funçãozinha que eu tinha feito e esquecido de postar. Como este blog é minha ‘guardadora’ de funções pessoais, esta não podia ficar de fora né? hehe

Posted in funções, php| No Comments | 

Função limpa texto pra virar URL

Posted by micox at Setembro 20th, 2007

Ó, esta é pra quem não frequenta o fórum e o portal iEvolution, afinal quem já frequenta, já viu ela em uso.

Hoje mostro uma função PHP pra variar um pouco né? Ficar só sempre no JavaScript aqui no blog deve ser meio chato pra muitos de vocês. Lets go.

Muitas vezes, principalmente quando estamos trabalhando para deixar nossas url’s amigáveis (aqui outros exemplos de friendly url) nos deparamos com alguns links nossos gerados a partir de banco de dados que contém: acentos, cedilha, pontuações, etc.

Isso em um link pode dar boró né?

O wordpress e o blogger têm suas próprias funções pra isto muito mal feitas. Elas desrespeitam nossa beeela língua (hehe) e simplesmente removem os caracteres que têm acento. O que? Acha que isto não dá problema? Lembre-se que "quem tem céu, tem medo".

Pra resorver este póbrema o mico aqui tentou fazer uma funçãozinha.

Função que gera uma texto limpo pra virar URL:

  • limpa acentos e transforma em letra normal
  • limpa cedilha e transforma em c normal, o mesmo com o ñ
  • transforma espaços em hífen (-) (chama hífen mesmo né?)
  • tira caracteres invalidos e pontuações

Por exemplo, temos o texto "O cabeçudo & a máfia é ônti. O cabeçudo & a máfia é ônti.htm"

Que queremos que vire a url "o-cabecudo-a-mafia-e-onti-o-cabecudo-a-mafia-e-onti.htm"

1) Pegue esta minha função

function geraUrlLimpa($texto){
    /* função que gera uma texto limpo pra virar URL:
       - limpa acentos e transforma em letra normal
       - limpa cedilha e transforma em c normal, o mesmo com o ñ
       - transforma espaços em hífen(-)
       - tira caracteres invalidos
      by Micox - elmicox.blogspot.com - www.ievolutionweb.com
    */
    //desconvertendo do padrão entitie (tipo á para á)
    $texto = html_entity_decode($texto);
    //tirando os acentos
    $texto = eregi_replace('[aáàãâä]','a',$texto);
    $texto = eregi_replace('[eéèêë]','e',$texto);
    $texto = eregi_replace('[iíìîï]','i',$texto);
    $texto = eregi_replace('[oóòõôö]','o',$texto);
    $texto = eregi_replace('[uúùûü]','u',$texto);
    //parte que tira o cedilha e o ñ
    $texto = eregi_replace('[ç]','c',$texto);
    $texto = eregi_replace('[ñ]','n',$texto);
    //trocando espaço em branco por underline
    $texto = eregi_replace('( )','-',$texto);
    //tirando outros caracteres invalidos
    $texto = eregi_replace('[^a-z0-9\-]','',$texto);
    //trocando duplo espaço (underline) por 1 underline só
    $texto = eregi_replace('--','-',$texto);

    return strtolower($texto);
}

2) Use a danada

$tes = "O cabeçudo & a máfia é ônti. O cabeçudo & a máfia é ônti.htm";
  $tes = geraUrlLimpa($tes)."html";
  echo $tes."“;
  //irá gerar o-cabecudo-a-mafia-e-onti-o-cabecudo-a-mafia-e-onti.html

 

Se alguém quiser corrigir o wordpress usando minha função e linkar pro pessoal saber como implantar a modificação, acho que será de grande ajuda para os users do wordpress não terem mais medo de dar o céu aos outros heheh.

Dúvidas, pergunta lá no tópico do fórum ok?

Posted in funções, php| 3 Comments |