Archive for the 'Cakephp' Category

Busquedas en cakePHP

Lunes, Abril 7th, 2008

Seria algo asi como un search helper o algo por el estilo, la cosa es que no es un buscador de info sobre cake, sino un buscador para tu aplicación, la idea de esto es hacer un metodo en el app_controller que nos permita hacer busquedas en la BD partiendo de cualqueir modelo.

Lo primero es nuestro metodo de busqueda


function search(){
$this->autoRender = false;
$search = $this->data[$this->modelClass]['Buscar'];
$cond ="";
$i=0;
foreach($this->{$this->modelClass}->_schema as $field => $value){
//debug($field);
if($i>0){
$cond = $cond. " OR ";
}
$cond = $cond. " ".$this->modelClass.".".$field." ILIKE '%".$search."%' ";
$i++;
}
$conditions = array('limit'=>4, 'conditions'=> $cond);
$this->paginate = $conditions;
$this->set(strtolower($this->name), $this->paginate());
$this->render('index');
}

Probablemente esta es una busqueda que se puede optimizar muchisimo, pero como yo no soy ningun guru de SQL pues eso fue lo que se me ocurrio, lo que esto hace basicamente es armar las condiciones del find, buscando con cada campo del esquema de la tabla relacionada con el modelo ocurrencias de la frase de busqueda. Esto es mil veces mejorable colocando condiciones para las tablas relacionadas, y asi buscar en toda la info del registro y no solo por el id de la relación (bueno esta parte ni yo la entendi xD)

Como sabemos este metodo que colocamos en el app_controller estara disponible para todos nuestros controladores, asi que ahora solo nos falta colocar nuestra caja de busqueda en las vistas. Yo lo implemente de manera que la caja de busqueda vaya en el index, sobre la tabla paginada, y ojo no es que importe, es que esa es la razon por la cual el metodo regresa el resultado paginado y con el nombre de la clase.

En fin este es el codigo que debe ir en la vista


/*echo $paginator->counter(array(
'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true)
));*/
echo $form->create('', array('action'=>'search'));
echo $form->input('Buscar', array('type'=>'text'));
echo $form->end('Buscar');
?>

Como ven lo que he hecho es que quito la parte donde se coloca la información de la paginación y alli coloco la caja de busquedas, y pues eso es todo, de esta manera pueden colocarle busquedas a todos los controladores, espero les sirva de algo ^^

Cambiar la lista de selección por checkbox en cakephp1.2

Miércoles, Febrero 13th, 2008

Cuando generamos vistas donde se involucran mas de una clase, regularmente terminamos con una lista de los elementos de las tablas referenciadas, es decir un select con opciones. Para cambiar esto a multiples checkbox solo hace falta agregar un parametro a la función input

echo $form->input('id', array('type'=>'select', 'multiple'=>'checkbox'));

y eso es todo, en vez de tener la lista tendremos un checkbox por cada elemento.

Manejar multiples schemas con postgres en cakephp 1.2

Miércoles, Febrero 6th, 2008

Uno de los problemas mas grandes que conseguimos en el trabajo para trabajar con cake, es que al parecer, aun no maneja de manera idel multiples schemas, y digo de manera ideal porque si los toma en cuenta, pero es muy limitante que solo te permita manejar un schema por conexión.

Esto era un gran problema para nosotros, porque los sistemas son gigantes y la utilización de schemas nos ayuda muchisimo, asi que teniamos que conseguir la manera de que funcionara con multiples schemas, sino hubiesemos perdido todo el tiempo que hemos pasado migrando a un framework.

El principal problema radica en que cake te permite hacer multiples conexiones a la BD, y por conexión especificar un schema, lo que yo hice fue modificar cake para que adminitira multiples schemas por conexión, para esto vamos a modificar un solo archivo llamado ‘dbo_postgres.php’ y se encuentra en

cake/cake/libs/model/datasources/dbo/dbo_postgres.php

En la función connect vamos a agregar estas lineas, despues de esta linea $this->connected = true; y antes de esta (reemplaza lo que sea que este en el medio) $this->_execute(”SET search_path TO ” . $schemas) (< -- esta ultima linea deben incluirla, sustituyendo la original);

(more…)

Filtrar los resultados de la Paginación en cakephp 1.2

Jueves, Enero 31st, 2008

Nota: este post necesita conocimientos basicos del funcionamiento de cakephp, puede que no encuentres el post muy util no ser asi.

Con la entrada inminente de la nueva versión de cakephp se vienen muchos cambios, muchos de los que me he encontrado los intentare reseñar en el blog para futura referencias mia y si de paso ayuda a alguien mas pues mejor. Uno de esos cambios es la integración de la paginación a la clase base controller.

Cuando hacemos un bake (que si no lo haces deberias porque acorta el trabajo muchisimo) nos queda en el metodo index algo asi

function index() {
$this->Model->recursive = 0;
$this->set('flotas', $this->paginate());
}

Esto reemplaza al

$this->Model->findAll();

Ya en las vistas bake hace el trabajo de colocar las intrucciones de poder ordenar por columna, asi que no entrare en eso, el verdadero ‘problema’ es que tal sino quiero que sean todos los registros, sino que los quiero filtrar con alguna condición, cualquiera pensaria que la función paginate recibiria argumentos, por lo menos yo lo hice, pero NO es asi.

La solución a esto es una variable de la clase controlador que contiene las opciones de la paginación, por defecto viene asi

$this->paginate = array('limit' => 20, 'page' => 1);

A lo cual añadimos un arreglo con nuestras condiciones de igual manera que lo hariamos con find

$conditions = "id = 2 OR id = 3";
$this->paginate = array('limit' => 20, 'page' => 1,'conditions' => $conditions);

Y listo ya tenemos nuestra paginación personalizada ^^

PD: de igual manera si no sabian como filtrar los resultados de un find, ya lo saben, solo se agrega un arreglo ‘conditions’ a los parametros dela función (ven como cabe la confusión porque find si es por parametro y paginate no) que contenga la clausula WHERE, cualquier duda en los comentarios ;)