Hoy vamos a ver como crear páginas, vistas y hacer consultas en Drupal 8. Antes de nada deberias crear un tipo de contenido con una serie de campos para poder hacer lo que haremos a continuación, en mi caso tengo un tipo de contenido «Empresa» con una serie de campos como el titulo, web, cif, etc.
Antes de continuar es recomendable echarle un vistazo a como crear un módulo básico en Drupal 8 y al curso de Symfony3.
Definimos el fichero pruebas_module.info.yml con la información básica del módulo.
name: Pruebas Module description: Módulo de pruebas package: Víctor type: module core: 8.x
Ahora creamos nuestro controlador pruebas_module/src/Controller/PruebasController.php
namespace Drupal\pruebas_module\Controller; use Drupal; use Drupal\node\Entity\Node; use Drupal\Core\Controller\ControllerBase; class PruebasController extends ControllerBase { // Página 1 public function content() { return array( '#type' => 'markup', '#markup' => $this->t('Hola mundo !!'), ); } // Página 2 public function getEmpresas() { // Sacar datos de la base de datos $query = Drupal::entityQuery('node') ->condition('type', 'company') ->execute(); // Recorrer los resultados y guardar los nodos en un array if (!empty($query)) { foreach ($query as $empresaId) { $empresa = Node::load($empresaId); $empresas[] = $empresa; } } // Cargamos datos en una vísta, usando hook_theme return array( '#theme' => 'show_empresas', '#titulo' => $this->t('Listado de empresas'), '#descripcion' => $this->t('Empresas disponibles'), '#empresas' => $empresas ); } } ?>
Antes hemos usado en #theme show_empresas, para asignarle una vista al método y así generar un fichero twig vinculado a esa acción del controlador. Pues bien ese tema es un hook que nos permite definer #themes que básicamente nos permite asociarle una vista twig con una serie de parámetros que va a recibir esa vista.
En el fichero pruebas_module/pruebas_module.module podemos definir hooks, en mi caso estoy usando el hook_theme y creo el «tema» show_empresas.
<?php /** * Theme hook */ function pruebas_module_theme($existing, $type, $theme, $path) { return array( 'show_empresas' => array( 'variables' => array( 'titulo' => 'Título por defecto', 'descripcion' => 'descripción por defecto', 'empresas' => NULL ), 'template' => 'show_empresas' ) ); }
El siguiente paso es crear la vista twig (twig es el lenguaje de plantillas de Symfony) en la cual vamos a mostrar las empresas que tengamos creadas dentro de una tabla. Creamos la vista en pruebas_module/templates/show_empresas.html.twig
<h2>{{ titulo }}</h2> <p>{{ descripcion }}</p> <hr/> {% if empresas %} <div class="col-sm-6"> <div class="panel panel-default"> <div class="panel-heading">Empresas</div> <div class="panel-body"> <p>Esta tabla muestra las empresas</p> </div> </div> <table class="table table-bordered table-striped table-hover"> <tbody> {% for empresa in empresas %} <tr> <td>{{ empresa.get('field_company_web').value }}</td> <td class="text-right">{{ empresa.get('field_company_location').value }}</td> </tr> {% endfor %} </tbody> </table> </div> {% endif %}
Ahora definimos nuestras rutas en el fichero pruebas_module/pruebas_module.routing.yml
pruebas_module.content: path: '/admin/config/modulo-de-pruebas' defaults: _controller: '\Drupal\pruebas_module\Controller\PruebasController::content' _title: 'Modulo de pruebas' requirements: _permission: 'access content' pruebas_module.empresas: path: '/admin/config/empresas' defaults: _controller: '\Drupal\pruebas_module\Controller\PruebasController::getEmpresas' _title: 'Modulo de pruebas - Empresas' requirements: _permission: 'access content'
Y por último mostramos los links en las secciones que nos interesan.
pruebas_module.homepage: title: Modulo de pruebas description: 'Configurar el modulo de pruebas' parent: system.admin_config_ui route_name: pruebas_module.content pruebas_module.empresas: title: Mostrar empresas (modulo pruebas) description: 'Mostrar las empresas' parent: system.admin_config_ui route_name: pruebas_module.empresas
Pues con esto ya tenemos dos páginas en nuestro módulo, que cargan una vista en un fichero twig y muestran la información tras hacer consultas con Drupal 8 a la «base de datos», que realmente estamos sacando la información de un nodo/entidad.
Más información:
Crear un módulo básico en Drupal 8
Listado de hooks de Drupal 8
Curso de Symfony3 – Domina el framework PHP más completo