views

Usando views handlers para mostrar el total de una vista de inventario

Hay veces que quieres desplegar información específica en una vista además de los datos que traes de tus nodos. Bien puede ser para desplegar simplemente una descripción de tu vista, o tal vez un subtítulo con datos de tu argumento, o incluso un subtotal si estás mostrando datos de productos o algo así.

Este tipo de cosas las puedes insertar en el header y footer de tu view. Y en los casos más sencillos puedes simplemente insertar un "text area" donde pongas el texto estático. Pero hay veces que quieres más ;-).

Pudiera ser tentador habilitar el módulo "PHP Filter" y poner código de PHP ahí mismo en tu vista. Para algo sencillo puede ser suficiente, pero si tu código van a ser más de 3 líneas te recomiendo usar un views_handler que sirve precisamente para eso y así podrás meter tu código en un control de versiones y editarlo con vi o emacs.

Manos a la obra, vamos a implementar un modulo views_total para desplegar el total de un inventario. El views_total.info está fácil:

name = Views Total
description = Implements an area handler to display the inventory summary
package = Other
core = 7.x

files[] = views_total.module
dependencies[] = "views"

; Views handlers
files[] = views_total_handler_area_summary.inc

El views_total.module simplemente implemente el hook_views_api para indicarle a views que existimos:

<?php

/**
 * Implements hook_views_api().
 */
function views_total_views_api() {
  return array(
    'api' => 3,
  );
}

En el views_total.views.inc finalmente declaramos nuestro handler que va a estar en la "tabla global" porque no estámos adjuntándonos a ninguna tabla de nuestra BD.

<?php

/**
 * Implements hook_views_data.
 */
function views_total_views_data()
{
  $data = array();

  $data['views_total']['table']['group'] = t('Global');
  $data['views_total']['table']['join'] = array(
    '#global' => array(),
  );

  $data['views_total']['summary'] = array(
    'title' => t('Inventory summary'),
    'help' => t('Display the total of items in the inventory'),
    'area' => array(
      'handler' => 'views_total_handler_area_summary',
    ),
  );

  return $data;
}

Y finalmente, viene el bueno, nuestro handler:

<?php

/**
 * Definir un area handler para que el total del inventario se pueda agregar a la vista
 */
class views_total_handler_area_summary extends views_handler_area {

  function option_definition() {
    $options = parent::option_definition();

    // Quitamos opciones del formulario de edición del handler que no queramos.
    // las opciones vienen heredadas del views_handler_area
    unset($options['empty']);

    return $options;
  }

  function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);

    // Quitamos el empty también del display
    unset($form['empty']);
  }

  // Esto es lo que se va a desplegar en la vista
  function render($empty = FALSE) {
    if (!$empty) {
      $total = 0;
      foreach ($this->view->result as $result) {
        $total += $result->node_taxonomy_index_nid;
      }
      return "<table class="views-table"><tr><th>Total de equipos</th><th class="views-field-nid">$total</th></tr></table>";
    }

    return '';
  }
}

Puedes inspeccionar el $this->view->result con un print_r o un krumo (si tienes devel instalado) para ver qué variables te pueden servir.

Para hacer este modulito me basé mucho en el código del submodulo line_item del módulo commerce para Drupal 7.

Crear un calendario de grupo con drupal

Este tutorial es para sitios en drupal que utilizan el módulo de organic groups para crear comunidades virtuales. Al terminar el módulo tendrás una página donde se mostrarán únicamente las actividades específicas a tu grupo en forma de calendario.

Módulos Necesarios

Primero necesitas tener los siguientes módulos en tu sites/all/modules:

Los módulos que necesitas habilitar para que esto funcione (suponiendo que ya tienes og habilitado) son como mínimo: content, calendar, date, date api, date timezone, views y views ui. Al crear sitios con drupal lo mejor es habilitar los menos módulos posibles, ya que cada módulo que instalas tiene un impacto en el desempeño de tu sitio.

CCK y Date

Ahora hay que crear un tipo de contenido que tenga un campo de fecha. Para esto vamos a admin/content/types y creamos un tipo nuevo. No olvides que este tipo de contenido debe de poder pertenecer a un grupo. Yo le puse evento. Y luego le agregamos un campo de cck, puedes elegir 3 tipos de fecha: datestamp, datetime y date. Date es únicamente la fecha, datetime incluye hora y datestamp es el más específico. O al menos eso parece no? ;-).

Crea algunos eventos de prueba.

Views y Calendar

Ahora viene lo bueno. Ve a la vista de administrar vistas en admin/build/views y activa la vista de calendario que nos va a servir como base. Esta vista la puedes editar para que todos los calendarios que crees tengan ciertos elementos en común:

  1. Por ejemplo, a mi no me gusta que en la vista mensual me muestren el número de semana. Para corregir esto nos vamos a la vista de mes y en basic settings -> calendar damos click en el ícono de settings y deshabilitamos esa opción.

  2. Tampoco me gusta que en la vista se desplieguen las etiquetas de los campos (Título:, Updated date:). Así que las podemos quitar.

  3. Normalmente nada más quieres que se puedan ver los nodos publicados, así que hay que agregar un filtro de Nodo: publicado = TRUE.

  4. Finalmente, el cambio que considero más importante es hacer que las vistas de calendario, por default, utilicen el campo de fecha que acabamos de crear en lugar de la fecha de última actualización de los nodos. Para hacer esto vamos a editar el argumento de fecha (node.changed):

    1. como el sitio está en español, cambia las cadenas que dicen 'all' por 'todos'
    2. quita la palomita al campo Nodo: update date
    3. pon una palomita al campo tu campo de fecha, en mi caso Contenido: Datestamp: Fecha (field_fecha_futura)
    4. guarda tus cambios

Esta vista de calendario (a la que puedes navegar en el url calendar) ya nos sirve como punto de partida, y si la visitas podrás ver una vista general de todas las actividades programadas en tu sitio.

OG, Views y Arguments

Ahora nada más falta hacer una vista que te muestre nada más las actividades del grupo en el que te encuentres. Para esto vamos a usar un elemento muy poderoso de las vistas: argumentos.

Los argumentos sirven para personalizar tu vista de acuerdo a información que reciben de diversas fuentes, normalmente el url de tu vista. Entonces:

  1. Desde la lista de vistas, clona la vista del calendario base (calendar). Yo a esta vista la nombre calendario_grupo y su descripción es eso precisamente: Calendario de grupos. Next.

  2. Vamos a agregar un argumento: Grupos: Grupos. Este argumento lo que hace es mostrar únicamente los nodos que pertenezcan al grupo que especifiques en el argumento. Add.

    Agregar grupo

  3. Este argumento de grupo debe aparecer antes del argumento de fecha, así que hay que reordenarlos presionando este ícono:

  4. Hay que modificar la ruta de la vista de página para que sepa que forzosamente debe llevar un argumento, así que la vamos a cambiar de calendara calendario/%

Y listo, con esto ya sabes lo básico para adecuarla a tus necesidades. Si navegas en tu sitio a (/calendario/id_de_un_grupo)[http://fef-apostolado.org/calendario/50], podrás ver tu vista de calendario ;-).

Subscribe to RSS - views
Drupal theme by Kiwi Themes.