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 3 2009

Problemas de codificación al generar pdf con php

Jonathan Andres Calderón Roa

Cuando trabajamos en nuestra pagina web,  de todos los inconvenientes que se me han presentado uno de los mas molestos ha sido el de la codificacion de los archivos, ya que como sabemos existen varias formas de codificarlos  y si no usamos el correcto se pueden presentarse errores al mostrar los caracteres deseados como las tildes y la  ” ñ” por ejemplo. Bien pues para solucionar esto siempre codifico los archivos  con utf-8, pero sin embargo, estos errores también invaden la base de datos en donde nos pueden quedar datos guardados con una codificacion  que no soporte nuestros caracteres y no nos damos cuenta por que al mostrarlos en pantalla se codifican correctamente. Bueno, el problema  en el momento de generar pdfs es que ahi se imprimen los caracteres tal y como se guardaron en la base de datos y para corregir el problema y no tener textos como “canción” o  “niÃ+ podemos usar la función

string html_entity_decode ( string $cadena [, int $estilo_comillas [, string $juego_caracteres ]] ); donde cadena hace referencia a la cadena de entrada o el texto que queremos codificar, estilo_comillas es el segundo parámetro opcional que permite definir lo que debe hacerse con las comillas ’sencillas’ y “dobles”.Podemos asignarle una de tres constantes posibles, siendo el valor por defecto ENT_COMPAT:

Constantes disponibles para estilo_comillas
Nombre constante Descripción
ENT_COMPAT Convierte las comillas dobles y deja intactas las comillas sencillas.
ENT_QUOTES Convierte tanto comillas dobles como sencillas.
ENT_NOQUOTES No convierte ni las comillas dobles ni las sencillas.

y el juego de caracteres ISO-8859-1 es usado como valor predeterminado para el tercer argumento opcional juego_caracteres . Éste define el juego de caracteres usado en la conversión.

y asi queda solucionado nuestro problema con los PDFs.