Busquedas de filtros complejos en CakePHP
Para comprender la situación mejor, necesitamos ver el screenshot de la vista.
Hay varias formas de hacer esto, la mas común es usar la función query de CakePHP para armar la consulta SQL en base a condiciones by (@el_keogh) , está la función find, pero no se pueden poner condiciones dentro, así que lo que se puede hacer es armar el array conditions desde afuera de la siguiente forma:
<?php //Bloque #1 asignacion de variables para comodidad $alumnoid=$this->data['Examene']['cuenta']; $user=$this->data['Examene']['user']; $fechaInicio=$this->data['Examene']['Fecha de Inicio']; $fechaFin=$this->data['Examene']['Fecha de Fin']; $formadepago=$this->data['Examene']['forma_de_pago']; $resultado=$this->data['Examene']['resultado']; $conditions=array(); //Bloque #2 Condiciones tabla Alumnos if(!empty($this->data['Examene']['nombre'])){ $conditions['Alumno.nombre LIKE']='%'.$this->data['Examene']['nombre'].'%'; } if(!empty($this->data['Examene']['apellido_paterno'])){ $conditions['Alumno.apellido_paterno LIKE']='%'.$this->data['Examene']['apellido_paterno'].'%'; } if(!empty($this->data['Examene']['apellido_materno'])){ $conditions['Alumno.apellido_materno LIKE']='%'.$this->data['Examene']['apellido_materno'].'%'; } //Bloque #3 Condiciones tabla Examenes if(!empty($alumnoid)){ $conditions['Examene.alumno_id']=$alumnoid; } if(!empty($user)){ $conditions['Examene.user_id']=$user; } //Bloque #4 Condiciones de intervalos de fecha if(!empty($fechaInicio)){ $conditions['Examene.created >'] = $fechaInicio; } if(!empty($fechaFin)){ $conditions['Examene.created <='] =$fechaFin.' 23:59:59'; } if(!empty($formadepago)){ $conditions['Examene.forma_de_pago'] =$formadepago; } if(!empty($resultado)){ $conditions['Examene.resultado'] =$resultado; } //Bloque #5 query $conditions['Examene.statusid <>']=4; $examenes= $this->paginate($conditions); ?>
Bloque #1 asignación de variables
En este caso se manejan dos tablas distintas de la base de datos, están relacionadas entre si, Alumnos y Examenes, utilicé asignación de variables para mas comodidad en su manejo, pero no son necesarias.
Bloque #2 Condiciones de tabla Alumnos
Las condiciones determinan cuando hay datos en los campos, si no hay datos, no hay condición que aplicar y nada que meter en el array, las primeras tres condiciones pertenecen a la tabla alumnos, de la cual se va a buscar por nombre NO exacto por eso los LIKE y la concatenación del símbolo de porcentaje. Para que esto funcione, las relaciones en el modelo deben estar previamente establecidas.
Bloque #3 Condiciones de tabla Examenes
En el segundo bloque ponemos las condiciones de la otra tabla, nada especial ya que los valores de esos campos deben ser exactos.
Bloque #4 Condiciones de intervalos de fecha
Para cuando tenemos intervalos de fechas y tenemos el formato en Datetime, es necesario concatenar la hora en la que termina el dia, si no lo hiciéramos contaría hasta la hora 00:00:00 no devolviéndonos los resultados del ultimo dia especificado.
Bloque #5 Query
La función paginate, se utiliza casi de la misma manera que un find y listo automagicamente cakephp devolverá solo los exámenes de los campos donde se les haya especificado algun dato, notese que este tipo de búsqueda es de tipo AND, o sea cada campo va filtrando aun mas la búsqueda, en lugar de añadir nuevas coincidencias.
Cualquier duda o comentario es bienvenido.
Referencias
Complex Find Conditions
Pagination in cakephp
Hotot – Cliente Twitter
Gwibber el cliente predeterminado para Ubuntu me parece lento, con varios bugs, feo y gastón de memoria, así que usaba la web de twitter en lo que encontraba un cliente que me convenciera, probé varios multiplataforma empezando por los muchos que hay para adobe air, y aunque son bonitos y robustos, terminé descartando todos por que gastan demasiados recursos, muchos solo queremos twittear no sacar estadisticas.
Así que entre los clientes nativos salió uno en python llamado Hotot que aunque sigue en beta tiene desarrollo intenso

