Jun 14 2009

ACL (Listas de control de acceso)

Jonathan Andres Calderón Roa

Las listas de control de acceso o ACL son usadas en los sistemas  para administrar el acceso a los recursos de nuestro software según una clasificación de tipos de usuario o usuarios específicos. Por ejemplo, si quiero que solamente los usuarios clasificados como administradores tengan acceso al modulo para añadir mas usuarios al sistema o para editar y actualizar las publicaciones  o noticias de la organización.

Debemos aclarar que no se trata de la autenticación de los usuarios al ingresar a nuestro portal web, sino de lo que ocurre después de que se se han autenticado, se trata de definir permisos de acceso por parte de unos usuarios a unos recursos.  Cuando trabajamos ACL nos referimos a los usuarios como AROS del sistema es decir son los solicitantes de acceso a los objetos del sistema, y a los objetos del sistema o recursos se les conoce como ACOS  o acceso a control de objetos del sistema.

Entonces dividimos nuestro proyecto en AROS y ACOS,  recursos y controladores de dichos recursos lo cual nos permitirá tener un mayor y mejor control un sistema administrativo eficaz.


May 3 2009

cakephp Crear un buscador personalizado

Jonathan Andres Calderón Roa

Bueno, he creado  un buscador personalizado que nos permite usar una o varias formas de búsqueda de datos simultaneamente de una forma muy sencilla tanto de usar como de programar:

En este ejemplo creare un buscador que me facilitara encontrar cotizaciones, permitiéndome buscar  por el nombre del cliente, por el estado de la cotización, y por el nombre del vendedor  encargado de dicha cotización. Para lo cual necesitaremos crear un modelo, una vista y un controlador (MVC).

Usaremos una tabla cotizaciones, usuarios y productos  para el ejemplo.
como una de las modalidades de búsqueda sera por vendedor, desde el controlador le enviaremos la consulta de la base de datos donde estan registrados los vendedores, para colocarlas en un select. por medio de un switch case seleccionamos las opciones por las cuales devolveremos los resultados a la vista.

controlador para el buscador.

       <?php
class SearchsController extends AppController {
	var $name = 'Searchs';
	var $uses = array('Quote','QuoteProduct','User','Product');
	var $helpers = array('Html','Time','Ajax','Javascript','Paginator');
	var $paginate = array(
        'limit' => 10,
		'order'=>array('Quote.id' => 'desc')
	);

	function index(){
		$this->set('sellers', $this->User->find('list',
								array('fields'=>'User.name')));
                if((isset($_POST['mode']) && ($_POST['mode'] == 'search')) || is_array($this->Session->read('QuoteSearch')) ){
			$this->Session->write('QuoteSearch', $this->data);

			if($this->data['Quote']['nameCustomer'] != null){
				switch($this->data['Quote']['customer'])
				{
					case 0:default:
						$conditions[] = array('Quote.name LIKE' => '%'.$this->data['Quote']['nameCustomer'].'%');
					break;
					case 1:
						$conditions[] = array('Quote.name NOT LIKE' => '%'.$this->data['Quote']['nameCustomer'].'%');
					break;
					case 2:
						$conditions[] = array('Quote.name LIKE' => $this->data['Quote']['nameCustomer'].'%');
					break;
					case 3:
						$conditions[] = array('Quote.name LIKE' => '%'.$this->data['Quote']['nameCustomer']);
					break;
					case 4:
						$conditions[] = array('Quote.name' => $this->data['Quote']['nameCustomer']);
					break;
					case 5:
						$conditions[] = array('Quote.name NOT' => $this->data['Quote']['nameCustomer']);
					break;
				}

			}
			if($this->data['Quote']['seller'] != null){
				$conditions[] = array('Quote.users_id' => $this->data['Quote']['seller']);
			}
			if(isset($this->data['Quote']['status'])){
				$conditions[] = array('Quote.status' => $this->data['Quote']['status']);
			}

		}
                 $data = $this->paginate('Quote',$conditions);
		$this->set(compact('data'));
	}

}
?>

