Zend Framework/Zend Acl/Configuración básica

De Wikilibros, la colección de libros de texto de contenido libre.

Introducción[editar]

En este ejemplo la parte importante es #/html/index.php aquí tenemos que prestar especial atención al fragmento

$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'))
    ->addRole(new Zend_Acl_Role('admin'));

$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);


$acl->add(new Zend_Acl_Resource('someResource'));

$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');

Zend_Registry::set('acl',$acl);

Aquí vemos como se crean 4 roles guest,member,admin,someUser. En donde someUser hereda de los otros tres sus privilegios. Creamos luego un recurso, someResource donde el usuario guest no tiene acceso al mismo pero si el usuario member y sus descendientes.


En #/application/controllers/IndexController.php utilizamos al controlador para setear la información sobre acceso

        $acl = Zend_Registry::get('acl');
        
        $this->view->someUser = $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
        $this->view->guest = $acl->isAllowed('guest', 'someResource') ? 'allowed' : 'denied';

Finalmente visualizamos los permisos en #/application/views/scripts/index/index.phtml

<?php
echo '<br>The user someUser is : '.$this->someUser;
echo '<br>The user guest is : '.$this->guest;
?>

En la figura se resume la idea

Archivo:Zfw ACL.png


Estructura de archivos[editar]

La estructura de los archivos será al siguiente

Archivo:Zft configuracion basica.png

/.htaccess[editar]

Este archivo me permite realizar una redireccion utilizando apache, aqui me indica que cada vez que ingrese a la url http://localhost/zft ( que es donde reside este ejemplo ) nos redireccionara hacia http://localhost/zft/html que es la url base de la aplicacion.

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ html


/application/controllers/IndexController.php[editar]

Este es el controlador por defecto que se invoca en el caso de no especificar que controlador utilizar. Aqui podemos ver las acciones que el mismo puede realizar.

<?php
/**
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */


class IndexController extends Zend_Controller_Action
{
	

	function init()
    {
    	

        $response = $this->getResponse();
        $response->insert('sidebarLeft', $this->view->render('sidebarLeft.phtml'));
        $response->insert('sidebarRight', $this->view->render('sidebarRight.phtml'));
        $response->insert('header', $this->view->render('header.phtml'));
        $response->insert('footer', $this->view->render('footer.phtml')); 
    }
    
    

    public function indexAction()
    {
    	$acl = Zend_Registry::get('acl');
    	
    	$this->view->someUser = $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
    	$this->view->guest = $acl->isAllowed('guest', 'someResource') ? 'allowed' : 'denied';
    	
    }
}


/application/views/layouts/layout.phtml[editar]

Esta pagina nos permite definir la estructura del sitio, es decir su distribucion topografica, como ser si dispone de un encabezado, pie de pagina, barra lateral izquierada, barra lateral derecha y donde residira el contenido de la accion que se esta ejecutando actualmente.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
					"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>ZFTutorial :: Enfoque pragmatico</title>
    <link rel="stylesheet" type="text/css" href="<?php echo $this->baseUrl();?>/css/grid.css" />
</head>
<body>
	<div id="bcss-header">
    <!-- bcss-header -->
	<?php echo $this->layout()->header ?>
    <!-- /bcss-header -->
	</div>
	
	<div id="bcss-sidebar-1">
    <!-- bcss-sidebar-1 -->
	<?php echo $this->layout()->sidebarLeft ?>
    <!-- /bcss-sidebar-1 -->
 	</div>
 	
	<div id="bcss-content">
    <!-- bcss-content -->
	<?php echo $this->layout()->content ?>
    <!-- /bcss-content -->	
	</div>
	
	<div id="bcss-sidebar-2">
    <!-- bcss-sidebar-2 -->
	<?php echo $this->layout()->sidebarRight ?>
    <!-- /bcss-sidebar-2 -->	
 	</div>
 	
	<div id="bcss-footer">
    <!-- bcss-footer -->
	<?php echo $this->layout()->footer ?>
    <!-- /bcss-footer -->	
	</div>
