Criar Menu Dinamicamente - Scriptcase 8

Olá pessoal,

Primeiro, Feliz Ano Novo para toda a galera do Fórum Scriptcase. Bom, enconrei um post (www.scriptcase.com.br/tutoriais/menu-dinamico/#main) na internet que mostra como montar um menu dinamicamente. Bom, eu alterei as consultas implementando de acordo com minha base de dados. Bom, já vi que as consultas estão retornando resultado, mas ainda assim não mona meu menu. Alguém poderia me dar uma luz? Segue os dados abaixo abaixo:

TABELA MÓDULOS: a000_modulos

CREATE TABLE a000_modulos (
ID INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
TIPO INTEGER(11) DEFAULT NULL COMMENT ‘Receberá o ID da tabela quando o campo NOME for filho de outro registro’,
NOME VARCHAR(100) COLLATE utf8_general_ci NOT NULL,
NOMEARQUIVO VARCHAR(100) COLLATE utf8_general_ci DEFAULT NULL,
ORDEM INTEGER(11) NOT NULL DEFAULT 0,
PRIMARY KEY USING BTREE (ID),
UNIQUE KEY a000_modulos_idx1 USING BTREE (TIPO, NOME)
) ENGINE=InnoDB;

TABELA PERMISSÃO: a029_permissoes

CREATE TABLE a029_permissoes (
ID INTEGER(11) UNSIGNED NOT NULL AUTO_INCREMENT,
IDPERFIL INTEGER(11) UNSIGNED NOT NULL,
IDMODULO INTEGER(11) UNSIGNED NOT NULL,
INCLUIR INTEGER(11) NOT NULL DEFAULT 0,
ALTERAR INTEGER(11) NOT NULL DEFAULT 0,
EXCLUIR INTEGER(11) NOT NULL DEFAULT 0,
FILTRAR INTEGER(11) NOT NULL DEFAULT 0,
EXPORTAR INTEGER(11) NOT NULL DEFAULT 0,
ATIVAR INTEGER(11) DEFAULT 0,
PRIMARY KEY USING BTREE (ID),
KEY IDPERFIL USING BTREE (IDPERFIL),
KEY IDMODULO USING BTREE (IDMODULO),
CONSTRAINT a029_itensmenu_fk1 FOREIGN KEY (IDPERFIL) REFERENCES a001_perfis (ID),
CONSTRAINT a029_itensmenu_fk2 FOREIGN KEY (IDMODULO) REFERENCES a000_modulos (ID)
) ENGINE=InnoDB;

CÓDIGO DO MENU NO EVENTO ONLOAD

sc_appmenu_reset(mcr14);
sc_appmenu_create(mcr14);

$sql1 = "SELECT ID, NOME FROM a000_modulos
WHERE NOMEARQUIVO IS NULL OR NOMEARQUIVO = ‘’; ";

sc_lookup(dsmodulos, $sql1);

foreach({dsmodulos} as $arr_modulo)
{

sc_appmenu_add_item(mcr14,'item_'.$arr_modulo[0],, $arr_modulo[1],mcr14_2,catid=$arr_modulo[0];catname=$arr_modulo[1], , , );

$sql2 = "SELECT A.ID, B.NOME, B.NOMEARQUIVO, A.IDPERFIL, A.IDMODULO
		 FROM a029_permissoes A
		 INNER JOIN a000_modulos B ON (B.ID = A.IDMODULO)
		 WHERE A.IDMODULO = ".$arr_modulo[0]." AND A.IDPERFIL = 1 AND A.ATIVAR = 1; ";

sc_lookup(dspermissao,$sql2);

if(!empty({dspermissao}))
foreach({dspermissao} as $arr_permissao)
{
sc_appmenu_add_item('mcr14','item_'.$arr_modulo[0].$arr_permissao[0],'item_'.$arr_modulo[0], $arr_permissao[1],mcr14_1,prodid=$arr_permissao[0], , , );
}

};

Alterei para esse outro modelo, bem mais simples, baseado nesse vídeo https://www.youtube.com/watch?v=i-UMyg_hpQI. Embora tenha criado o menu, não criou subitens, todos ficaram como itens.

sc_appmenu_reset(menu);
sc_appmenu_create(menu);

$sql = "SELECT A.ID, B.NOME, B.NOMEARQUIVO, A.IDPERFIL, A.IDMODULO
FROM a029_permissoes A
INNER JOIN a000_modulos B ON (B.ID = A.IDMODULO)
WHERE A.ATIVAR = 1 AND A.IDPERFIL = 1; ";

sc_lookup(dsmenu, $sql);

foreach({dsmenu} as $arr_menu)
{
$id_item = ‘item_’.$arr_menu[0];

if($arr_menu[1] == 0)
{
	$id_parent = '';
} else
	{
		$id_parent = 'item_'.$arr_menu[1];
	}

sc_appmenu_add_item(
	'menu',
	$id_item,
	$id_parent,
	$arr_menu[1],
	$arr_menu[2],
	"", "", "", ""
	);

};

Retornei ao código do primeiro post e consegui montar os Itens mas, os subitens só oram montados no primeiro item. O que está faltando?

sc_appmenu_reset(menu);
sc_appmenu_create(menu);

$sql1 = "SELECT ID, NOME FROM a000_modulos
WHERE TIPO IS NULL AND (NOMEARQUIVO IS NULL OR NOMEARQUIVO = ‘’)
ORDER BY ORDEM; ";

sc_lookup(dsmodulos, $sql1);

foreach({dsmodulos} as $arr_modulo)
{

sc_appmenu_add_item('menu','item_'.$arr_modulo[0],, $arr_modulo[1],'',catid=$arr_modulo[0];catname=$arr_modulo[1], , , );

$sql2 = "SELECT A.ID, B.NOME, B.NOMEARQUIVO, A.IDPERFIL, A.IDMODULO
		 FROM a029_permissoes A
		 INNER JOIN a000_modulos B ON (B.ID = A.IDMODULO)
		 WHERE B.TIPO = ".$arr_modulo[0]." AND A.IDPERFIL = 1 AND A.ATIVAR = 1
		 ORDER BY B.ORDEM; ";

echo $sql2. "<br />";

sc_lookup(dspermissao,$sql2);

if(!empty({dspermissao}))
foreach({dspermissao} as $arr_permissao)
{
sc_appmenu_add_item('menu',
					'item_'.$arr_modulo[0].$arr_permissao[0],
					'item_'.$arr_modulo[0],
					$arr_permissao[1],
					$arr_permissao[2],
					prodid=$arr_permissao[0],
					"", "", "");
}

};

Consegui montar o menu. Meu código final ficou como abaixo, a questão agora é só criar o item de saída.

sc_appmenu_reset(menu); sc_appmenu_create(menu); $perfil = [vlPerfil];

$sql1 = "SELECT ID, NOME FROM a000_modulos
WHERE TIPO IS NULL AND (NOMEARQUIVO IS NULL OR NOMEARQUIVO = ‘’)
AND ID IN (SELECT DISTINCT TIPO
FROM a029_permissoes
WHERE IDPERFIL = $perfil AND ATIVAR = 1)
ORDER BY ORDEM; ";

sc_lookup(dsmodulos, $sql1);

foreach({dsmodulos} as $arr_modulo)
{

sc_appmenu_add_item('menu','item_'.$arr_modulo[0],, $arr_modulo[1],'',catid=$arr_modulo[0];catname=$arr_modulo[1], , , );

$sql2 = "SELECT A.ID, B.NOME, B.NOMEARQUIVO, A.IDPERFIL, A.IDMODULO
		 FROM a029_permissoes A
		 INNER JOIN a000_modulos B ON (B.ID = A.IDMODULO)
		 WHERE B.TIPO = ".$arr_modulo[0]." AND A.IDPERFIL = $perfil AND A.ATIVAR = 1
		 ORDER BY B.ORDEM; ";

sc_lookup(dspermissao,$sql2);

if(!empty({dspermissao}))
foreach({dspermissao} as $arr_permissao)
{
	sc_appmenu_add_item('menu',
						'item_'.$arr_modulo[0].$arr_permissao[0],
						'item_'.$arr_modulo[0],
						$arr_permissao[1],
						$arr_permissao[2],
						prodid=$arr_permissao[0],
						"", "", "");
};

};

Galera, estou adicionando essa linha após o código acima:

$i=$i + 1; sc_appmenu_add_item('menu', $i, '', 'SAIR', 'login', '', '', '', '_parent');

Só que está retornando o erro:

[size=12pt][b]Internal Server Error[/b][/size]

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at webmaster@mdierp.com.br to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.

Como posso resolver isso?

O nome da tua app tem que ser menu.

O nome da minha app está menu mesmo.

Consegui fazer, agora, como faço para pegar a imagem que está no banco e passar para o menu para mostrar o ícone?

Tentei fazer assim, mas não deu certo:

... if(!empty({dspermissao})) foreach({dspermissao} as $arr_permissao) { [b]$icone = base64_encode({dspermissao[0][5]});[/b] sc_appmenu_add_item('mcr14','item_'.$arr_modulo[0].$arr_permissao[0],'item_'.$arr_modulo[0], $arr_permissao[1],mcr14_1,prodid=$arr_permissao[0], [b]$icone[/b], , ); } ...

Alguém tem alguma ideia de como posso fazer isso?