Aqui tenemos la creación de la vista, en la cual tendremos un formulario que nos da la posibilidad de añadir los 3 opciones de búsqueda avanzada en nuestro sistema. por vendedor seleccionando el nombre con un select, por el nombre del cliente segun si contiene, comienza o termina con determinadas letras, y por el estado de las cotizaciones que en nuestro caso son nueva, guardada, en edición, enviada y descartada.

       <?php
//Creando el formulario de busqueda echo $form->create('uses');
	echo "Filtrar por".$form->select('FilterFor',array('Status' => 'Estado','Customer' =>'Cliente',
	'User' => 'Vendedor')).
	"<input type='button' name='Añadir' value='Añadir'onClick='showFilter()'><br/><hr/>";
echo $form->create(null,array('url' => array('controller' => 'admin/quotes', 'action' => 'index')));
	?>

<input type="hidden" name="mode" value="search">
<div id="Filters">
	<div id="Status"style="display:none"><?php
		echo "Estado";
	echo "<br/><input type='radio' name='data[Quote][status]' value='0'/>Nueva<br/>
		  <input type='radio' name='data[Quote][status]' value='1'/>Guardada<br/>
		  <input type='radio' name='data[Quote][status]' value='2'/>Enviada<br/>
		  <input type='radio' name='data[Quote][status]' value='3'/>En edición<br/>
		  <label for='Descartada'>Descartada</label><input type='radio' name='data[Quote][status]' value='4' /><br/>";
	?>
	<br/><a id="hide0"href="javascript:hideFilter('Status')">Quitar filtro</a>
	</div>

	<div id="Customer"style="display:none"><?php
		echo "Cliente".$form->select('customer',array('contiene','no contiene','empieza con','termina con','es','no es'));
		echo $form->input('nameCustomer',array('label'=>''));
	?>

	<a id="hide1"href="javascript:hideFilter('Customer')">Quitar filtro</a>
	</div>

	<div id="User" style="display:none"><?
		echo $form->select('seller',array($sellers));

	?>
	<a id="hide3"href="javascript:hideFilter('User')">Quitar filtro</a>
	</div>
</div>

<?php echo $form->submit('Buscar');?>

<script type="text/javascript">
function showFilter()
		{

				filter = jQuery('#FilterFor').val();
				jQuery('#'+filter).show("normal");
		}

function hideFilter( id)
		{
			jQuery('#'+id).hide("normal");
			jQuery('#QuoteName'+id).val("");
			jQuery('#Quote'+id).val("");

		}
//FINDE MI CODIGO
</script>

con la ayuda del script añadido en la vista podremos usar uno o mas tipos de busqueda.
La vista de nuestro buscador sera algo como esto:
buscador1


Abr 19 2009

apuntadores

Jonathan Andres Calderón Roa

Recientemente  comencé a conocer el funcionamiento de los punteros, que es un tema algo complejo de dominar, por lo que realizo este post para explicar el concepto básico y uso.

Los punteros son variables que referencian un lugar en memoria en donde se almacenan otras variables, es decir almacena una dirección de memoria, y se declaran asi: “Tipo de dato al que apuntara” * “Nombre de la variable”, por ejemplo Int *nuevo me creara un puntero que apuntara a una variable de tipo entero, le podemos dar como valor la dirección de otra variable antecediendo un “&”( Int *nuevo = & variable) o que me busque espacio en memoria con la sentencia “new”( Int *nuevo = new int). graficamente podríamos representarlo asi:

punteros1

Existen dos formas de pasar parámetros a una función, una es por valor y la otra es por referencia. Cuando pasamos parámetros por valor mandamos los datos , como por ejemplo :  insertar(23); en donde estamos pasando el entero 23. Cuando pasamos parámetros por referencia mandamos la dirección de memoria donde se ubica la variable, y en la función nos recibirá la dirección un puntero. la dirección de una variable se envía así:  insertar(& variable); y en la función nose recibirá la dirección un puntero por ejemplo entero:  function insertar(int *recivo){, Al hacer esto permitimos la manipulación desde la función de la variable de la cual pasamos la dirección, y graficamente seria algo así:

punteros21Esta es una forma sencilla de explicar el funcionamiento de los punteros.