Resultado de etiquetas “php”

Comienzan a aparecer tutoriales y clases en PHP para manejar cómodamente el API de Analytics.

También los hay ya para otros lenguajes:

Tenía pendiente crear un bloque de entradas más vistas (o visitadas) y aprovechando la apertura del API de Google Analytics y lo divertido de la documentación he creado un breve programita en PHP para acceder a esos datos.

Basta con definir GA_LOGIN y GA_PASS con nuestros datos de acceso a Analytics e indicar en GA_IDS el id del perfil a consultar. El último dato también se puede obtener con el API, como explican en el ejemplo de datos de cuenta, pero he preferido indicarlo directamente para simplificar. Para obtener este número basta con entrar en Analytics, editar el perfil que deseemos y copiar el Número de identificación del perfil que nos indica.

Este ejemplo obtiene las 10 páginas con más visitas de la última semana ordenados de forma decreciente por visitas.

<?php
  define
('GA_LOGIN',  'LOGIN');       # cambiar
  
define('GA_PASS',   'PASSWORD');    # cambiar
  
define('GA_IDS',    'ID');          # cambiar
  
define('GA_APP',    'www.mabarroso.com-ga-1.0');

  
# Login
    
$loginURL 'https://www.google.com/accounts/ClientLogin?accountType=GOOGLE&Email='.GA_LOGIN.'&Passwd='.GA_PASS.'&source='.GA_APP.'&service=analytics';
    
$loginData file_get_contents($loginURL);
    list(,
$Auth) = split('Auth='$loginData);

    if (!
$Auth) {
      exit(
'no logged in');
    }

  
# Fijamos user agent y Auth en la cabecera de las peticiones
    
ini_set('user_agent'GA_APP."\r\nAuthorization: GoogleLogin auth=$Auth");

  
# Rango de fechas
    
$dateEnd date('Y-m-d'time()-86400);  // ayer
    
$dateBegin   date('Y-m-d'time()-604800); // la semana pasada

  # Consulta
    
$data file_get_contents('https://www.google.com/analytics/feeds/data?ids=ga:'.GA_IDS.'&dimensions=ga:pagePath&metrics=ga:pageviews&sort=-ga:pageviews&start-index=1&max-results=10&start-date='.$dateBegin.'&end-date='.$dateEnd);
    
$data str_replace(array('dxp:dimension','dxp:metric'), array('dxpdimension','dxpmetric'), $data);
    
$xml simplexml_load_string($data);

  
# Datos
    
$i 0;
    foreach (
$xml->entry as $entry) {
      echo ++
$i.' '.$entry->dxpdimension['value'].' : '$entry->dxpmetric['value'] .'<br/>';
    }
?>

He tenido problemas al recuperar los valores dxp:dimensión y dxp:metric con SimpleXML. No es una solución elegante pero, para salvar el obstáculo, reemplazo esas cadenas de texto por otras que no dan problemas (les quito los dos puntos).

lo más visto

Actualizado 24/4/2009 8:45. He usado el código anterior como base para actualizar a diario el nuevo bloque Lo más visto en la barra de la derecha, según los datos de Google Analytics.

Con una tarea programada para ejecutarse una vez al día: se recuperan los datos, se construye el código HTML y se guarda en archivo. La consulta a Google no se hace en cada petición. Es innecesario. Por el momento son las entradas más vistas durante la última semana, como en el código de ejemplo. Con el paso del tiempo comprobaré si conviene acortar o alargar el periodo.

Ahora se me ocurre que también sería interesante hacer otro bloque que fuera La entrada más vista ayer. Valdría el mismo código, cambiando la fecha inicial por $dateBegin = date('Y-m-d', time()-172800); (fecha actual menos el número de segundos de dos días). Por optimizar, también se puede cambiar en la url de la consulta max-results=1 y así obtener un único resultado en vez de 10.

-¿Cómo explicaría a un niño qué es PHP?

-¿Sabes esa cosa llamada Internet donde puedes ir a sitios como Youtube o Yahoo? PHP es la herramienta que usan estas compañías para crear sus sitios web.

Esta pregunta forma parte de la entrevista de Mercè Molist a Zeev Suraski, israelí de 31 años que en vez de ir a clase aprovechó la universidad para pasar horas escribiendo código con su amigo Andi Gutmans, creando PHP. Hoy dirigen su propia compañía, Zend Technologies.

Sigue en http://ww2.grn.es/merce/2007/php.html

La transcripción íntegra de la entrevista está en http://ww2.grn.es/merce/2007/phpfull.html

Visto en Port 666

Uno se acostumbra rápido a no necesitar pensar y enseguida recurre a buscadores para ahorrarse un mínimo esfuerzo. He buscado la forma de generar fechas en formato W3C en PHP y curiosamente no he encontrado nada. Es realmente trivial, pero aún así, espero que esto le pueda ahorrar ese esfuerzo a alguien.

La norma ISO 8601 especifica la notación estándar utilizada para almacenar las fechas. Esta notación facilita la migración entre distintas plataformas. Se especifica en el documento W3C NOTE-datetime.


  $TZD = date('O');
  $TZD = substr($TZD, 0, 3).':'.substr($TZD, 3);
  echo date('Y-m-d\TH:i:s.0').$TZD;

