Cómo incluir código PHP en Drupal 8 Views

Author Top
enzo

¿Te acuerdas de la última vez que trataste de resolver un problema en un website, con un pequeño trozo de PHP en tus Vistas utilizando el modulo Views custom field en Drupal 6 y Views PHP en Drupal 7? No mientas, a todo el mundo hizo esto al menos una vez en su vida.

Aunque ambós modulos son aceptados por  el equipo de seguridad de Drupal, esta solución es muy peligroso porque ejecuta código PHP usando la función eval. Ejecutar código PHP cargado de la base de datos es realmente malo en términos de seguridad y estabilidad.

Por otra parte, si alguien está auditando tu código, ésta es la primera mala práctica que el auditor tratará de encontrar en tu código y si la encuentra obtendrás la recomendación de que debes crear tu propio View Field handler, con el fin de mejorar la calidad de tu código. Pero para ser honesto, lo he hecho en el pasado e incluso varias veces y siempre encuentro este proceso muy dificil.

Hoy en día la comunidad Drupal está muy entusiasmada con el lanzamiento de la primera versión oficial de Drupal 8, así que es hora de empezar con los articulos clásicas, acerca de cómo hacer nuestras viejas prácticas en esta nueva cosa. Hoy voy a compartir contigo la forma de evitar el uso de módulos del tipo de Views PHP y áun ser capaz de incluir PHP en tu vistas, pero todavía pasar la auditoría de código: P.

En este articulo, voy a utilizar el proyecto Drupal Console para facilitar mi trabajo.

1. Crear un módulo de Drupal 8.

Para generar un módulo tenemos dos opciones, la primera es utilizando el modo interactivo, donde la aplicación le pedirá que todas las opciones disponibles en el comando. Utilice el siguiente comando para ejecutar el modo interactivo, como se puede ver en la siguiente image.

$ drupal generate:module

La segunda opción ejecuta el comando, pero que pasa todas las opciones en línea como se puede ver a continuación.

$ drupal generate:module --module="No Views PHP" --machine-name=no_views_php --module-path=/modules/custom --description="Custom views field to include PHP logic in views." --core=8.x --package=Other

2. Generar un View field personalizado.

Views ahora son parte del núcleo de Drupal 8, y eso cambia todo en Views a nivel interno. Como he dicho antes "Drupal 8 es un nuevo proyecto con el mismo nombre y lógica". Así que si usted sabía algo acerca de Views field, no sera demasiado útil en términos de código para Drupal 8, pero la lógica, en general, sigue funcionando.

En Drupal 8 Views, todo se maneja a través de plugins y los campos no son la excepción, si usted necesita crear un campo personalizado debe generar Views field plugins personalizados. Afortunadamente, hice un generador para esta tareas en el proyecto **Drupal Consola**, a continuación como ejecutar el comando para generar un Views field plugin.

$ drupal generate:plugin:views:field --module=no_views_php --class-name=PHPViewsField --title="PHP Field" --description="Enable to include and run PHP code in your modules as part of a view"

El comando anterior generará los siguientes archivos:

Site path: /Users/enzo/www/drupal8-rc1
1 - modules/custom/no_views_php/no_views_php.views.inc
2 - modules/custom/no_views_php/src/Plugin//views/field/PHPViewsField.php

3. Instalar el módulo.

Ahora necesitamos instalar nuestro módulo generado con el siguiente comando.

$ drupal module:install no_views_php

Ahora si editas la vista Frontpage en http://example.com/admin/structure/views/view/frontpage puede utilizar el campo personalizado generado después de cambiar el modo de presentación de contenido para mostrar campos como se puede ver en la siguiente imagen .

Consejo: Si usted no ve su campo generado, intente ejecutar  $ drupal cache:rebuild all de nuevo :P

Después de aplicar la configuración mínima para el campo, obtendrá una vista previa vista similar a esta imagen:

El Views field plugin generado, por defecto devuelve una cadena aleatoria, sólo para demostrar que está funcionando. Ahora tu debes thacer tu magia en tu módulo personalizado.

4. Implementación de la lógica

Con el fin de implementar su lógica personalizada tiene que editar en el módulo el archivo generado modules/custom/no_views_php/src/Plugin//views/field/PHPViewsField.php y más específica dentro del método render, este método recibe un objeto Drupal\views\ResultRow  como un parámetro.

El método predeterminado generado sera similar siguiente fragmento de código.

public function render(ResultRow $values) {
  // Return a random text, here you can include your custom logic.
    // Include any namespace required to call the method required to generte the
    // output desired
    $random = new Random();
    return $random->name();
}

Ahora voy a cambiar la lógica para utilizar el campo de título en cada  fila para imprimirlo de forma reversa, como se puede comprobar en el siguiente código.

public function render(ResultRow $values) {
    // Return a random text, here you can include your custom logic.
    // Include any namespace required to call the method required to generte the
    // output desired
    $title = strip_tags($this->view->field['title']->original_value);
    return strrev($title);
}

Como resultado ahora nuestro campo será diferente, consulte la siguiente imagen.

Como se puede ver esta otra aplicación tonta de un PHP personalizado, pero ahora se puede incluir en esta clase cualquier servicio necesario para hacer tu magia y transformar cada fila de una vista con otros campos de fila como entrada.

Incluso mejor, ya que puede incluir en su código un controlador de excepciónes si se requiere, por lo que su código podría ser tan complejo y profesional como usted desee.

Si tes estas preguntando por qué no contribuyen esto, como un reemplazo de Views PHP en Drupal 8. Yo creo que ya quetenemos un generador en el proyecto Drupal Console para esto, no es necesario. Dentro del Proyecto Drupal Console está es la eterna discusión acerca de que las cosas tienen que ser un generador y que otras deben ser módulos contribuidos.

Algunos de ellos se convirtieron etanto un generador, como en un módulo contribuido de Drupa 8, como se puede apreciar en la siguiente lista:

Espero que hayas encontrado esta entrada del blog útil.