Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá amigos zf...
estou eu aqui mais uma vez...
estou usando um plugin acl para fazer minhas validações junto ao zend auth
o link do modelo do plugin é esse, ok: http://framework.zend.com/wiki/display/ZFUSER/Using+Zend_Acl+with+a+database+backend?showChildren=false#UsingZend_Aclwithadatabasebackend-MainACLclass%3A
meu plugin foi um pouco alterado
<?php
class Zend_Plugin_Acl extends Zend_Acl {
private $_db;
public $_getUsuarioPerfilNome = null;
public $_getUsuarioNome = null;
public $_getUsuarioPerfilId = null;
public $_id_usuario = null;
public function __construct()
{
$zfAuth = Zend_Auth::getInstance();
if(!$zfAuth->hasIdentity())
{
$flashMessenger = new Zend_Controller_Action_Helper_FlashMessenger();
$flashMessenger->direct('Efetue seu Login!');
$redirect = new Zend_Controller_Action_Helper_Redirector();
$redirect->direct('index', 'login', 'default');
}
$dadosUsuario = $zfAuth->getIdentity();
if($dadosUsuario->lembrar == 1)
{
Zend_Session::rememberMe(604800);
}
else
{
Zend_Session::rememberMe(600);
}
$this->_id_usuario = $dadosUsuario->id_usuario;
$this->_db = Zend_Db_Table::getDefaultAdapter();
self::perfilModulo();
$getUsuarioPerfil = $this->_db->fetchRow(
$this->_db->select()
->from('usuario_perfil', array('perfil', 'id_usuario_perfil'))
->from('usuario')
->where('usuario.id_usuario = ' . $this->_id_usuario )
->where('usuario.id_usuario_perfil = usuario_perfil.id_usuario_perfil'));
$this->_getUsuarioPerfilId = $getUsuarioPerfil['id_usuario_perfil'] ? $getUsuarioPerfil['id_usuario_perfil'] : 4;
$this->_getUsuarioPerfilNome = $getUsuarioPerfil['perfil'] ? $getUsuarioPerfil['perfil'] : 'Visitante';
$this->addRole(new Zend_Acl_Role($this->_id_usuario), $this->_getUsuarioPerfilNome);
}
private function initPerfil()
{
$perfis = $this->_db->fetchAll(
$this->_db->select()
->from('usuario_perfil')
->order(array('id_usuario_perfil DESC')));
$this->addRole(new Zend_Acl_Role($perfis[0]['perfil']));
for ($i = 1; $i < count($perfis); $i++){
$this->addRole(new Zend_Acl_Role($perfis[$i]['perfil']), $perfis[$i-1]['perfil']);
}
}
private function initModulos()
{
self::initPerfil();
$modulos = $this->_db->fetchAll(
$this->_db->select()
->from('usuario_modulo'));
foreach ($modulos as $key=>$value){
if (!$this->has($value['modulo'])) {
$this->add(new Zend_Acl_Resource($value['modulo']));
}
}
}
private function perfilModulo()
{
self::initModulos();
$acl = $this->_db->fetchAll(
$this->_db->select()
->from('usuario_perfil')
->from('usuario_modulo')
->from('usuario_permissao')
->where('usuario_perfil.id_usuario_perfil = usuario_permissao.id_usuario_perfil'));
foreach ($acl as $key=>$value) {
$this->allow($value['perfil'], $value['modulo'], $value['permissao']);
}
}
public function listaPerfil()
{
return $this->_db->fetchAll(
$this->_db->select()
->from('usuario_perfil'));
}
public function getPerfilId($perfilNome)
{
return $this->_db->fetchRow(
$this->_db->select()
->from('usuario_perfil', 'id_usuario_perfil')
->where('usuario_perfil.perfil = "' . $perfilNome . '"'));
}
public function listaModulos()
{
return $this->_db->fetchAll(
$this->_db->select()
->from('usuario_modulo')
->from('usuario_permissao')
->where('usuario_permissao.id_usuario_modulo = usuario_modulo.id_usuario_modulo'));
}
public function listaModulosDoGrupo($modulo)
{
$result = null;
$modulo = $this->_db->fetchAll(
$this->_db->select()
->from('usuario_modulo')
->from('usuario_permissao')
->where('usuario_modulo.modulo = "' . $modulo . '"')
->where('usuario_modulo.id_usuario_modulo = usuario_permissao.id_usuario_modulo'));
foreach ($modulo as $key=>$value) {
if($this->isAllowed($this->_id_usuario, $value['modulo'], $value['permissao'])) {
$result[] = $value['permissao'];
}
}
return $result;
}
public function isUserAllowed($modulo, $permissao)
{
if(!$this->isAllowed($this->_id_usuario, $modulo, $permissao) && Zend_Auth::getInstance()->hasIdentity()){
//throw new Zend_Controller_Exception("Oops! Cada macaco no seu galho!", 403);
$redirect = new Zend_Controller_Action_Helper_Redirector();
$redirect->direct('index', 'index', 'default');
}
}
}
estou usando o tambem o plugin jquery treview asnc para gerar um "arvore" de categorias, subcategorias, sub-subcategorias, sub-sub-subcategorias, etc...
http://jquery.bassistance.de/treeview/demo/async.html
o método para gerar as categorias é action dentro do meu controller... então...
eu acesso um controller para exibir minhas categorias....
a arvore de categorias é montada pelo plugin jquery que acessa um outro action no meu controller...
ate ai tudo bem!!!
o problema é quando eu clico em uma categoria... para exibi la... acho que fica mais fácil colocando o código....
categorias
class Admin_CategoriasController extends Zend_Controller_Action
{
private $_acl = array();
private $_usuario;
private $_baseUrl;
public function init()
{
/* Initialize action controller here */
/* Verifica se o usuário tem permissão de acesso */
$this->_acl = new Zend_Plugin_Acl();
$this->_usuario = Zend_Auth::getInstance()->getIdentity();
$request = $this->getRequest();
$moduleName = $request->getModuleName();
$controllName = $request->getControllerName();
$actionName = $request->getActionName();
$this->_acl->isUserAllowed($moduleName, $controllName);
/* Fim verifica permissão */
$this->response = $this->getResponse();
$this->response->insert('menu', $this->view->render('menu.phtml'));
$this->_baseUrl = $this->getFrontController()->getBaseUrl();
}
public function indexAction () $title = 'Categorias';
$this->view->headTitle()->prepend($title);
/* Fim meta dados */
/* Scripts da action */
$this->view->headScript()->prependFile( $this->_baseUrl . '/script/jquery.treeview.async.js', 'text/javascript')
->prependFile( $this->_baseUrl . '/script/jquery.treeview.js', 'text/javascript');
$this->view->headLink()->prependStylesheet( $this->_baseUrl . '/style/jquery.treeview.css')
->prependStylesheet( $this->_baseUrl . '/style/admin/container-categorias.css');
$this->view->messages = $this->_helper->flashMessenger->getMessages();
$id_categoria = (int)($this->_hasParam('id')) ? $this->_getParam('id') : 0;
$this->view->id_categoria = $id_categoria;
$dbCategorias = new Zend_Model_DbTable_AtributoCategoria();
if($id_categoria!=0) $categoria = $dbCategorias->getCategoria($id_categoria);
$this->view->nome_categoria = $categoria['nome'];
}
/**
* Método para exibir categorias pela categoria pai
*/
public function categoriasAction ()
{
/ Desabilita o layout e não exibe componentes do layout /
$this->_helper->layout->disableLayout();
$this->response->clearBody('menu');
$id_atributo_pai = (int)($this->_getParam('root') == 'source') ? 0 : $this->_getParam('root');
$id_categoria = (int)($this->_hasParam('id')) ? $this->_getParam('id') : 0;
$dbCategorias = new Zend_Model_DbTable_AtributoCategoria();
if($id_categoria!=0) $categoria = $dbCategorias->getCategoria($id_categoria);
$categorias = $dbCategorias->getCategorias($id_atributo_pai);
$hierarquia = ($categoria!=null) ? explode("/", $categoria['hierarquia']) : array();
$this->view->id_principal = $id_categoria;
$this->view->hierarquia = $hierarquia;
$this->view->categorias = $categorias;
}
}
index.phtml
<?php
echo $this->Scriptcategorias($this->id_categoria);
?>
<h3>Categorias</h3>
<div id="list-categorias">
<ul id="arvore-categorias">
</ul>
</div>
<div id="body-categorias">
<?= $this->mensagem($this->messages) ?>
<?= $this->nome_categoria ?>
</div>
helper scriptcategorias
class Zend_View_Helper_Scriptcategorias extends Zend_View_Helper_Abstract
{
function scriptcategorias($id)
{
$stringText = '<script type="text/javascript">
$(document).ready(function(){
$("#arvore-categorias").treeview({
url: "/admin/categorias/categorias';
if($id!=0) $stringText .= '/id/'.$id;
$stringText .= '"
});
});
</script>';
return $stringText;
}
}
categorias.phtml
<?=$this->Listacategorias($this->categorias, $this->hierarquia, $this->id_principal)?>
helper listacategorias
class Zend_View_Helper_Listacategorias extends Zend_View_Helper_Abstract
{
function listacategorias($categorias, $hierarquia, $id_principal)
{
$stringText = '[';
foreach ($categorias as $categoria)
{
$nome = $categoria['nome'];
$id = $categoria['id_atributo_categoria'];
$filhos = $categoria['atributos_filho'];
if($id==$id_principal)
{
$stringText .= '{"text": "<strong>'. $nome .'</strong>",';
}
else
{
$stringText .= '{"text": "<a href=\"/admin/categorias/index/id/'.$id.'\">'. $nome .'</a>",';
}
if(in_array($id, $hierarquia))
{
$stringText .= '"expanded": true,';
$dbCategoria = new Zend_Model_DbTable_AtributoCategoria();
$categorias2 = $dbCategoria->getCategorias($id);
$stringText .= '"children":'. $this->listacategorias($categorias2, $hierarquia, $id_principal) .',';
}
elseif($filhos>0)
{
$stringText .= '"id": "'. $id .'",';
$stringText .= '"hasChildren": true,';
}
$stringText = substr($stringText, 0, strlen($stringText)-1);
$stringText .= '},';
}
$stringText = substr($stringText, 0, strlen($stringText)-1);
$stringText .= ']';
return $stringText;
}
}
então o problema mesmo é que não sei porq quando eu clico em um categoria que tem categorias filhas ele sai do sistema
como se limpasse o zend_auth, caindo na situação como se eu estivesse tentando acessa um lugar e não tenha me logado...
estou ficando vesgo com isso
agradeço atenção
Carregando comentários...