Si dispones de PHP 5.1.3 o superior el código se reduce a esto (no lo he probado):


  echo date('Y-m-d\TH:i:s.0P');

Para una aplicación basada en AJAX usando Prototype resulta muy útil el uso de referencias locales (named anchors) para que el navegador nos muestre la porción de la página adecuada. Un ejemplo sería:

<?=$ajax->link('Añadir', null, array('fallback'=>'#add', 'url'=>"/miapp/add/", 'update'=>"add", 'complete'=>"new Effect.Appear('add');")) ?>
<a name="add"></a>
<div id="add" style="display:none"></div>

Este código se ejecuta sin problemas en Firefox, sin embargo en Internet Explorer su comportamiento es irregular, llegando a no hacer nada (aparentemente) la mayoría de las veces y no indicando un error en ningún momento. El problema comienza al tener el identificador de la capa (DIV) y el nombre del marcador (anchor) exactamente iguales. La solución más simple es llamarlos de forma diferente.

<?=$ajax->link('Añadir', null, array('fallback'=>'#add_pos', 'url'=>"/miapp/add/", 'update'=>"add", 'complete'=>"new Effect.Appear('add');")) ?>
<a name="add_pos"></a>
<div id="add" style="display:none"></div>

Las restricciones de seguridad que impiden a javascript a acceder al sistema de archivos no nos permiten poder realizar tareas como el envío de ficheros al servidor (upload). Si pretendíamos realizar esto con Ajax nos golpearemos con un muro una y otra vez. Sí es posible emular un comportamiento similar al que conseguiríamos con Ajax usando las ya viejas técnicas de iframes ocultos.

La simulación consiste básicamente en realizar el en envío del formulario (submit) teniendo como destino (target) un iframe oculto del que podemos capturar el evento onload para detectar la finalización del envío del archivo.

Para practicar con esto he preparado un ejemplo usando Cake en Laboratorio cakePHP: #0608111 ajax upload. El ejemplo consiste en poder subir archivos sin "recargar" la página. Mediante Ajax se muestran los seis últimos archivos subidos y sus tamaños en bytes. En el formulario tenemos la suma del tamaño de los archivos (actualizado con Ajax) y un campo en el que podemos añadir una cantidad para realizar la suma al pulsar en "Calcular", momento en el que se recargará la página.

Aunque puede no aparecer útil, he creado un dbo_dummy que me permite trabajar sin conexión a base de datos. De esta forma puedo hacer pruebas y barbaridades sin estar conectado una base de datos cuando realmente no la necesito. Lo he creado siguiendo los pasos de como usar nuestro propio dbo en cakePHP

Aunque cakePHP ya cuenta con acceso a las bases de datos más usuales, puede ocurrir que necesitemos añadir un nuevo dbo programado por nosotros.

Para crear el nuevo dbo_mio en cakePHP versión 1.1.6.3264 deberemos:

  1. Crear un archivo vacío como app/models/dbo/dbo_mio.php. La utilidad de este archivo es permitir el correcto funcionamiento de file_exists en connection_manager.php (línea 150). Se debe a un pequeño bug, por el que busca que el archivo exista en una ruta y luego lo toma de otra ruta distinta..
  2. Creamos el verdadero archivo como app/models/datasources/dbo/dbo_ mio.php

Por defecto, cakePHP viene preparado para trabajar en el directorio base del servidor del dominio, como https://www.mabarroso.com. Es muy común que necesitemos que trabaje en una URL distinta, como https://www.mabarroso.com/miaplicacion/. Esto es muy simple de conseguir modificando dos archivos .htacces:

miaplicacion\.htaccess
       RewriteEngine on
       RewriteRule    ^$ /miaplicacion/app/webroot/    [L]
       RewriteRule    (.*) /miaplicacion/app/webroot/$1 [L]
miaplicacion\app\webroot\.htaccess
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ /miaplicacion/app/webroot/index.php?url=$1 [QSA,L]

Los teclados de muchos desarrolladores se están revolucionando con Rails. Otros se resisten a pasarse a Ruby por distintas razones. Con el objetivo de trabajar con PHP con una aproximación bastante buena de las ventajas que ofrece Rails nos encontramos CakePHP.

CakePHP es un framework MVC inspirado en Rails. Adopta de él su filosofía y mucho de su funcionamiento, aunque detalles propios de Rubi no compatibles con PHP han sido adaptados lo mejor posible.

Comenzar a trabajar con CakePHP es inmediato. No se necesitan crear ficheros de configuración. Simplemente hay que definir la conexión a la base de datos y comenzar a crear las clases que necesitemos. Si nos ajustamos a sus reglas para definir los nombres (en ingles) de las clases, vistas y tablas las líneas de código se reducen ya que Cake será capaz de enlazar los distintos elementos modelo-vista-controlador. Incluye asistencias para AJAX, HTML, Javascript, CSS y formularios entre otros.

Las pegas principales son la aún escasa información en la web y la mala organización del manual, que se apoya excesivamente en un wiki poco actualizado y con entradas muy obsoletas. Para iniciarte el tutorial es rápido y completo.

1