Mayo 17, 2013
daniezc
En está entrada veremos una forma de crear un filtro expuesto personalizado. El ejemplo consiste en una página web que contiene una vista, la cual muestra todos los nodos de tipo de contenido Recetas de Cocina.
El objetivo es que el usuario sea capaz de filtrar el contenido expuesto de la vista por medio de una lista de selección basada según sus preferencias.
- Creación de la vista,
La vista mostrará el nombre de la receta y sus respectivos ingredientes.
Ingredientes es un campo de tipo Select List y cuenta con los ingredientes posibles, este campo será utilizado en el tipo de contenido Recetas de Cocina, además se reutiliza en el proceso de registro del usuario y en este caso se almacena en la propiedad $user->data pero dejamos esta implementación a la imaginación del usuario 😛.
Este campo Ingredientes se agregar en el criterio de filtrado de la vista y se marca como filtro expuesto para que permita selección múltiple. Si desea mas información sobre filtros expuestos en vistas lo invitamos a ver el vídeo Introducción a Views en Drupal 7.
- Uso del hook_form_alter.
Una vez que colocamos el bloque con el filtro expuesto, es muy probable que la lista de ingredientes sea muy larga y que en realidad el usuario no guste de todos los ingredientes disponibles. Por lo tanto vamos a personalizar este filtro utilizando el hook hook_form_alter como se puede apreciar a continuación.
function MIMODULO_form_alter($form, $form_id) {
if ($form_id == 'views_exposed_form') {
$lista_de_frutas = $form['field_frutas_preferidas_value']['#options'];
if ($lista_de_frutas != NULL) {
global $user;
$lista_frutas_favoritas = $user->data['frutas_favoritas'];
foreach ($lista_de_frutas as $key_list => $value_list) {
if (!in_array($value_list, $lista_frutas_favoritas)) {
unset($lista_de_frutas[$key_list]);
}
}
$form['field_frutas_preferidas_value']['#options'] = $lista_de_frutas;
}
}
}
En un módulo propio llamado MIMODULO, se implementa el hook_form_alter y se crea un arreglo llamado $lista_de_frutas con las opciones que necesitamos del formulario. Además, extraemos la información de los ingredientes favoritos del usuario que ya previamente se han seleccionado y se asignan al arreglo $lista_frutas_favoritas. Finalmente, se evalúan todos los elementos de ambos arreglos para re asignar al formulario una lista de opciones más pequeña.
Si el filtro expuesto no fue seleccionado como de opción múltiple, es necesario que el primer elemento del arreglo $lista_de_frutas original quede intacto ya que es la opción All y está marcada como default. Pero si sí permite selección múltiple, esta opción default desaparece y puede ser agregada de esta forma:
$form['field_frutas_preferidas_value']['#options'] = $lista_de_frutas + array('All');
Si desear probarlo bajo tu propio riesgo adjunto esta el export de la vista y del tipo de contenido Recetas de Cocina.
La importación de tipo de contenido Recetas de Cocina se debe hacer con el módulo bundle_copy.
Espero que haya sido de su agrado.