DevSecOps

18 dez, 2007

Breadcrumb Navigation: Navegação em Categorias

Publicidade

Quando você visualiza um produto num site qualquer, como o Mercado Livre, normalmente lhe é mostrado algo como:

Informática -> Notebooks e Laptops -> AMD Turion 64 X2 -> HP e Compaq -> HP TX1119us

Isto diz, para o usuário, que ele está visualizando um Notebook com processador AMD Turion 64 X2 dos fabricantes HP e Compaq e com modelo HP TX1119us. Instintivamente, se o usuário quiser ver todos os notebooks com este processador, independente de marca, ele clicará no link que está escrito o nome do processador. Da mesma forma, se quiser ver todos os modelos de notebooks HP ou Compaq, clicará no link correspondente.

Como Fazer

Como todo script que percorrerá um número indefinido de níveis de hierarquia, existem duas possibilidades: fazê-lo recursivamente ou iterativamente. No artigo citado acima, utilizei um codigo recursivo. Para ser mais didático e democrático, dessa vez preferi utilizar um código iterativo.

Eis o código comentado:

<?php
#Resgata o valor da categoria passada pela query string
$cat = isset( $_GET['cat'] ) ? abs( intval( $_GET['cat'] ) ) : '1';
#Array que conterá o breadcrumb
$breadcrumb = array();
#Inclui o arquivo de abstração de banco de dados
require_once( 'class.bd.php' );
#Cria o objeto que manipulará o BD
$bd = new bd();
#Query SQL para resgatar os dados da categoria passada pela query string
$sql = 'select * from locais where ativo=\'S\' and id='.$cat;
#Executa a query SQL
$query = $bd->query( $sql );
#Se a categoria passada não existir
if ( $bd->num_rows( $query ) == 0 ) {
    #Assume que a categoria será a padrão (default)
    $cat = 1;
    $breadcrumb[] = array( 'titulo' => 'Raiz', 'id' => $cat );
}
#Se não é a categoria padrão
if ( $cat != 1 ) {
    #Resgata os dados da categoria
    $campos = $bd->fetch_assoc( $query );
    #Faça
    do {
        #Adiciona ao array breadcrumb os dados
        $breadcrumb[] = $campos;
        #Query SQL para resgatar os dados da categoria pai
        $sql = 'select * from locais where ativo = \'S\' and id = (select id_pai from locais where id = '.$campos['id'].')';
        #Executa a Query SQL
        $query = $bd->query( $sql );
        #Resgata os dados da categoria pai
        $campos = $bd->fetch_assoc( $query );
    #Enquanto o número de linhas for diferente de 0
    } while ( $bd->num_rows( $query ) != 0 );
}
#Inverte o array breadcrumb
$breadcrumb = array_reverse( $breadcrumb );
#Iniciliza a variável de saída
$saida = '';
#Percorre todos os itens do breadcrumb
foreach( $breadcrumb as $chave => $dados ) {
    #Monta a string de saída
    $saida .= '<a href="?cat='.$dados['id'].'" title="'.$dados['titulo'].'">'.$dados['titulo'].'</a> » ';
}
#Remove de $saida o elemento separados
$saida = substr( $saida, 0, -3 );
#Exibe a saida
echo 'Você está em: '.$saida;
?>

Como é de praxe, para utilizar os meus códigos normalmente você precisará fazer adaptações: tabelas e campos do banco de dados, strings de conexão, css, html, etc.

Grande abraços!