Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

matheusjas

Menu dinâmico com submenus com loop infinito

Recommended Posts

Boas meus amigos,

 

Sou novo no fórum e estou tentando criar um menu com vários filhos. Cheguei a criar um código (com erro), mas o perdi e cansei depois de inúmeras tentativas e decidi vim até vocês.

 

O menu será dinâmico vindo do banco de dados MySQL. A tabela menu contém os seguintes campos.

 

 

- ID_MENU;

- menu_parent; (onde ficará o ID do menu pai)

- menu_titulo;

- menu_link;

 

 

O menu_parent ficará salvo a ID do menu pai. Só que o menu poderá ter vários submenus um dentro do outro, por exemplo:

  •  

    • MENU
      • SUBMENU
        • SUBMENU2
          • SUBMENU3
            • e assim por diante
    • MENU2
      • SUBMENU
    • MENU3
    • MENU4

     

 

E assim segue de acordo com o modo que será criado o menu.

 

Como posso mostrar esse menu dentro das tags <ul></ul> e <li></li>? Se alguém já tiver feito ou já passou por isso, peço que me ajudem a resolver este pepino.

 

Muito obrigado a todos!

 

Obs: Lembrando, não tenho código desenvolvimento mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Amigo esta video aula pode lhe ajdudar com sua duvida...

 

 

http://videolog.tv/video?449777

 

Meu amigo, verifiquei a video aula que me enviou mas não é bem que eu preciso. Por exemplo, preciso que dentro dentro de um submenu tenha outro submenu e assim por diante, criando assim uma sequencia sem fim, de acordo com a quantidade de submenu cadastrado.

 

Segue o link para exemplo do menu: http://www.sistemas.hostar.com.br/wp/

 

No menu, no item SAMPLE PAGE tem uma sequencia de submenus, dê uma verificada.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem inumeras maneiras de fazer.

Vou fazer a mais prática e direta (do meu ponto de vista).

 

1 - Estrutura da tabela