Ademas cuenta con soporte para plugins, hay pocos pero efectivos, como para ver las imagenes insertadas, geolocalizacion e incluso traductor.
En el tiempo que lo he llevado probando ronda entre los 40 y 100 megas de ram, y se refresca rapido. La interfaz es intuitiva, pulida, y muy fluida, tambien cuenta con shorcut (Alt+C) para traerlo en pantalla, aunque han aparecido varios bugs, ninguno ha sido de gravedad.
Aunque fue empezado para linux ya es multiplataforma con versiones nativas para cada sistema.
Instalación, sin dar muchas vueltas
$ sudo add-apt-repository ppa:hotot-team $ sudo apt-get update $ sudo apt-get install hotot
Creo que Hotot llegó para quedarse.
Mini-Programas en Java
Programa que pide 2 numeros, y los suma, multiplica y resta.
import java.io.*; public class Calculos { public static void main(String []args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader (isr); try{ System.out.print("Sumando, Restando y Multiplicando : "); int num1 = Integer.parseInt(br.readLine()); int num2 = Integer.parseInt(br.readLine()); int suma = num1 + num2; int resta = num1 - num2; int producto= num1 * num2; System.out.println ("La Suma de " + num1 + "+" + num2 +"="+ suma); System.out.println ("La resta de " + num1 + "-" + num2 +"="+ resta); System.out.println ("El producto de " + num1 + "x" + num2 +"="+ producto); } catch (Exception e) { e.printStackTrace(); } } }
Programa que saca el area de un circulo, y la circunferencia, solicitando el radio.
import java.io.*; public class Circulo { public static void main(String []args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader (isr); try{ System.out.print("Teclee el radio : "); Double radio = Double.parseDouble(br.readLine()); Double area= new Double(3.141592 * (radio*radio)); Double circunferencia = new Double(2 * 3.141592 * radio); System.out.println ("El area del circulo es "+ area.doubleValue()); System.out.println ("La circunferencia del circulo es "+ circunferencia.doubleValue()); } catch (Exception e) { e.printStackTrace(); } } }
Programa que calcula tu edad en años en Jupiter, Mercurio, Venus y Saturno en base a tu edad en años en la tierra
import java.io.*; public class Edad { public static void main(String []args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader (isr); try{ System.out.print("Leyendo su edad : "); Double edad = Double.parseDouble(br.readLine()); Double mercurio= (edad*365)/88; Double venus= (edad*365)/225; Double jupiter= (edad*365)/4380; Double saturno= (edad*365)/10767; System.out.println (" A tus " +edad+ " años de edad tendrias " +mercurio+ " años en Mercurio"); System.out.println (" A tus " +edad+ " años de edad tendrias " +venus+ " años en Venus"); System.out.println (" A tus " +edad+ " años de edad tendrias " +jupiter+ " años en Jupiter"); System.out.println (" A tus " +edad+ " años de edad tendrias " +saturno+ " años en Saturno"); } catch (Exception e) { e.printStackTrace(); } } }
Programa que saca area de una esfera y su volumen.
import java.io.*; public class Esfera { public static void main(String []args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader (isr); try{ System.out.print("Teclee el radio : "); Double radio = Double.parseDouble(br.readLine()); Double area= 4 * 3.141592 * (radio*radio); Double volumen = (4/3 * 3.141592) * radio * radio; System.out.println ("El area de la esfera es "+ area); System.out.println ("El volumen de la esfera es "+ volumen); } catch (Exception e) { e.printStackTrace(); } } }
Programa en java que saca el Area Base del cubo, el area Lateral, el Area Total del cubo, y el volumen del cubo.
import java.io.*; public class Cubo { public static void main(String []args) { InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader (isr); try{ System.out.print("Teclee el tamaño del lado : "); Double lado = Double.parseDouble(br.readLine()); Double areabase= lado * lado ; Double arealateral = 4 * (lado * lado); Double areatotal = 6 * (lado * lado) ; Double volumen = lado * lado * lado; System.out.println ("El Area Base del cubo es "+ areabase); System.out.println ("El Area Lateral del cubo es "+ arealateral); System.out.println ("El Area Total del cubo es "+ areatotal); System.out.println ("El volumen del cubo es "+ volumen); } catch (Exception e) { e.printStackTrace(); } } }
