Ir para conteúdo

POWERED BY:

Arquivado

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

Ghean

[Resolvido] Breadcrumbs

Recommended Posts

Olá a todos.

 

Estou o método breadcrumbs do Zend_Navigator, ele esta exibindo o caminho corretamente (Usuários > Gerenciar Usuários).

 

O problema esta quando tenho uma paginação. Na action gerenciar tenho uma listagem de todos os usuarios, quando mudo de página o breadcrumbs some.

 

Pelo que percebi ao inserir qualquer outra coisa na url depois da action ele perde a referencia.

 

http//meudominio.com.br/usuarios/gerenciar -> exibe breadcrumbs

http//meudominio.com.br/usuarios/gerenciar/pagina/2 -> não exibe breadcrumbs

http//meudominio.com.br/usuarios/gerenciar/pagina/1 -> não exibe breadcrumbs

 

Alguém já teve esse problema? como resolveram e como posso resolver esse problema?

 

Apenas para constar, estou usando duas tabelas em minha base, menu e submenu.

De acordo com o nivel do usuários logado gero os menus.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Plugin que gera o menu de acordo com o perfil do usuário logado

class Plugins_Navigation extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{     
	$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
       if (null === $viewRenderer->view) $viewRenderer->initView();
       $view = $viewRenderer->view;
	$view->setEncoding('iso-8859-1');

	$oAuth = Zend_Auth::getInstance();

	if( $oAuth->hasIdentity() )
	{
		$oDadosUsuario = $oAuth->getIdentity();

		$dbAdapter = Zend_Db_Table::getDefaultAdapter();
		$dbAdapter->setFetchMode(Zend_Db::FETCH_ASSOC);

		// Seleciona os itens do menu
		$qMenu = $dbAdapter->select();
		$qMenu->from( array('p' => 'permissoes') )
			  ->join( array('m' => 'menu'), 'p.id_menu = m.id_menu')
			  ->where('p.fl_ativo = 1')
			  ->where('p.id_submenu = 0')
			  ->where('p.id_item_menu = 0')
			  ->where('p.id_nivel_acesso = ?', $oDadosUsuario->id_nivel_acesso)
			  ->order('m.id_ordem ASC');

		$oMenu = $qMenu->query()->fetchAll();

		$navContainer = new Zend_Navigation();

		foreach ( $oMenu as $value )
		{
			$aSubmenu = "";

			$uri = "/";
			$uri .= ( !is_null($value['controle']) ) ? $value['controle'] : "";
			$uri .= ( !is_null($value['acao']) ) ? '/' . $value['acao'] : "";

			$aMenu = array(
							  'uri'   => $uri,
							  'label' => $value['ds_menu'],
							  'title' => $value['ds_menu']
						  );

			// Seleciona os itens do submenu
			$qSubmenu = $dbAdapter->select();
			$qSubmenu->from( array('p' => 'permissoes') )
				  	 ->join( array('sm' => 'submenu'), 'p.id_submenu = sm.id_submenu')
				   	 ->where('p.fl_ativo = 1')
				  	 ->where('p.id_item_menu = 0')
				  	 ->where('p.id_menu = ?', $value['id_menu'])
				     ->where('p.id_nivel_acesso = ?', $oDadosUsuario->id_nivel_acesso)
				  	 ->order('sm.id_ordem ASC');

			$oSubmenu = $qSubmenu->query()->fetchAll();

			if( sizeof( $oSubmenu ) > 0)
			{				
				foreach ( $oSubmenu as $vSubmenu )
				{
					$uri = "/";
					$uri .= ( !is_null($vSubmenu['controle']) ) ? $vSubmenu['controle'] : "";
					$uri .= ( !is_null($vSubmenu['acao']) ) ? '/' . $vSubmenu['acao'] : "";

					$aSubmenu[] = array(
										 'uri'   => $uri,
										 'label' => $vSubmenu['ds_submenu'],
										 'title' => $vSubmenu['ds_submenu']
										 );
				}

				$aMenu['pages'] = $aSubmenu;
				$aMenu['class'] = 'submenu';
			}

			$navContainer->addPage( Zend_Navigation_Page::factory( $aMenu ) );
		}


		$activePage = $navContainer->findByUri($request->getRequestUri());

		if( $oDadosUsuario->id_usuario == 1 )
		{
			$activePage->active = true;
		}

		$view->navigation( $navContainer );
	}
}
}

 

 

Exibição do breadcrumbs no layout

 

<!-- BREADCRUMB -->
<div id="breadcrumb">
  <?php echo $this->navigation()->breadcrumbs()->setMinDepth(0)->setLinkLast(true); ?>
</div>
<!-- /BREADCRUMB -->

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, não é a causa do seu problema, mas você tem um defeito sério no seu código. Executar uma consulta dentro do foreach da outra gera diversas consultas ao banco, prejudicando o desempenho do sistema. Dá uma olhada neste artigo, onde eu falo um pouco sobre o problema. Como você pode fazer?

 

Veja esta modelagem que sugeri lá que é mais interessante. Dá pra fazer com a modelagem que você fez, mas vai dar um pouco mais de trabalho. Se quiser ajuda, poste a estrutura das tabelas que eu te ajudo a montar a consulta para fazer esta parte da navegação com 1 consulta ao banco só.

 

-----------------

 

Sobre o seu problema, o Zend_Navigation não está localizando a página http//meudominio.com.br/usuarios/gerenciar/pagina/2, pois ela não existe ali. Para que isto seja resolvido, utilize Zend_Navigation_Page_Mvc. Aí o Zend_Navigation, na hora de montar o breadcrumb vai entender que está na página onde o controller é usuário e a action é gerenciar, entendendo que o pagina é parâmetro, exibindo assim o breadcrumb.

 

