Punksolid Tecnologia, Curiosidades, Sistemas de Informacion y un poco de Religion

12ago/114

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

4abr/1110

Invitar a todos tus amigos de Facebook a un evento.

Actualización: Para la fecha 30 de julio de 2011 este método ya no funciona. Pase a ver, Invitar a todos en facebook

En internet está plagado de instrucciones para hacerlo, pero como facebook cambia constantemente su funcionamiento, dichas instrucciones dejan de funcionar, está manera recién la probé con éxito sobre Firefox 4.

1. Nos ponemos en la pagina del evento.

2. Seleccionamos el botón de seleccionar invitados de la parque izquierda.

3. En la barra de direcciones donde está la URL, copiamos y pegamos lo siguiente:

javascript:var elms=document.getElementsByName("checkableitems[]");for(var count=0;count<elms.length;count++){var t = setTimeout("elms["+count+"].click()",100)}

Luego esperamos unos segundos o minutos según la velocidad de la computadora y el numero de amigos, y damos clic en enviar invitaciones.

Fuente | Invitar a todos tus amigos a un evento en Facebook (Nueva forma)

30sep/092

Sistema de Votaciones de Youtube

Recientemente Youtube publicó en su blog, unos datos interesantes acerca de su sistema de votaciones de videos donde publicó la siguiente gráfica:

Grafico de votos de Youtube

Grafico de votos de Youtube

Análisis

Al parecer los usuarios de Youtube solo votan los vídeos que les gustan y como les gustan votan con 5 estrellas, y en menor cantidad votan por 1 estrella los vídeos que no les gustan, a mi parecer este sistema de votaciones no está funcionando como se esperaba, de hecho yo voto casi todos los vídeos, y rara vez pongo 2, 3 o 4 estrellas.

Otros servicios

En Facebook está el 'Me gusta' lo cual le dá un valor positivo, pero no podemos saber a cuantos usuarios No les gusta, lo cual podría servir para saber que artículos son peores que otros, y no dejarlos empatados con otros que sean parecidos.

También está el caso de la votación de comentarios que es en base 2, positivo o negativo, no hay de otra, pero eso creo tiene un inconveniente, cuando votas positivo ¿que estás votando? el video o ¿estás de acuerdo con lo que dice el video? por ejemplo un video podría hablar datos concisos de un partido político que NO me gusta, entonces no me atrevería a votarlo negativo por que puede ser verídico pero no me gusta.

Mi propuesta

No sé si aplique exactamente a youtube, pero a un sistema de contenidos si aplicaría, un sistema de votaciones en base 3, donde sea un voto en contra, un voto a favor y una mención honorífica, donde esta tenga un valor mayor a un voto a favor pero con la característica de pagar por votar, sugiriendo un costo de unos centavos.

Talvez pagar suene demasiado complejo, pero una integración con un sistema de pagos no es tan difícil, y por supuesto creo que casi todo el pago por votos de la mención honorífica debería ir al creador del vídeo, eso seria un incentivo financiero, y a su vez un orgullo el hecho de que alguien se atreva a pagar, por un vídeo que tu hiciste.

Ustedes mi ávidos lectores denle like en donde me lean, y luego me dicen ¿que opinan?

Referencias

Maestros del Web | Me gusta y punto

23sep/093

Hacer Visible Desde Internet Mi Localhost En Linux Ubuntu

Escenario

  • Ubuntu 9.04
  • Infinitum Router 2 wire
  • Inadyn
  • Dyndns

