read

No más código en la base de datos por favor!!! (Parte 1)

Necesito un mínimo de lógica para mostrar este campo en una vista; cuál es la solución más rápida? views_php. ERROR

Necesito un poco de lógica para una condición en rules; con php en una condición o una acción lo podría solucionar. ERROR

Necesito una acción en masa para mis nodos; podría usar views_bulk_operations; pero la acción es personalizada; entonces crearé un componente de rules con código php y lo usaré con vbo. ERROR

Necesito un campo custom en Display Suite; usemos php en un campo de código. ERROR

ERROR, ERROR y ERROR; cualquier cosa que involucre guardar código en la base de datos ya es un error. No se dispone de control de versiones; el sitio podría caerse completamente por un error fatal de php; errores aleatorios pueden empezar a aparecer y solucionarlos es terriblemente complicado debido a que no se sabe de donde proviene; y un largo etcétera. Solución: NUNCA use ningún módulo que almacene código en la base de datos; en su lugar; provea esas cosas desde el código; y su sitio será mucho más mantenible.

Vistas

En el caso de vistas podemos necesitar: campos, filtros, criterios de ordenación, áreas, argumentos y plugins (validación y otros). En este post vamos a trabajar con campos, criterios de ordenación, áreas y un plugin de validación.

Lo primero que hay que hacer es implementar en el .module de tu módulo el hook_views_api

/**
 * Implements hook_views_api().
 */
function mimodulo_views_api() {
    return array("api" => "3.0");
}

Luego; en un archivo .views.inc implementaremos el hook_views_data.

/**
 * Implements hook_views_data().
 */
function mimodulo_views_data() {
  $data = array();
  // Código necesario va aquí.
  return $data;
}

Campos

Campos, filtros, criterios de ordenación y áreas funcionan todos de manera similar: se declaran en el hook_views_data y utilizando un handler custom, se definen de acuerdo con lo necesitado. (Cambiando field por filter, sort o area según corresponda).

/**
 * Implements hook_views_data().
 */
function mimodulo_views_data() {
  $data = array();
  $data['node']['mi_campo'] = array(
    'title' => t('Mi Campo'),
    'help' => t('Ayuda para Mi Campo'),
    'field' => array(
      'handler' => 'node_handler_field_mi_campo',
    ),
  );
  return $data;
}

Ahora lo que queda es crear el handler; para ello podemos extender de views_handler_field o de alguna de las clases que ya extienden de ella (más información aquí)

Este handler se guarda en includes/handlers/ y debe ser referenciado desde el archivo .info del módulo para que views lo pueda detectar.

class node_handler_field_mi_campo extends views_handler_field {

  function construct() {
    parent::construct();
  }

  function query() {
    $this->ensure_my_table();
  }

  function render($values) {
    // En values disponemos de los campos que hayan en la vista.
    // Recomiendo dpm($values); para examinar este objeto.

    // Retornar lo que se desee como valor de este campo.
    return 'mi campo';
  }
}

En la parte 2 de esta entrada veremos acerca de criterios de ordenación y filtros; en la parte 3 rules; y en una cuarta parte se hablará de views_bulk_operations.

Blog Logo

Kevin Jesús Porras Zumbado

Drupal Backend Developer y un poco de site-builder. Me gustan los retos con las tecnologías y siempre aprender cosas nuevas.


Published

blog comments powered by Disqus
Image

Blog de Kporras07

Un intento personal de documentación

Back to Overview