CREATE TABLE `menu` (
  `codmenu` int(11) NOT NULL AUTO_INCREMENT,
  `codpai` int(11) DEFAULT NULL,
  `nome` varchar(100) DEFAULT NULL,
  `ordem` int(11) DEFAULT '0',
  PRIMARY KEY (`codmenu`),
  KEY `codpai` (`codpai`),
  CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`codpai`) REFERENCES `menu` (`codmenu`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

2 - Dados de testes

mysql> select * from menu;
+---------+--------+---------------------------+-------+
| codmenu | codpai | nome                      | ordem |
+---------+--------+---------------------------+-------+
|       1 |   NULL | pai                       |     1 |
|       2 |      1 | filho - 1                 |     1 |
|       3 |      1 | filho - 2                 |     2 |
|       4 |      1 | filho - 3                 |     3 |
|       5 |      4 | filho - filho - 1         |     1 |
|       6 |      4 | filho - filho - 2         |     2 |
|       7 |      4 | filho - filho - 3         |     3 |
|       8 |      7 | filho - filho - filho - 1 |     1 |
|       9 |      7 | filho - filho - filho - 2 |     2 |
+---------+--------+---------------------------+-------+

3 - Criando uma classe auxiliar, para que possamos usar cada registro como um item

/**
 * Classe que representa um item do menu
 *
 * @author Hugo Silva
 */
class MenuItem {
	/** @var int */
	public $codmenu;
	/** @var int */
	public $codpai;
	/** @var string */
	public $nome;
	/** @var int */
	public $ordem;
	/** @var array */
	public $filhos = array();
	
	/**
	 * Gera o HTML para o elemento.
	 *
	 * Também gera o html para cada filho, fazendo assim uma arvore
	 * correta para representação em HTML.
	 * @author Hugo Silva
	 * @return string
	 */
	public function getHtml(){
		$html = '<li><a href="#">' . $this->nome . '</a>';
		if(!empty($this->filhos)){
			$html .= '<ul>';
			foreach($this->filhos as $filho){
				$html .= $filho->getHtml();
			}
			$html .= '</ul>';
		}
		$html .= '</li>';
		
		return $html;
	}
}

4 - Consultando os dados e ordenando eles conforme a necessidade. Precisamos fazer com que os dados que estão no banco fiquem em forma hierárquica para podermos trabalhar com eles. Para isto, utilizaremos um array temporário para armazenar a lista indexada pelo código do menu.


$pdo = new PDO('mysql:dbname=testes;host=127.0.0.1','root','');

// seleciona os itens do menu
$rs = $pdo->query("SELECT * FROM menu ORDER BY ordem");
// lista temporaria
$menu_tmp = array();
// usando nossa classe
$rs->setFetchMode(PDO::FETCH_CLASS, 'MenuItem');
// para cada item do menu
while($row = $rs->fetch()){
	// colocamos na lista temporaria
	// indexando pelo codigo do menu
	$menu_tmp[ $row->codmenu ] = $row;
}

// agora que já temos a lista indexada,
// vamos colocar os "filhos dentro dos pais" :D
foreach($menu_tmp as $item){
	// se tiver codigo de pai
	if( !empty($item->codpai) ){
		// coloca na lista de filhos do pai indicado
		$menu_tmp[ $item->codpai ]->filhos[] = $item;
	}
}

// lista de menu final
$menu_final = array();
// agora que está tudo aninhado, vamos deixar
// somente os pais (os filhos não podem aparecer
// na raiz da nossa lista)
foreach($menu_tmp as $menu){
	if(empty($menu->codpai)){
		$menu_final[] = $menu;
	}
}

// exibindo o resultado
echo '<ul>';
foreach($menu_final as $menu){
	echo $menu->getHtml();
}
echo '</ul>';

@braços e fique com Deus!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao implementar o código e rodar, deu o seguinte erro:

 

Fatal error: Class 'PDO' not found in /home/sistemas/public_html/sis/nav.php on line 44

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, o erro que está mostrando é bem explicativo e não se trata do script, e sim da sua instalação do PHP.

Se está testando local, habilite a extensão PDO, bem como o driver PDO/MySQL.

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, o erro que está mostrando é bem explicativo e não se trata do script, e sim da sua instalação do PHP.

Se está testando local, habilite a extensão PDO, bem como o driver PDO/MySQL.

 

@braços

 

Estou rodando direto no servidor, como faço para habilitar essa extensão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Bom hufersil, a mensagem de erro já mudou. Pelo que entendi, não foi encontrado os drivers. Mas, não consegui identificar no link que passou para instalar os drivers, somente para usuários Windows que mostra as DLLs, você sabe como posso proceder?

 

 

Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in /home/sistemas/public_html/sis/nav.php:44 Stack trace: #0 /home/sistemas/public_html/sis/nav.php(44): PDO->__construct('mysql:dbname=si...', 'sistemas_sis', '0844341') #1 {main} thrown in /home/sistemas/public_html/sis/nav.php on line44

 

Obrigado!

 

@WDuante,

 

Eu já tentei essa solução, só que retorna erro no foreach e não consegui identificar qual erro era. Por isso desisti dessa solução e recorri a vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como postei acima, um tutorial do Matias Rezende deve resolver seu problema pois esta em mysqli

 

é só adaptar há sua necessidade.

 

http://ogordo.com/menu-com-submenus-infinitos-em-php-so-com-uma-consulta-ao-bd/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como postei acima, um tutorial do Matias Rezende deve resolver seu problema pois esta em mysqli

 

é só adaptar há sua necessidade.

 

http://ogordo.com/menu-com-submenus-infinitos-em-php-so-com-uma-consulta-ao-bd/

 

WDuarte,

 

Ao adaptar o código mudando somente a conexão, o nome da tabela e dos campos, retorna o seguinte erro:

 

  • Warning: Invalid argument supplied for foreach() in /home/sistemas/public_html/sis/menu.php on line 20

O código que contém na linha 20 é:

foreach( $menuTotal[$idPai] as $idMenu => $menuItem)
{
// imprime o item do menu
echo str_repeat( "\t" , $nivel + 1 ),'<li><a href="',$menuItem['link'],'">',$menuItem['name'],'</a>',PHP_EOL;
// se o menu desta iteração tiver submenus, chama novamente a função
if( isset( $menuTotal[$idMenu] ) ) imprimeMenuInfinito( $menuTotal , $idMenu , $nivel + 2);
// fecha o li do item do menu
echo str_repeat( "\t" , $nivel + 1 ),'</li>',PHP_EOL;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Windows users

  1. PDO and all the major drivers ship with PHP as shared extensions, and simply need to be activated by editing the php.ini file:

    extension=php_pdo.dll

     

    Nota
    :

    This step is not necessary for PHP 5.3 and above, as a DLL is no longer required for PDO.

     

  2. Next, choose the other database-specific DLL files and either use dl() to load them at runtime, or enable them in php.ini below php_pdo.dll. For example:

    extension=php_pdo.dllextension=php_pdo_firebird.dllextension=php_pdo_informix.dllextension=php_pdo_mssql.dllextension=php_pdo_mysql.dllextension=php_pdo_oci.dllextension=php_pdo_oci8.dllextension=php_pdo_odbc.dllextension=php_pdo_pgsql.dllextension=php_pdo_sqlite.dll  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, o meu problema está resolvido.

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem inumeras maneiras de fazer.

Vou fazer a mais prática e direta (do meu ponto de vista).

 

1 - Estrutura da tabela

CREATE TABLE `menu` (
  `codmenu` int(11) NOT NULL AUTO_INCREMENT,
  `codpai` int(11) DEFAULT NULL,
  `nome` varchar(100) DEFAULT NULL,
  `ordem` int(11) DEFAULT '0',
  PRIMARY KEY (`codmenu`),
  KEY `codpai` (`codpai`),
  CONSTRAINT `menu_ibfk_1` FOREIGN KEY (`codpai`) REFERENCES `menu` (`codmenu`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

2 - Dados de testes

mysql> select * from menu;
+---------+--------+---------------------------+-------+
| codmenu | codpai | nome                      | ordem |
+---------+--------+---------------------------+-------+
|       1 |   NULL | pai                       |     1 |
|       2 |      1 | filho - 1                 |     1 |
|       3 |      1 | filho - 2                 |     2 |
|       4 |      1 | filho - 3                 |     3 |
|       5 |      4 | filho - filho - 1         |     1 |
|       6 |      4 | filho - filho - 2         |     2 |
|       7 |      4 | filho - filho - 3         |     3 |
|       8 |      7 | filho - filho - filho - 1 |     1 |
|       9 |      7 | filho - filho - filho - 2 |     2 |
+---------+--------+---------------------------+-------+

3 - Criando uma classe auxiliar, para que possamos usar cada registro como um item

/**
 * Classe que representa um item do menu
 *
 * @author Hugo Silva
 */
class MenuItem {
	/** @var int */
	public $codmenu;
	/** @var int */
	public $codpai;
	/** @var string */
	public $nome;
	/** @var int */
	public $ordem;
	/** @var array */
	public $filhos = array();
	
	/**
	 * Gera o HTML para o elemento.
	 *
	 * Também gera o html para cada filho, fazendo assim uma arvore
	 * correta para representação em HTML.
	 * @author Hugo Silva
	 * @return string
	 */
	public function getHtml(){
		$html = '<li><a href="#">' . $this->nome . '</a>';
		if(!empty($this->filhos)){
			$html .= '<ul>';
			foreach($this->filhos as $filho){
				$html .= $filho->getHtml();
			}
			$html .= '</ul>';
		}
		$html .= '</li>';
		
		return $html;
	}
}

4 - Consultando os dados e ordenando eles conforme a necessidade. Precisamos fazer com que os dados que estão no banco fiquem em forma hierárquica para podermos trabalhar com eles. Para isto, utilizaremos um array temporário para armazenar a lista indexada pelo código do menu.


$pdo = new PDO('mysql:dbname=testes;host=127.0.0.1','root','');

// seleciona os itens do menu
$rs = $pdo->query("SELECT * FROM menu ORDER BY ordem");
// lista temporaria
$menu_tmp = array();
// usando nossa classe
$rs->setFetchMode(PDO::FETCH_CLASS, 'MenuItem');
// para cada item do menu
while($row = $rs->fetch()){
	// colocamos na lista temporaria
	// indexando pelo codigo do menu
	$menu_tmp[ $row->codmenu ] = $row;
}

// agora que já temos a lista indexada,
// vamos colocar os "filhos dentro dos pais" :D
foreach($menu_tmp as $item){
	// se tiver codigo de pai
	if( !empty($item->codpai) ){
		// coloca na lista de filhos do pai indicado
		$menu_tmp[ $item->codpai ]->filhos[] = $item;
	}
}

// lista de menu final
$menu_final = array();
// agora que está tudo aninhado, vamos deixar
// somente os pais (os filhos não podem aparecer
// na raiz da nossa lista)
foreach($menu_tmp as $menu){
	if(empty($menu->codpai)){
		$menu_final[] = $menu;
	}
}

// exibindo o resultado
echo '<ul>';
foreach($menu_final as $menu){
	echo $menu->getHtml();
}
echo '</ul>';

@braços e fique com Deus!

 

 

Acabei de fazer o cadastro aqui no fórum só mesmo para agradecer pela ajuda do amigo Hufersil.

 

Estava precisando só do input para poder iniciar os menus dinâmicos. Utilizei apenas os 2 foreach da estrutura e o restante adaptei ao projeto. como se tratava e um layout admin ainda tive que incluir classes para abertura automática dos submenus e classe active para dar destaque na pagina atual.

 

---

Menu

//=====================================================================================
//******************** INICIO MENU ****************************************************
	
	$itens = $mysqli->query("SELECT * FROM menu ORDER BY nivel ASC");

	$menu_tmp = array();
	$menu_final = array();

	while($ositens = $itens->fetch_object()){
			$menu_tmp[ $ositens->id ] = $ositens;
			if( ValidaArray($data, 1) == $ositens->link ){ $r = $ositens->nivel; } else { $r = ''; }
	}
	
	// Função de destaque da pagina aberta
	function pai($id,$menu_tmp){
		$id = $menu_tmp[$id]->nivel;
		return $id;
	}
	// While que trabalha com a função pai
	while($r != 0){
		$menu_tmp[ $r ] -> active = '1';
		$r = pai($r,$menu_tmp);		
	}

	foreach($menu_tmp as $item){
		if($item->nivel != 0){
			$menu_tmp[$item->nivel] -> filhos[] = $item;
		}
	}


	foreach($menu_tmp as $menu){
		if($menu->nivel == 0){
			$menu_final[] = $menu;
		}
	}
	
	$this->menu = $menu_final;
	
//******************** FIM MENU *******************************************************
//=====================================================================================

A função ValidaArray é uma função da minha estrutura que pega a variável da url, se a página for a index, então será este o valor que ela retorna

ValidaArray($data, 1)

--

E aqui para exibir o menu html

<?php					
					
// Função que gera o html do menu
function getHtml($object, $page){
	if(isset($object->active)){$ao = 'class="active open"';} else {$ao = '';}
	if($object->link == $page){$sa = 'class="start active"';} else {$sa = '';}
	if(isset($object->filhos)){
		$html = '<li '. $ao .'>';
			$html .= '<a href="javascript:;">'; // link do botão
				$html .= '<i class="'.$object->icone.'"></i>'; // icone do botão
				$html .= '<span class="title">'. $object->nome .'</span>'; // texto do botão
				$html .= '<span class="arrow "></span>'; // Texto barra rolagem
			$html .= '</a>';
			$html .= '<ul class="sub-menu">';
				foreach($object->filhos as $filho){
					$html .= getHtml($filho, $page);
				}
			$html .= '</ul>';
		$html .= '</li>';
	}else{
		$html = '<li '. $sa .'>';
			$html .= '<a href="'.URLPATH.'/intranet/'.$object->link.'">'; // link do botão
				$html .= '<i class="'.$object->icone.'"></i>'; // icone do botão
				$html .= '<span class="title">'. $object->nome .'</span>'; // texto do botão
			$html .= '</a>';
		$html .= '</li>';
	}
	
	return $html;
}
// Fim Função


//Gerador do menu
echo '<ul class="page-sidebar-menu " data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">';
foreach($this->menu as $menu){
	echo getHtml($menu, $this->page);
}
echo '</ul>';

?>

--

Quase esqueci a tabela

+----+-------+--------------+-----------+-----------+
| id | nivel | nome         | icone     | link      |
+----+-------+--------------+-----------+-----------+
|  1 |     0 | index        | icon-home | index     |
|  2 |     0 | sobre        | icon-home | sobre     |
|  3 |     0 | produtos     | icon-home | produtos  |
|  4 |     0 | serviços     | icon-home | servicos  |
|  5 |     0 | contato      | icon-home | contato   |
|  6 |     3 | produto 1    | icon-home | produto1  |
|  7 |     3 | produto 2    | icon-home | produto2  |
|  8 |     4 | serviço 1    | icon-home | servico1  |
|  9 |     4 | serviço 2    | icon-home | servico2  |
| 10 |     9 | serviço 2.1  | icon-home | servico21 |
| 11 |     9 | serviço 2.2  | icon-home | servico22 |
+----+-------+--------------+-----------+-----------+

Acabou um pouco bagunçado, mas é que acabei de terminar.

 

Té+

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Acabei de fazer o cadastro aqui no fórum só mesmo para agradecer pela ajuda do amigo Hufersil.

 

Estava precisando só do input para poder iniciar os menus dinâmicos. Utilizei apenas os 2 foreach da estrutura e o restante adaptei ao projeto. como se tratava e um layout admin ainda tive que incluir classes para abertura automática dos submenus e classe active para dar destaque na pagina atual.

 

---

Menu

//=====================================================================================
//******************** INICIO MENU ****************************************************
	
	$itens = $mysqli->query("SELECT * FROM menu ORDER BY nivel ASC");

	$menu_tmp = array();
	$menu_final = array();

	while($ositens = $itens->fetch_object()){
			$menu_tmp[ $ositens->id ] = $ositens;
			if( ValidaArray($data, 1) == $ositens->link ){ $r = $ositens->nivel; } else { $r = ''; }
	}
	
	// Função de destaque da pagina aberta
	function pai($id,$menu_tmp){
		$id = $menu_tmp[$id]->nivel;
		return $id;
	}
	// While que trabalha com a função pai
	while($r != 0){
		$menu_tmp[ $r ] -> active = '1';
		$r = pai($r,$menu_tmp);		
	}

	foreach($menu_tmp as $item){
		if($item->nivel != 0){
			$menu_tmp[$item->nivel] -> filhos[] = $item;
		}
	}


	foreach($menu_tmp as $menu){
		if($menu->nivel == 0){
			$menu_final[] = $menu;
		}
	}
	
	$this->menu = $menu_final;
	
//******************** FIM MENU *******************************************************
//=====================================================================================

A função ValidaArray é uma função da minha estrutura que pega a variável da url, se a página for a index, então será este o valor que ela retorna

ValidaArray($data, 1)

--

E aqui para exibir o menu html

<?php					
					
// Função que gera o html do menu
function getHtml($object, $page){
	if(isset($object->active)){$ao = 'class="active open"';} else {$ao = '';}
	if($object->link == $page){$sa = 'class="start active"';} else {$sa = '';}
	if(isset($object->filhos)){
		$html = '<li '. $ao .'>';
			$html .= '<a href="javascript:;">'; // link do botão
				$html .= '<i class="'.$object->icone.'"></i>'; // icone do botão
				$html .= '<span class="title">'. $object->nome .'</span>'; // texto do botão
				$html .= '<span class="arrow "></span>'; // Texto barra rolagem
			$html .= '</a>';
			$html .= '<ul class="sub-menu">';
				foreach($object->filhos as $filho){
					$html .= getHtml($filho, $page);
				}
			$html .= '</ul>';
		$html .= '</li>';
	}else{
		$html = '<li '. $sa .'>';
			$html .= '<a href="'.URLPATH.'/intranet/'.$object->link.'">'; // link do botão
				$html .= '<i class="'.$object->icone.'"></i>'; // icone do botão
				$html .= '<span class="title">'. $object->nome .'</span>'; // texto do botão
			$html .= '</a>';
		$html .= '</li>';
	}
	
	return $html;
}
// Fim Função


//Gerador do menu
echo '<ul class="page-sidebar-menu " data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200">';
foreach($this->menu as $menu){
	echo getHtml($menu, $this->page);
}
echo '</ul>';

?>

--

Quase esqueci a tabela

+----+-------+--------------+-----------+-----------+
| id | nivel | nome         | icone     | link      |
+----+-------+--------------+-----------+-----------+
|  1 |     0 | index        | icon-home | index     |
|  2 |     0 | sobre        | icon-home | sobre     |
|  3 |     0 | produtos     | icon-home | produtos  |
|  4 |     0 | serviços     | icon-home | servicos  |
|  5 |     0 | contato      | icon-home | contato   |
|  6 |     3 | produto 1    | icon-home | produto1  |
|  7 |     3 | produto 2    | icon-home | produto2  |
|  8 |     4 | serviço 1    | icon-home | servico1  |
|  9 |     4 | serviço 2    | icon-home | servico2  |
| 10 |     9 | serviço 2.1  | icon-home | servico21 |
| 11 |     9 | serviço 2.2  | icon-home | servico22 |
+----+-------+--------------+-----------+-----------+

Acabou um pouco bagunçado, mas é que acabei de terminar.

 

Té+

 

Olá, gostei do seu código. Teria como enviar as funções completas referente ao menu?

Como o exemplo que você deu do ValidaArray?

 

Obrigada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Olá, gostei do seu código. Teria como enviar as funções completas referente ao menu?

Como o exemplo que você deu do ValidaArray?

 

Obrigada!

 

Então, já fiz várias modificações. vou providenciar o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixei comentado no próprio código

O banco de dados está original exceto pela redução dos valores de nome e link para caber aqui sem deformar

 

===================================

 

BANCO DE DADOS: menuSite

BANCO DE DADOS: menuSite
|-------------------------------------------------------------------------|
| id | nivel |      nome      |  icone   |    link     | admlevel | ativo |
|-------------------------------------------------------------------------|
|  1 |   0   | Home           |          | index       |    0     |   1   | 
|  2 |   0   | Azul Virtual   |          |             |    0     |   1   | 
|  3 |   0   | Operações      |          |             |    0     |   1   | 
|  4 |   0   | Parceiros      |          |             |    0     |   1   | 
|  5 |   0   | Blog           |          |             |    0     |   1   | 
|  6 |   0   | Contate-nos    | icon-env | contatenos  |    0     |   1   | 
|  7 |   2   | Regulamento    |          | about       |    0     |   1   | 
|  8 |   2   | Nossa História |          | history     |    0     |   1   | 
|  9 |   2   | Nossa Equipe   |          | nossaequipe |    0     |   1   | 
| 10 |   2   | Tripulantes    |          | triplist    |    0     |   1   | 
| 11 |   2   | F.A.Q. Azul V. |          | faq         |    0     |   1   | 
| 12 |   2   | Processo Sel.  |          | processosel |    0     |   1   | 
| 13 |   2   | Intranet       | icon-pl  | intranet    |    0     |   1   | 
| 14 |   3   | Livemap        |          | livemap     |    0     |   1   | 
| 15 |   3   | Nossa Frota    |          | frota       |    0     |   1   | 
| 16 |   3   | Nossos Destino |          | rotas       |    0     |   1   | 
| 17 |   3   | Plano de Carr. |          | plano       |    0     |   1   | 
| 18 |   3   | Safety         |          | safety      |    0     |   1   | 
| 19 |   3   | Estatísticas   |          | estatistica |    0     |   1   | 
| 20 |   4   | Companhias V.  |          | ciasv       |    0     |   1   | 
| 21 |   4   | Sites Espec.   |          | sitesesp    |    0     |   1   | 
| 22 |   4   | Redes de voo   |          | redes       |    0     |   1   | 
| 23 |   5   | Em breve       |          | breve       |    0     |   1   | 
|-------------------------------------------------------------------------|

==========================================================================


// A variavel $data é devido meu site utilizar urls amigaveis eu desenvolvi esse procedimento para pegar o nome da página aberta.
// Ex: http://meusite.com.br/siteprincipal/index'>http://meusite.com.br/siteprincipal/index ----->>>> index é o nome da pagina atual
// portanto a função ValidaArray($data, 1) está armazenando o valor 'index'.
// no código abaixo a unica função dela(a função valida array) é identificar a pagina aberta para dar destaque no menu.

// $ositens->nivel é o nivel da estrutura de menus e não o nivel de permissão.
// nivel 0 são os primeiros itens a serem exibidos e se tiver um valor diferente de 0, significa que este nivel é filho de algum outro item, sendo esse valor a chave primaria do item pai.


//Função que trabalha a estrutura do menu
function menu_structure($mysqli,$data){

	$itens = $mysqli->query("SELECT * FROM menuSite WHERE nivel>=0 ORDER BY nivel ASC");

	$menu_tmp = array();
	$menu_final = array();
	$r = '';

	//Monta primeiro array de menu
	while($ositens = $itens->fetch_object()){
		$menu_tmp[ $ositens->id ] = $ositens;
		
		//Identificação de campo ativo
		if( ValidaArray($data, 1) == $ositens->link ){ $r = $ositens->nivel; }
	}
	
	// Função de destaque da pagina aberta
	function pai($id,$menu_tmp){
		$id = $menu_tmp[$id]->nivel;
		return $id;
	}
	// While que trabalha com a função pai
	while($r != 0){
		$menu_tmp[ $r ] -> active = '1';
		$r = pai($r,$menu_tmp);		
	}
	
	// Atribuição de campo com filhos
	foreach($menu_tmp as $item){
		if($item->nivel != 0){
			$menu_tmp[$item->nivel] -> filhos[] = $item;
		}
	}

	// Gerar menu final
	foreach($menu_tmp as $menu){
		if($menu->nivel == 0){
			$menu_final[] = $menu;
		}
	}
	
	return $menu_final;
}

//=================================================================================================
//=================================================================================================
//=================================================================================================

//*******
// A personalização dessa função deve ser intensa, pois vai depender da estrutura html e css do seu menu.
//*******

// URLPATH é o endereço do meu site: http://meusite.com.br
// $user->admlevel é o nivel de permissão de quem está acessando o site. Eu considerei 0 como usuário comum, 1 para moderador, 2 para administrador e 3 master.

//Função que gera o HTML do menu
// Parametros: Objeto contendo o menu principal / Objeto contendo informações do usuário / objeto contendo informações da pagina atual
function menu_html_forhomedesk($omenu, $user, $pagina){

	// Função que gera o html do menu
		function getHtml_forhomedesk($menu, $user, $page){
			
			// Nivel de permissão - e objeto ativo
			if($user->admlevel >= $menu->admlevel AND $menu->ativo == 1){
				if(isset($menu->filhos)){
				
					$html = '<li>';
						$html .= '<a>'; // link do botão
							if(isset($menu->icone)) { $html .= '<i class="'.$menu->icone.'"></i>'; } // icone do botão
							$html .= '<span>'. $menu->nome .'</span>'; // texto do botão
						$html .= '</a>';
						$html .= '<ul class="submenu">';
							foreach($menu->filhos as $filho){
								$html .= getHtml_forhomedesk($filho, $user, $page);
							}
						$html .= '</ul>';
					$html .= '</li>';
					
				}else{
					$html = '<li>';
						$html .= '<a href="'.URLPATH.'/index/'. $menu->link.'">'; // link do botão
							if(isset($menu->icone)) { $html .= '<i class="'.$menu->icone.'"></i>'; } // icone do botão
							$html .= '<span>'. $menu->nome .'</span>'; // texto do botão
						$html .= '</a>';
					$html .= '</li>';					
				}
			}else{$html = '';}
			
			return $html;
		}
		// Fim Função
	
		
		//Gerador do menu
		$html = '<ul class="menu">';

		foreach($omenu as $menu_c){
			$html .= getHtml_forhomedesk($menu_c, $user, $pagina);
		}
		$html .= '</ul>';
		
		return $html; // Pronto, basta imprimir isso na sua página.
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.