Veja se assim você consegue resolver e qualquer dúvida, volte a perguntar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal Carlos, primeiro irei tentar usarando Zend_Navigation_Page_Mvc, que atualmente é mais urgente, rs...

 

E obrigado pelo dica, pode ter certeza que será levada com muita consideração.

Irei dar uma olhada nela e qualquer dúvida volto a postar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se tiver dificuldade em qualquer uma das etapas, poste como tentou fazer que a gente vai ajudando e fazendo junto, aprendendo todos. Quem sabe pode até virar um plugin postado aqui no fórum e no iMasters Code.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhei a documentação referente ao Zend_Navigation_Page_MVC, e fiz a seguinte alteração.

 

Não sei se é a mais correta mas funcionou perfeitamente:

<?php
class Plugins_Navigation extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{     
	$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
       if (null === $viewRenderer->view) $viewRenderer->initView();
       $view = $viewRenderer->view;
	$view->setEncoding('iso-8859-1');

	$oAuth = Zend_Auth::getInstance();

	if( $oAuth->hasIdentity() )
	{
		$oDadosUsuario = $oAuth->getIdentity();

		$dbAdapter = Zend_Db_Table::getDefaultAdapter();
		$dbAdapter->setFetchMode(Zend_Db::FETCH_ASSOC);

		// Seleciona os itens do menu
		$qMenu = $dbAdapter->select();
		$qMenu->from( array('p' => 'permissoes') )
			  ->join( array('m' => 'menu'), 'p.id_menu = m.id_menu')
			  ->where('p.fl_ativo = 1')
			  ->where('p.id_submenu = 0')
			  ->where('p.id_item_menu = 0')
			  ->where('p.id_nivel_acesso = ?', $oDadosUsuario->id_nivel_acesso)
			  ->order('m.id_ordem ASC');

		$oMenu = $qMenu->query()->fetchAll();

		$navContainer = new Zend_Navigation();

		foreach ( $oMenu as $value )
		{
			$aSubmenu = "";

			$aMenu = array(
							  'controller' => ( !is_null($value['controle']) ) ? $value['controle'] : "",
							  'action' 	   => ( !is_null($value['acao']) ) ? $value['acao'] : "",
							  'label'      => $value['ds_menu'],
							  'title'      => $value['ds_menu']
						  );

			// Seleciona os itens do submenu
			$qSubmenu = $dbAdapter->select();
			$qSubmenu->from( array('p' => 'permissoes') )
				  	 ->join( array('sm' => 'submenu'), 'p.id_submenu = sm.id_submenu')
				   	 ->where('p.fl_ativo = 1')
				  	 ->where('p.id_item_menu = 0')
				  	 ->where('p.id_menu = ?', $value['id_menu'])
				     ->where('p.id_nivel_acesso = ?', $oDadosUsuario->id_nivel_acesso)
				  	 ->order('sm.id_ordem ASC');

			$oSubmenu = $qSubmenu->query()->fetchAll();

			if( sizeof( $oSubmenu ) > 0)
			{				
				foreach ( $oSubmenu as $vSubmenu )
				{				
					$aSubmenu[] = array(
										 'controller' => ( !is_null($vSubmenu['controle']) ) ? $vSubmenu['controle'] : "",
										 'action' 	  => ( !is_null($vSubmenu['acao']) ) ? $vSubmenu['acao'] : "",
										 'label' 	  => $vSubmenu['ds_submenu'],
										 'title'	  => $vSubmenu['ds_submenu']
										 );
				}

				$aMenu['pages'] = $aSubmenu;
				$aMenu['class'] = 'submenu';
			}

			$navContainer->addPage( Zend_Navigation_Page::factory( $aMenu ) );
		}


		$activePage = $navContainer->findOneBy('action', $request->getActionName());
		$activePage->active = true;

		$view->navigation( $navContainer );
	}
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Era isto mesmo. Então foi resolvido mesmo? Que bom!!!

 

Só não esqueça que você continua com o problema de desempenho por conta da consulta dentro do laço. Acho que, mesmo com esta modelagem, dá pra montar tudo com uma consulta só. Se quiser, poste a estrutura das tabelas (menu e submenu) que eu tento te ajudar a montar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Carlos, desculpe a demora em respoder.

aparentemente esta tudo certo.

 

Segui seu conselho e estou tentando fazer da forma recomendada.

 

Criei uma tabela semelhante a sugerida por você (menuId | menuNome | menuIdPai | menuLink).

A diferença é a tabela menu esta liga a uma de perfil_menu (menuId | usuarioId), faço a na tabela de permissões com join na menu.

 

Dentro desse meu plugin coloquei o método imprimeMenuInfinito(), e dentro do método do mátodo preDispatch() chamo o método criado, $this->imprimeMenuInfinito()

 

Consigo imprimir a lista perfeitamente, o problema é que não consegui fazer esse retorno em array, já que devo passar um array para o Zend_Navigator.

 

Dentro do método imprimeMenuInfinito() devo jogar os subitens dentro de uma chave pages correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, eu não utilizaria a função, já que você está utilizando Zend_Navigation. Seria algo assim:

 

Caso seja um menu principal, você cria um novo objeto Zend_Navigation_Page_Mvc e adicionaria ao objeto criado Zend_Navigation. Se for sub-menu, criaria um Zend_Navigation_Page_Mvc e adicionaria ao objeto do menu ao qual ele é relativo, utilizando o método findOneBy*.

 

Se não conseguir, poste como tentou que a gente pode ir fazendo junto.

 

Carlos Eduardo

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.