Ghean 0 Denunciar post Postado Janeiro 17, 2011 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
Matias Rezende 50 Denunciar post Postado Janeiro 17, 2011 Como está montando o breadcrumb? Poste o código que monta e o código que exibe. Carlos Eduardo Compartilhar este post Link para o post Compartilhar em outros sites
Ghean 0 Denunciar post Postado Janeiro 17, 2011 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
Matias Rezende 50 Denunciar post Postado Janeiro 18, 2011 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
Ghean 0 Denunciar post Postado Janeiro 18, 2011 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
Matias Rezende 50 Denunciar post Postado Janeiro 18, 2011 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
Ghean 0 Denunciar post Postado Janeiro 20, 2011 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
Matias Rezende 50 Denunciar post Postado Janeiro 20, 2011 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
Ghean 0 Denunciar post Postado Fevereiro 2, 2011 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
Matias Rezende 50 Denunciar post Postado Fevereiro 2, 2011 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