Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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>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
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.
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
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 );
}
}
}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
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?
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
Como está montando o breadcrumb? Poste o código que monta e o código que exibe.
Carlos Eduardo