Una vista simple para búsqueda

Enviado por lamigo el Jue, 26/04/2018 - 19:15
Muchas opciones porcas respuestas

El caso que nos ocupa es bastante genérico, tenemos un sitio con Drupal en el que queremos filtrar un contenido con un campo que no está directamente en dicho contenido.

En este caso, imaginemos que tenemos (como parte de nuestro sistema) lo siguiente:

  • Servicios.- Son los servicios que ofrecemos a los clientes, pueden variar de una localidad a otra o estar en varias localidades, queremos poder filtrarlos por localidad, por provincia o por código postal y por simplicidad, comodidad, rapidez y facilidad de exportación no queremos utilizar ningún módulo tipo Location, Address o similares, queremos hacerlo todo "a pelo" con una instalación básica de Drupal.
  • Provincias.- Todos sabemos lo que es una provincia.
  • Localidades.- Tanto más de lo mismo.
  • Código Postal.- son bastante truculentos y no suelen estar bien implementados en módulos de localización o direcciones porque tienen dos peculiaridades:
    • Pueden existir varias localidades con el mismo código postal (Spain is different)
    • Las grandes ciudades tienen varios códigos postales para la misma ciudad.

Con estas premisas, vamos a solventar el problema de forma rápida con un tipo de campo, dos tipos de contenido y un término de taxonomía:

  • Provincia.- Dado que no queremos que tenga valor propio (agrupamos las localidades por provincias pero no esperamos guardar ningún contenido en la provincia) lo ideal es crearlo como término de taxonomía ya que toda la relación la hará Drupal de forma automática.
  • Código Postal.- Crearemos un tipo de campo entero para representar el código postal
  • Localidad.- Crearemos un tipo de contenido que pueda tener uno o varios códigos postales y un término de taxonomía Provincia.
  • Servicio.- Crearemos el servicio con los campos que necesitemos y le añadiremos un campo referencia a Localidad para poder añadir localidades ilimitadas a nuestro servicio.

Comenzamos con la provincia:

Vamos a Estructura > Taxonomía

Término de taxonomía

Una vez que tenemos creado el término, podemos añadir los valores que nos interesen, para una carga masiva ya veremos en otro artículo como usar Feeds.

El siguiente paso es crear el contenido Localidad, para ello, vamos a Administrar > Estructura > Tipos de Contenido

Tipos de Contenido

Usaremos el Título del contenido como nombre, añadiremos un campo comentarios (por si hay algo que decir) y añadiremos un nuevo campo "Código Postal", alguien dirá que es un campo que necesita una validación de número de dígitos y blabla, pero en este caso, nos conformaremos con usar un numero entero entre 1000 y 53000 (01 es Álava y 52 es Melilla), usaremos para el campo código postal un número ilimitado de valores. (se pueden añadir tantos códigos postales como se desee a la localidad).

Como mejora se podría usar la provincia como contenido y asignar el código de provincia a cada provincia permitiendo editar solo los tres últimos dígitos del código postal en la localidad, pero no aporta nada al usuario y complica y enlentece el mecanismo.

Formulario de nueva localidad

El siguiente paso será crear el servicio, para este ejemplo no añadiremos campos adicionales (como una imagen o precios o condiciones o lo que se nos ocurra) porque no viene al caso, por lo que crearemos el servicio con los siguientes campos:

  • Título
  • Descripción
  • Localidad.-  Este es el campo que nos interesa, utilizaremos una referencia a entidad Localidad, con posibilidad de añadir ilimitadas localidades al servicio.

La referencia a la entidad puede hacerse de forma simple (por defecto) y dejar que Drupal haga la gestión de la referencia o bien hacer la referencia a través de una vista, en este caso simple no es necesario, pero lo haremos con la vista para tener más adelante control sobre la vista en el caso de querer hacer un filtrado distinto (por ejemplo, que no sea necesario publicar el contenido):

Elección de referencia

Para que una vista sea elegible para la referencia a entidades, tiene que tener un modo presentación "referencia a entidades":

Vista de referencia a entidades

Con esto ya tenemos creados todos los contenidos necesarios, podemos crear contenido de ejemplo y crear la vista de filtrado por codigos postales, para probarlo crearemos una vista de página en la que mostraremos los títulos de los contenidos de tipo servicio publicados que tengan ese código postal.

Para el formulario de búsqueda usaremos un filtro expuesto, en el caso más sencillo que nos ocupa (solo el código postal) usaremos un filtro sencillo (solo un campo):

Filtro sencillo

Para que todo esto funcione es necesario establecer la relación con el contenido externo (la localidad), para ello vamos en la definición de la vista a "Avanzado" y creamos la relación con el contenido localidad, es importante marcarla como obligatoria ya que solo puede producirse un resultado válido si existe la relación entre el servicio y la localidad y dicha localidad incluye el código postal, el conjunto de la vista quedaría así:

Detalle de la vista

Y nuestra página de prueba está lista.

Para probar que funciona creamos dos localidades en dos provincias distintas y dos servicios, uno que estará en ambas localidades y uno que estará solo en una de las localidades, vemos los resultados:

Resultado en Bolaños

 

Resultado Torre de Benagalbón

Esta misma vista puede exponerse como servicio REST, puede hacerse con provincias en lugar de códigos postales, con localidades o con un filtro compuesto de código postal, localidad o provincia.

Tags