Muchas veces cuando creamos un sitio web para un cliente este (en la mayoría de los casos) se preguntará si su página está siendo visitada o no?, esto se complica un poco cuando la página está hecha completamente en flash, sin embargo esto es imprescindible para la toma de decisiones con respecto a la publicidad de la página, sino ¿cómo sabemos si la publicidad actual está funcionando?. Y el poner un enlace a uno de esos servicios estadísticos, como que interfieren en nuestros diseños y además se pierde la experiencia del usuario al abrirse un página nueva ajena a nuestro sitio web. Pero no se preocupen para eso está cristalab ;)
En este tutorial explicaré cómo realizar estadísticas de visitas usando Flash Remoting, si no sabes de lo que estoy hablando por favor lee esto primero antes de continuar:
Explicación:
Primero la base de datos, en este caso las visitas se irán registrando por semanas, meses y años.
Nota: La conección a la base se realiza con el servicio consultor, sí la misma que hizo Freddie®
<?php //Clase de conexión simple y consulta a base de datos "Consultor" // Devuelve un recordset de una consulta a Flash // Facilmente extensible usando programación orientada a objetos // Freddie® - http://www.cristalab.com/ class Consultor{ function Consultor(){ $this->methodTable = array( "consulta" =>array ( "description" => "Devuelve un objeto RecordSet a Flash de una consulta pasada por parametro", "access" => "remote", "arguments" => array("sql") ) ); } function consulta($sql){ /* Los datos de la base de datos MySQl El nombre de usuario, el password de acceso y obviamente el nombre de la base de datos CAMBIALOS!!! a los tuyos del servidor o no funcionara */ $cons_user = "root"; $cons_pass = ""; $cons_db = "BASE_DE_DATOS"; //Conecta a la base de datos $dbh=mysql_connect("localhost",$cons_user,$cons_pass) or die ('Error conectandose a la base de datos por: ' . mysql_error()); //Selecciona la base de datos mysql_select_db ($cons_db); //Guarda el resultado de la consulta en un identificador (Puntero) $resultado=mysql_query($sql,$dbh); mysql_close($dbh); //Retorna lo obtenido return $resultado; } } ?>
La misma clase conexion
import mx.remoting.NetServices; import mx.remoting.Connection; import mx.remoting.RecordSet; import mx.remoting.NetServiceProxy; dynamic class Conexion { private var conn:Connection; private var serv:NetServiceProxy; private var servSend:NetServiceProxy; private var padre; public var onConsulta:Function; function Conexion() { NetServices.setDefaultGatewayUrl("http://localhost/remoting/gateway.php"); conn = NetServices.createGatewayConnection(); } private function errorAMF(data) { trace("AMFPHP Error"); trace("En la linea "+data.line); trace("Nivel del error: "+data.level); trace("------------------------------"); trace(data.description); padre.traceObj(data); } public function consulta(SQL:String) { trace("Consultando"); var envio:Object = new Object(); envio.padre = this; envio.onStatus = this.errorAMF; envio.consulta_Result = function(data) { var rs:RecordSet = data; this.padre.onConsulta(rs); }; servSend = conn.getService("Consultor", envio); servSend.consulta(SQL); } function traceObj(obj) { trace("TrazandoObjeto"); for (var i in obj) { trace("\\t"+i+"->"+obj[i]); } } }
En flash creamos un texto dinámico con nombre de instancia "visitas_txt" y con Flash Remoting en la librería, ponemos el siguiente codigo en un keyframe
//inicializamos los contadores para las semanas
semana1 = semana2 = semana3 = semana4 = 0;
//preparamos las fechas
mes = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"];
miFecha = new Date();
hoy = miFecha.getDate();
//loadVars para el registro a la base de datos
receive_lv = new LoadVars();
sender_lv = new LoadVars();
//conectamos con el servicio de consultas
import Conexion;
import mx.remoting.RecordSet;
var db:Conexion = new Conexion();
db.consulta("SELECT * FROM estadisticas"); //consultamos la tabla estadisticas
db.onConsulta = function(rs) {
max=rs.getLength();
if (max > 0){ // entra si hay algun registro en la base
suma = 0;
for (i=1;i<=max;i++){ // contamos todas las visitas registradas
suma += Number(rs.getItemAt(max-i).week1)+Number(rs.getItemAt(max-i).week2)+Number(rs.getItemAt(max-i).week3)+Number(rs.getItemAt(max-i).week4);
}
var str:String = new String(suma+1);
var mtr:Array = str.split("");
visitas_txt.text = mtr.join(" "); //esto es para separar los números
codigo = rs.getItemAt(max-1).codigo;
lastyear = rs.getItemAt(max-1).year;
lastmonth = rs.getItemAt(max-1).month;
lastday = rs.getItemAt(max-1).day;
newmonth = 0;
}else{ // si no hay registro se toman los datos de la máquina del usuario
lastyear = miFecha.getFullYear();
lastmonth = mes[miFecha.getMonth()];
lastday = hoy;
codigo = newmonth = 1;
}
semana1 = rs.getItemAt(max-1).week1;
semana2 = rs.getItemAt(max-1).week2;
semana3 = rs.getItemAt(max-1).week3;
semana4 = rs.getItemAt(max-1).week4;
if (hoy == 1){ // si es un nuevo mes, comprobamos si es así
if (lastmonth == mes[(miFecha.getMonth())-1]){
lastday = newmonth = 1;
semana1 = semana2 = semana3 = semana4 = 0;
codigo++;
if (lastmonth == "Diciembre"){ //si el último mes fue diciembre, entonces hoy es año nuevo :)
lastyear = miFecha.getFullYear();
}
lastmonth = mes[miFecha.getMonth()]
}
}else{ //si no es un nuevo mes, etonces vemos si es un nuevo día
lastday = hoy;
}
if (hoy >= 1 && hoy <= 7){
semana1++;
}else if(hoy >= 8 && hoy <= 14){
semana2++;
}else if (hoy >= 15 && hoy <= 21){
semana3++;
}else if (hoy >= 22 && hoy <= 31){
semana4++;
}
sender_lv.year = lastyear;
sender_lv.month = lastmonth;
sender_lv.day = lastday;
sender_lv.week1 = semana1;
sender_lv.week2 = semana2;
sender_lv.week3 = semana3;
sender_lv.week4 = semana4;
sender_lv.isnew = newmonth; // true || false :: ¿es un nuevo mes o no?
sender_lv.code = codigo;
sender_lv.sendAndLoad("pathvisitor.php", receive_lv, "POST");
receive_lv.onLoad = function() {
trace("NUEVA VISITA REGISTRADA");
}
}
Pasamos los valores de flash para ingresar o modificar la tabla estadísticas en nuestra base de datos, según sea el caso
<?php
$connection = mysql_connect("localhost", "root", "") or die ('Acceso negado a la base');
$db = mysql_select_db("BASE_DE_DATOS") or die ("Base de datos no valida");
$code = $_POST['code'];
$year = $_POST['year'];
$month = $_POST['month'];
$day = $_POST['day'];
$week1 = $_POST['week1'];
$week2 = $_POST['week2'];
$week3 = $_POST['week3'];
$week4 = $_POST['week4'];
$isnew = $_POST['isnew'];
if ($isnew==1){
$Query = "INSERT into estadisticas (`codigo`, `year`, `month`, `day`, `week1`, `week2`, `week3`, `week4`) values ('$code', '$year', '$month', '$day', '$week1', '$week2', '$week3', '$week4')";
$insertar = mysql_query($Query) or die ("no inserto");
}else{
$sql = "UPDATE estadisticas SET week1 = '$week1', week2 = '$week2', week3='$week3', week4='$week4', day='$day' WHERE codigo = $code";
$result = mysql_query($sql);
}
?>
En archivo cubos3D.as creamos las funciones para dibujar los cubos
//creamos los movieClips para los cubos
function crearcubos(){
var d:Number=60;
for (l=1;l<=4;l++)
this.createEmptyMovieClip("superior"+l, d+l);
d +=5;
for (l=1;l<=4;l++)
this.createEmptyMovieClip("lateral"+l, d+l);
d +=5;
for (l=1;l<=4;l++)
this.createEmptyMovieClip("frente"+l, d+l);
}
//cubos3D([posición en x inicial],[posición en y inicial], [valor1], [valor2], [valor3], [valor4]);
function cubos3D(x,yy,y,b,g,w){
//Inicializamos los colores de cada división
colorF1 = 0x999996; //color frontal
colorL1 = 0x666666; //color lateral
colorS1 = 0xDDDDDD; //color de la parte superior
colorF2 = 0xA5BC4E;
colorL2 = 0x738336;
colorS2 = 0xC2CB83;
colorF3 = 0x1B95D9;
colorL3 = 0x126897;
colorS3 = 0x62C0FF;
colorF4 = 0xE48701;
colorL4 = 0x9F5E00;
colorS4 = 0xFEB341;
//creamos los dichosos cubos, con los parametros recogidos
//Primero creamos los mc de la parte superior de los cubos
with (this.superior1) {
lineStyle(1, colorS1, 100);
moveTo(x+18, yy-y-13);
beginFill(colorS1, 100)
lineTo(x+71, yy-y-13); //linea superior
lineTo(x+54, yy-y); //linea derecha
lineTo(x, yy-y); //linea inferior
lineTo(x+18, yy-y-13); //linea izquierda
}
if (b > 0){ // condicionamos para que solo se creen los mc necesarios
with (this.superior2) {
lineStyle(1, colorS2, 100);
moveTo(x+18, yy-y-13-b);
beginFill(colorS2, 100)
lineTo(x+71, yy-y-13-b); //linea superior
lineTo(x+54, yy-y-b); //linea derecha
lineTo(x, yy-y-b); //linea inferior
lineTo(x+18, yy-y-13-b); //linea izquierda
}
}
if (g > 0){
with (this.superior3) {
lineStyle(1, colorS3, 100);
moveTo(x+18, yy-y-13-b-g);
beginFill(colorS3, 100)
lineTo(x+71, yy-y-13-b-g); //linea superior
lineTo(x+54, yy-y-b-g); //linea derecha
lineTo(x, yy-y-b-g); //linea inferior
lineTo(x+18, yy-y-13-b-g); //linea izquierda
}
}
if (w > 0){
with (this.superior4) {
lineStyle(1, colorS4, 100);
moveTo(x+18, yy-y-13-b-g-w);
beginFill(colorS4, 100)
lineTo(x+71, yy-y-13-b-g-w); //linea superior
lineTo(x+54, yy-y-b-g-w); //linea derecha
lineTo(x, yy-y-b-g-w); //linea inferior
lineTo(x+18, yy-y-13-b-g-w); //linea izquierda
}
}
//seguimos con la parte lateral de cada cubo
with (this.lateral1) {
lineStyle(1, colorL1, 100);
moveTo(x+54, yy-y);
beginFill(colorL1, 100)
lineTo(x+71, yy-y-13); //linea superior
lineTo(x+71, yy-13); //linea derecha
lineTo(x+54, yy); //linea inferior
lineTo(x+54, yy-y); //linea izquierda
}
if (b > 0){
with (this.lateral2) {
lineStyle(1, colorL2, 100);
moveTo(x+54, yy-y-b);
beginFill(colorL2, 100)
lineTo(x+71, yy-y-13-b); //linea superior
lineTo(x+71, yy-13-y); //linea derecha
lineTo(x+54, yy-y); //linea inferior
lineTo(x+54, yy-y-b); //linea izquierda
}
}
if (g > 0){
with (this.lateral3) {
lineStyle(1, colorL3, 100);
moveTo(x+54, yy-y-b-g);
beginFill(colorL3, 100)
lineTo(x+71, yy-y-13-b-g); //linea superior
lineTo(x+71, yy-13-y-b); //linea derecha
lineTo(x+54, yy-y-b); //linea inferior
lineTo(x+54, yy-y-b-g); //linea izquierda
}
}
if (w > 0){
with (this.lateral4) {
lineStyle(1, colorL4, 100);
moveTo(x+54, yy-y-b-g-w);
beginFill(colorL4, 100)
lineTo(x+71, yy-y-13-b-g-w); //linea superior
lineTo(x+71, yy-13-y-b-g); //linea derecha
lineTo(x+54, yy-y-b-g); //linea inferior
lineTo(x+54, yy-y-b-g-w); //linea izquierda
}
}
//Y finalmente la parte frontal
with (this.frente1) {
lineStyle(1, colorF1, 100);
moveTo(x, yy-y);
beginFill(colorF1, 100)
lineTo(x+53, yy-y); //linea superior
lineTo(x+53, yy); //linea derecha
lineTo(x, yy); //linea inferior
lineTo(x, yy-y); //linea izquierda
}
if (b > 0){
with (this.frente2) {
lineStyle(1, colorF2, 100);
moveTo(x, yy-y-b);
beginFill(colorF2, 100)
lineTo(x+53, yy-y-b); //linea superior
lineTo(x+53, yy-y); //linea derecha
lineTo(x, yy-y); //linea inferior
lineTo(x, yy-y-b); //linea izquierda
}
}
if (g > 0){
with (this.frente3) {
lineStyle(1, colorF3, 100);
moveTo(x, yy-y-b-g);
beginFill(colorF3, 100)
lineTo(x+53, yy-y-b-g); //linea superior
lineTo(x+53, yy-y-b); //linea derecha
lineTo(x, yy-y-b); //linea inferior
lineTo(x, yy-y-b-g); //linea izquierda
}
}
if (w > 0){
with (this.frente4) {
lineStyle(1, colorF4, 100);
moveTo(x, yy-y-b-g-w);
beginFill(colorF4, 100)
lineTo(x+53, yy-y-b-g-w); //linea superior
lineTo(x+53, yy-y-b-g); //linea derecha
lineTo(x, yy-y-b-g); //linea inferior
lineTo(x, yy-y-b-g-w); //linea izquierda
}
}
}
Creamos el swf para presentar el gráfico estadístico. Debemos tener Flash Remoting en la librería
Nombres de instancia (de arriba a abajo y de izquierda a derecha respectivamente): año_txt, count6_txt, count5_txt, count4_txt, count3_txt, count2_txt, count1_txt, mes1_txt, mes2_txt, mes3_txt, mes4_txt, prev_btn, next_btn
import mx.remoting.RecordSet;
#include "cubos3D.as"
this.next_btn.enabled = false;
this.prev_btn.enabled = false;
this.next_btn._alpha = 50;
this.prev_btn._alpha = 50;
// coordenadas de inicio en x, y (de la posición de inicio del último cubo)
y0 = 252;
xx = 273;
zz = 2.035; //sale de la altura de la tabla menos la altura de un cuadrante y dividido para 100 (243.5-40)/100
bots = 0;
function kogiendo(cc,gx){
crearcubos();
var db:Conexion = new Conexion();
var w1:Array = new Array();
var w2:Array = new Array();
var w3:Array = new Array();
var w4:Array = new Array();
var month:Array = new Array();
var T:Array = new Array();
mes1_txt.text = mes2_txt.text = mes3_txt.text = mes4_txt.text = " ";
db.consulta("SELECT * FROM estadisticas"); //recogemos los datos de la DB
db.onConsulta = function(rs) {
long = rs.getLength()-cc;
año_txt.text = rs.getItemAt(long-1).year;
for (i=1;i<=long;i++){
month[i] = rs.getItemAt(long-i).month;
w1[i] = rs.getItemAt(long-i).week1;
w2[i] = rs.getItemAt(long-i).week2;
w3[i] = rs.getItemAt(long-i).week3;
w4[i] = rs.getItemAt(long-i).week4;
T[i] = Number(w1[i])+Number(w2[i])+Number(w3[i])+Number(w4[i]);
}
if (long > 4){ // condicionales para los botones y los meses
nCube=4;
prev_btn.enabled = true;
prev_btn._alpha = 100;
mes1_txt.text = month[4];
mes2_txt.text = month[3];
mes3_txt.text = month[2];
mes4_txt.text = month[1];
}else{
if (long == 3){ //condicionamos para que no muestre datos que no hay
gx -= 70;
nCube=3;
mes1_txt.text = month[3]; // metemos los meses
mes2_txt.text = month[2];
mes3_txt.text = month[1];
}else if (long == 2){
gx -= 140;
nCube=2;
mes1_txt.text = month[2];
mes2_txt.text = month[1];
}else if (long == 1){
gx -= 210;
nCube=1;
mes1_txt.text = month[1];
}else{
nCube=4;
mes1_txt.text = month[4];
mes2_txt.text = month[3];
mes3_txt.text = month[2];
mes4_txt.text = month[1];
}
prev_btn.enabled = false;
prev_btn._alpha = 50;
}
if (cc == 0){
next_btn.enabled = false;
next_btn._alpha = 50;
}else{
next_btn.enabled = true;
next_btn._alpha = 100;
}
// buscamos el dato mayor en la DB (la semana en la que hubo más visitas)
kk = 1;
for (i=2;i<=4;i++){
if (T[kk] < T[i]){
kk = i;
}
}
// lo dividimos para los 5 cuadrantes que tenemos
mxy = T[kk]/5;
//mxy = Math.round(mxy); //redondeamos el dato
nums = mxy;
//metemos las referencias
count2_txt.text = nums;
nums += mxy;
count3_txt.text = nums;
nums += mxy;
count4_txt.text = nums;
nums += mxy;
count5_txt.text = nums;
nums += mxy;
count6_txt.text = nums;
for (i=1;i<=nCube;i++){
w1[i] = (((w1[i]*100)/T[kk])*zz); //pequeña formula para hacerlos proporcionales
w2[i] = (((w2[i]*100)/T[kk])*zz);
w3[i] = (((w3[i]*100)/T[kk])*zz);
w4[i] = (((w4[i]*100)/T[kk])*zz);
//cubos3D([posición inicio X],[posicion inicio Y],[semana1],[semana2],[semana3],[semana4]);
cubos3D(gx,y0,w1[i],w2[i],w3[i],w4[i]);
gx -= 70; //le bajamos a la posición en x (es decir se grafíca desde el último cubo al primero)
}
}
}
kogiendo(bots,xx);
//kogiendo([4 meses más/menos],[posición X]);
this.next_btn.onRelease = function(){
bots -= 4;
kogiendo(bots,xx);
}
this.prev_btn.onRelease = function(){
bots += 4;
kogiendo(bots,xx);
}
Luego nos quedará algo así:
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario
El autor de este artículo ha cerrado los comentarios. Si tienes preguntas o comentarios, puedes hacerlos en el foro
Entra al foro y participa en la discusión
o puedes...
¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?
Inicia sesión
¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?
Registrate