Tutorial rápido

  1. Modo desmilitarizado
  2. Crear y configurar cuenta Dyndns
  3. Configurar programa cliente

    Tutorial a detalle

    Dyndns

    Suponiendo que ya tenemos el locahost jalando, ocupamos un servidor DNS, para eso hay un servicio gratuito de subdominios en www.dyndns.org, ahi creamos una cuenta y la confirmamos en el correo electronico.

    Nos vamos a la pagina y accesamos con nuestro usuario y contraseña, en la pantalla principal elegimos "Add Host Services" ahi tendremos un formulario donde elegiremos el nombre de nuestro host en mi caso punksolid.ath.cx clickeamos en "Use auto detected IP address 189.186.17.219" y luego "Add To Cart" -> "Next" -> "Activate Services"

    Desde ahí ya tenemos configurado nuestro dominio en Dyndns, todavia no podemos acceder a la direccion que hayamos elegido.

    Configuración del router

    Primero que nada, con megared no lo podrán hacer visible desde Internet, solo desde otros usuarios de megared, ya que no es posible configurar una computadora con el modo desmilitarizado o DMZ.

    La otra opción es con infinitum, entrando a la configuración desde el navegador, para eso, en nuestro firefox u opera escribimos http://home/, y luego en "Ver la red domestica" -> " Modificar la configuración del cortafuegos", esa ultima opción la elegimos sobre la computadora que desees hacer visible, por ultimo escribimos la contraseña en caso de que nos la pida y seleccionamos la opción de "Permitir todas las aplicaciones (modo DMZplus(Zona desmilitarizada))" y Aceptar.

    Configuración de la aplicación cliente

    Se supone que tenemos una ip dinámica y por eso ocupamos una aplicación que le esté diciendo al servidor dns que nuestra ip ha cambiado.

    En los repositorios de Ubuntu hay varias aplicaciones ya listas para instalar, este ejemplo será con una aplicación de consola que se llama inadyn para eso escribimos en consola:

    sudo apt-get install inadyn

    Después de instalado ya solo ocupamos un ultimo paso, configurar la aplicación para que se conecte a nuestra cuenta de dyndns, para eso tecleamos en la consola el siguiente formato:

    inadyn --username usuario -p contraseña -a punksolid.ath.cx

    Y listo. Ya debería de funcionar, y si no funciona solo hay que reconectarse a la red.

    Alguna duda o sugerencia, siéntete libre de comentar

    15sep/093

    Como Actualizar un Div con Ajax y CakePHP 1.2

    Empezaré suponiendo que tienes nociones básicas sobre CakePHP1.2 y sabes hacer de perdida un CRUD.

    Agregar las librerías javascript

    Cakephp tiene una buena integración con las librerías javascript de prototype y scriptaculous, las cuales debemos descargarlas primero desde la pagina de descarga de scriptaculous y la de descargas de prototype, la de prototype es un archivo js. Renombrar a prototype.js y ponlo en "app/webroot/js".

    La librería de scriptaculous es un archivo .zip que contiene una carpeta src que a su vez contiene muchos archivos js los cuales debemos copiar y ponerlos también en la app/webroot/js.

    Añadir los helpers javascript y ajax al controlador

    Ahora necesitamos agregar los helpers de javascript y de ajax. Una opcion es agregarlos a cada controlador a como la vayamos necesitando o agregarlos al app_controller para que estén disponibles en todos los controladores.

    class AppController extends Controller {
    var $helpers = array('Html','Form','Javascript','Ajax');
     
    }
    <h3>Vistas</h3>
    Cada vista que sue javascript debemos añadirle las siguientes etiquetas
    <?php
    echo $javascript->link('prototype');
    echo $javascript->link('scriptaculous');
    ?>
    <h2>Ajax 3 - testing ajax link and button</h2>
    <?php
            $link_array1 = array('controller'=>'tweets' ,'action'=>'simple_ajax1_fcn');
    		//the function to execute: function ajaxfcn1 in controller tests
            $link_array2 = array( 'update' => 'divout');
     
           echo ($ajax->link('this an ajax link', $link_array1,$link_array2));
            echo "<br/><br/>";
    ?>
     
    <br/>
    <div id="divout">
    the div to update
    </div>

    Controlador

    <?php
    class TweetsController extends AppController {
     
            var $name = 'Tweets';
            var $uses = array();            // prevent cake from looking for a database model
    		var $helpers = array('Html','Ajax','Javascript');
            function index() {
     
            }
            function simple_ajax1_fcn() {
                    $this->autoRender = false;
                    echo "text from ajax call";
            }
    }?>