Views es un módulo que usamos todos los Drupaleros en en prácticamente el 100% de nuestros proyectos, con simples pasos podemos agregar gran funcionalidad de nuestro sitio. Sin embargo hay veces que necesitamos hacer algo más, muy específico en nuestro proyecto.
Es en este momento que necesitamos agregar código a nuestras vistas y lo primero con lo que nos topamos buscando es usar views php que nos permite muy rápidamente introducir código en ellas desde la interfaz web. Algo que puede en principio parecer lógico, pero trae una serie de inconvenientes: Es peligroso: Cualquier usuario con los permisos necesarios para editar vistas podrá modificar el código de ellas, que puede resultar en errores en el sitio o introducción al sitio de código malintencionado.
El código vive en la base de datos: Además de que es buena práctica tener nuestro código en archivos, no en base de datos por diferentes razones, a la hora de encontrar un error se vuelve más complicado, porque solo veremos en los logs cosas como “Error en php eval” porque Drupal utiliza php eval para correr el código que se encuentra en base de datos, todo esto fuera de que es difícil de encontrar el código para nuevos desarrolladores de un proyecto.
Problemas de rendimiento: Como mencionado en la mísma página del módulo views_php, su utilización trae problemas de rendimiento. El mismo módulo tiene esta advertencia: “…it is highly advisable to use regular handlers and plugins when available (or even to create one yourself). Take note that filtering and sorting a view using PHP always has a considerable perfomance impact".
Hay diferentes formas de resolver estos problemas, cómo Views handlers y plugins, en este artículo demostraremos cómo realizar un views handler, para evitar agregar este tipo de código utilizando views_php. Antes de comenzar, un views handler es un objeto que es parte de la vista y parte del proceso de armado de los queries de views, que como un hook nos permitirá hacer varias acciones durante el proceso de generar una vista.
Declaramos en nuestro módulo que usaremos el api de views y especificamos el path donde tendremos nuestro handler. mymodule.module /** * Implements hook_views_api. */ function mymodule_views_api() { return array( 'api' => 3, 'path' => drupal_get_path('module', 'mymodule') . '/views', ); }
Declaramos nuestro handler en el archivo /views/mymodule.views.inc /** * Implements hook_views_data(). */ function mymodule_views_data() { /** * Declaramos nuestro nuevo campo custom, y le asignamos su handler respectivo */ $data = array(); $data['node']['my_custom_field'] = array( 'title' => t('This is my custom field'), 'help' => t('Provides a field with some custom code in php.'), 'field' => array( 'handler' => 'mymodule_handler_custom_field', ), ); return $data; }
En el siguiente archivo es donde definiremos la lógica que irá dentro de nuestro nuevo campo custom /views/mymodule_handler_custom_field.inc ''); return $options; } /** * Default options form. * * Definimos el campo de nuestra nueva opción. */ function options_form(&$form, &$form_state) { parent::options_form($form, $form_state); $form['my_option'] = array( '#type' => 'textfield', '#title' => t('Added text'), '#default_value' => $this->options['my_option'], '#description' => t('An option for mymodule custom.'), ); } /** *Renderizar nuestro nuevo campo * * $values nos trae información del row, como el nodo o los campos que tengamos en el view. */ function render($values) { /* y por último usamos lo que se añadió a nuestra nueva opción*/ $links = "You added : " . $this->options['my_option']; $output = $links; return $output; } }
Por último la declaración de nuestro módulo. mymodule.info name = mymodule description = My module core = 7.x package = views version = 7.x-1.0 dependencies[] = views files[] = views/mymodule_handler_custom_field.inc
Con estos pasos hemos creado un nuevo campo, el cual puede ser añadido en views. Para concluir nos damos cuenta que usando el api de views podemos implementar funcionalidades necesarias y completas sin poner en riesgo la seguridad de nuestro sitio, además de tener un orden en nuestro código.
En este ejemplo se implementó algo básico pero sirve para comenzar a usar el api de views, en futuros posts se tocará más a fondo otras funcionalidades.
Código de ejemplo:
https://github.com/mirko49/drupal-knowledges/tree/master/drupal/sites/all/modules/custom/mycustomfield Documentación de views handler: https://api.drupal.org/api/views/handlers!views_handler_field.inc/group/views_field_handlers/7