</body>
</html>


/application/views/helpers/BaseUrl.php[editar]

Este helper me permite determinar en forma absoluta la url base de la aplicación.

<?php
/**
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */


class Zend_View_Helper_BaseUrl
{
	
    function baseUrl()
    {
        $fc = Zend_Controller_Front::getInstance();
        $request = $fc->getRequest();
        return $request->getBaseUrl();
    }
}


/application/views/scripts/sidebarLeft.phtml[editar]

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la parte lateral izquierda del layout.

<ul>
<li><a href="<?php echo $this->baseUrl();?>/index/index">home</a></li>
<li><a href="http://www.google.com">google</a></li>
</ul>


/application/views/scripts/header.phtml[editar]

Breve descripción del archivo

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido del encabezado del layout.

<h1>Header</h1>


/application/views/scripts/footer.phtml[editar]

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido del pie del layout.

<h1>Footer</h1>


/application/views/scripts/sidebarRight.phtml[editar]

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la parte lateral derecha del layout.

<h1>Sidebar Right</h1>


/application/views/scripts/index/index.phtml[editar]

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Esta sección incluye el contenido de la accion que se esta ejecutando.

<h1>Hello World !!!</h1>
<?php
echo '<br>The user someUser is : '.$this->someUser;
echo '<br>The user guest is : '.$this->guest;
?>


/html/index.php[editar]

<?php
/**
 * Zend Framework Tutorial
 * 
 * Este tutorial tiene un enfoque pragmatico, lo cual indica una amplia cantidad
 * de ejemplos. Este material forma parte del Wikibook en español para ZF.
 * 
 * @author		Mario Garcia
 * @copyright	Copyright (c) 2006-2008 Oh!Studio Media Solutions (http://www.ohstudio.com.ar)
 * @license		http://www.php.net/license/3_0.txt
 */

/*poner comentario*/


define('ROOT_DIR', dirname(dirname(__FILE__)));

// Setup path to the Zend Framework files
set_include_path('.'
	. PATH_SEPARATOR . ROOT_DIR.'/lib/'
	. PATH_SEPARATOR . get_include_path()
);

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();


$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'))
    ->addRole(new Zend_Acl_Role('admin'));

$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);


$acl->add(new Zend_Acl_Resource('someResource'));

$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');

Zend_Registry::set('acl',$acl);


// Inicializar el MVC
Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR.'/application/views/layouts'));

// Run!
$frontController = Zend_Controller_Front::getInstance();
$frontController->addControllerDirectory(ROOT_DIR.'/application/controllers');
$frontController->throwExceptions(true);
try {
    $frontController->dispatch();
} catch(Exception $e) {
    echo nl2br($e->__toString());
}

/html/.htaccess[editar]

Este archivo me permite determinar que todo archivo que no sea una imagen, ni js, ni css sea redireccionado hacia index.php.

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php


/html/css/grid.css[editar]

Este archivo forma parte del layout #/application/views/layouts/layout.phtml.

Aquí le aplicamos el estilo para la distribución de las secciones.

/* Site Grid by BoxedCSS.com */
#bcss-header {
	width:100%;
	background:#FFFFE5; /* you can delete this, it's just a visual aid */
	clear:both;
	}
#bcss-sidebar-1 {
	width:27%;
	float:left;
	background:#FFE5FF; /* you can delete this, it's just a visual aid */
	}
#bcss-sidebar-2 {
	width:13%;
	float:left;
	background:#F7FBEA; /* you can delete this, it's just a visual aid */
	}
#bcss-content {
	width:60%;
	min-height: 400px;
	float:left;
	background:#E5F2FF; /* you can delete this, it's just a visual aid */
	}
#bcss-footer {
	width:100%;
	clear:both;
	background:#FFF2E5; /* you can delete this, it's just a visual aid */
	}