Julio 04, 2013
enzo
Es muy común usar el módulo del core de Drupal statistics para ver cuantas veces un nodo ha sido visitado, pero el detalle es que esto nos brinda suficiente información y no valida cosas como las visitas realmente única y otras estadísticas. Para esto es muy común usar el servicio de Google Analytics y su integración con Drupal con el módulo google_analytics el cual nos brinda esta integración.
Con la integración hecha por el módulo de google_analytics tenemos mas información acerca de nuestros visitantes, pero no tenemos una integración a fondo con Drupal en términos de poder sacar reportes personalizados como: Autores mas visitados, Taxonomías mas visitas y cualquier otra consulta por el estilo.
A continuación voy a presentar un ejemplo de como hacer un reporte de los autores mas visitados y los blog mas visitados en el presente mes tomando los datos de Google Analytics.
- Instalar integración de datos con Google Analytics.
Lo primero que debemos hacer es instalar y configurar el módulo Google Analytics Reports el cual permite extraer la información de Google Analytics y generar reportes dentro de Drupal similares a los que se aprecian al ingresar a la página de Google Analytics como se puede apreciar en la siguiente imagen.
Una ves instalado y configurado el módulo Google Analytics Reports nos permitirá crear nuestros propios reportes.
- Crear nueva página de reportes.
Lo primero que debemos hacer es registrar un menu para nuestra página de estadísticas como se muestra a continuación utilizando el hook hook_menu().
/**
* Implements hook_menu().
*/
function MIMODULO_menu() {
$items = array();
$items['contribuciones'] = array(
'title' => 'Monthly report of contributions',
'page callback' => 'MIMODULO_top_contributions',
'access arguments' => array('access administration pages'),
'type' => MENU_CALLBACK,
);
return $items;
}
Con la anterior implementación registramos la URL contribuciones dentro de nuestro Drupal, pero solo tendrán acceso los usuario que tengan el permiso ”access administration pages“.
- Crear función para generar reporte.
A continuación el listado completo de la función que genera el reporte y luego analizaremos cada uno de sus componentes mas importantes.
function MIMODULO_top_contributions() {
$output = '';
$cache = cache_get('ga_monthly_contributions_report');
if($cache->data) {
$feed= $cache->data;
} else {
$params = array(
'metrics' => array('ga:pageviews'),
'dimensions' => array('ga:pageTitle', 'ga:hostname', 'ga:pagePath'),
'filters' => array('ga:pagePath=~/blog/*'),
'sort_metric' => array('-ga:pageviews'),
'start_date' => strtotime(date('Y-m-01')),
'end_date' => strtotime('-1 day'),
'sort' => '-ga:pageviews',
'max_results' => 500,
);
$feed = google_analytics_api_report_data($params);
if ($feed->error) {
return t('There are not stats available');
}
cache_set('ga_monthly_contributions_report', $feed, 'cache', 60*60*24); //1 day
}
$query = db_select('node', 'n');
$query->join('users', 'u', 'n.uid = u.uid');
$query->fields('n',array('title','nid'));
$query->fields('u',array('name','uid'));
$query->condition('n.changed',strtotime(date('Y-m-01')),'>=');
$query->condition('n.type','blog');
$query->condition('n.status',1);
$results = $query->execute()->fetchAll();
foreach ($results as $blog) {
$blogs[$blog->nid] = (array) $blog;
$sort_page_views[$blog->nid] = 0;
}
$blog_authors = array();
foreach ($feed->results as $result) {
$real_path = drupal_get_normal_path(ltrim($result['pagePath'],'/'));
if(strstr($real_path, 'node/')) {
list($none,$nid) = explode('node/', $real_path);
if(in_array($nid, array_keys($blogs))) {
$blogs[$nid]['pageviews'] = $result['pageviews'];
$sort_page_views[$nid] = $result['pageviews'];
$blog_authors[$blogs[$nid]['uid']]+= $result['pageviews'];
}
}
}
$header = array(t('Author'), t('Page Views'));
$rows = array();
arsort($blog_authors);
foreach ($blog_authors as $uid => $page_views) {
if($uid) {
$account = user_load($uid);
$row = array();
$row[] = l($account->name, 'user/' . $uid, array('attributes' => array('target'=>'_blank')));
$row[] = $page_views;
$rows[] = $row;
}
}
$output = '<h2>' . t('Most viewed contributors') . '</h2>';
$output .= theme('table', array('header' => $header, 'rows' => $rows));
array_multisort($sort_page_views, SORT_DESC, $blogs);
$rows = array();
foreach ($blogs as $blog) {
if(isset($blog['nid']) and $blog['pageviews']) {
$row = array();
$row[] = l($blog['name'], 'user/' . $blog['uid'], array('attributes' => array('target'=>'_blank')));
$row[] = l( $blog['title'], 'node/' . $blog['nid'], array('attributes' => array('target'=>'_blank')));
$row[] = $blog['pageviews'];
$rows[] = $row;
}
}
$header = array(t('Author'), t('Publication'),t('Page Views'));
$output .= '<h2>' . t('Most viewed contributions') . '</h2>';
$output .= theme('table', array('header' => $header, 'rows' => $rows));
return $output;
}
3.1 Obtener los datos de Google Analytics.
Lo primero que debemos hacer una la consulta a Google Analytics, lo cual haremos con el siguiente código.
$cache = cache_get('ga_monthly_contributions_report');
if($cache->data) {
$feed= $cache->data;
} else {
$params = array(
'metrics' => array('ga:pageviews'),
'dimensions' => array('ga:pageTitle', 'ga:hostname', 'ga:pagePath'),
'filters' => array('ga:pagePath=~/blog/*'),
'sort_metric' => array('-ga:pageviews'),
'start_date' => strtotime(date('Y-m-01')),
'end_date' => strtotime('-1 day'),
'sort' => '-ga:pageviews',
'max_results' => 500,
);
$feed = google_analytics_api_report_data($params);
if ($feed->error) {
return t('There are not stats available');
}
cache_set('ga_monthly_contributions_report', $feed, 'cache', 60*60*24); //1 day
}
En el código anterior lo primero que hacemos en la línea # 1 es tratar de obtener los datos del cache de Drupal con la llave ga_montly_contributions_report, esta llave se ha definido arbitrariamente y podría ser cualquier valor, en caso de que obtengamos datos nos ahorramos el proceso de volver a consultar a Google Analytics lo que haría que nuestra página cargue mas rápido.
Entre las líneas 5 a la línea 15 configuramos la consulta a Google Analytics entonces le informamos que métricas deseamos obtener (línea 6, que dimensiones (línea 7), el rango de fecha (líneas 10 y 11), como debe estar ordenado (línea 12) y la cantidad de resultados que deseamos obtener (línea 13).
Tal vez la opción la mas importante en este ejemplo es el filtro definido en la línea 8 para obtener solo los datos references a las vistas que tengan en su URL el patrón ”~/blog/*” ya que nuestro reporte solo utilizara estas páginas.
Al finalizar se hace la consulta a Google Analytis usando la function google_analytics_api_report y si la consulta es satisfactoria se guardara en el cache usando la función cache_set.
3.2 Obtener datos de entradas de blog.
Como una dificultad más al problema solo presentaremos las estadísticas de las entradas de blog creadas en el mes en curso, para lo cual haremos una consulta a la base de datos usando la abstracción de PDO como se ve en el siguiente código.
$query = db_select('node', 'n');
$query->join('users', 'u', 'n.uid = u.uid');
$query->fields('n',array('title','nid'));
$query->fields('u',array('name','uid'));
$query->condition('n.changed',strtotime(date('Y-m-01')),'>=');
$query->condition('n.type','blog');
$query->condition('n.status',1);
$results = $query->execute()->fetchAll();
foreach ($results as $blog) {
$blogs[$blog->nid] = (array) $blog;
$sort_page_views[$blog->nid] = 0;
}
Los datos retornados se procesan para crear dos arreglos, el primer arreglo contendrá los blogs y el indice de cada blog sera el NID, el segundo arreglo se usar para almacenar el numero de veces que se ha visto la publicación y se que utilizara para hacer un ordenamiento posterior.
3.3 Integrar datos de Drupal y Google Analytics.
Ahora vamos a procesar los datos que se obtuvieron de Google Analytics para emparejarlos con los datos de Drupal, esta operación se lleva a acabo con el siguiente código.
$blog_authors = array();
foreach ($feed->results as $result) {
$real_path = drupal_get_normal_path(ltrim($result['pagePath'],'/'));
if(strstr($real_path, 'node/')) {
list($none,$nid) = explode('node/', $real_path);
if(in_array($nid, array_keys($blogs))) {
$blogs[$nid]['pageviews'] = $result['pageviews'];
$sort_page_views[$nid] = $result['pageviews'];
$blog_authors[$blogs[$nid]['uid']]+= $result['pageviews'];
}
}
}
Veamos un poco la lógica del código anterior.
Primero que debemos es validar si la URL provista por Google Analytics verdaderamente pertenece a un nodo y eso lo hacemos usando la función drupal_get_normal_pathy validando que el valor retornado tenga la cadena “node/” para verificar que sea un nodo de Drupal.
Cuando ya hemos determinado que es un nodo también se verifica que sea un nodo de la lista de nodos que ya hemos armado para los blogs creados en el presente mes. Cuando ya todo esto se ha validado actualizamos el pageviews de nada nodo, el arreglo de pageviews que vamos a usar para el ordenamiento y actualizamos las estadísticas para el autor del blog.
4. Imprimir datos de los principales contribuidores
Cuando ya tenemos los datos de los pageviews para cada autor lo que resta es hacer la impresión en un formato tabulado, como se muestra en siguiente código.
$header = array(t('Author'), t('Page Views'));
$rows = array();
arsort($blog_authors);
foreach ($blog_authors as $uid => $page_views) {
if($uid) {
$account = user_load($uid);
$row = array();
$row[] = l($account->name, 'user/' . $uid, array('attributes' => array('target'=>'_blank')));
$row[] = $page_views;
$rows[] = $row;
}
}
$output = '<h2>' . t('Most viewed contributors') . '</h2>';
$output .= theme('table', array('header' => $header, 'rows' => $rows));
Quizas lo mas relevante en el código anterior es el uso de la función arsort, esta función ordena en orden inverso el arreglo manteniendo los indices.
La salida de esta función seria algo similar a lo presentado en la siguiente imagen.
5. Imprimir datos de blogs mas leídos.
Para finalizar voy a mostrarles como generar el reporte de los blogs mas leídos usando el siguiente código.
array_multisort($sort_page_views, SORT_DESC, $blogs);
$rows = array();
foreach ($blogs as $blog) {
if(isset($blog['nid']) and $blog['pageviews']) {
$row = array();
$row[] = l($blog['name'], 'user/' . $blog['uid'], array('attributes' => array('target'=>'_blank')));
$row[] = l( $blog['title'], 'node/' . $blog['nid'], array('attributes' => array('target'=>'_blank')));
$row[] = $blog['pageviews'];
$rows[] = $row;
}
}
$header = array(t('Author'), t('Publication'),t('Page Views'));
$output .= '<h2>' . t('Most viewed contributions') . '</h2>';
$output .= theme('table', array('header' => $header, 'rows' => $rows));
Para garantizar que los datos estarán ordenados hacemos uso del arreglo que se había creado anteriormente $sort_page_views para ordenar el arreglo $blogs utilizando la función array_multisort que nos permite ordenar arreglos multi dimensionales y el resto ya es solo labor de carpintería, el reporte seria similar al presentado en la siguiente imagen.
Espero que haya sido de su agrado.