Crear formularios de configuración en el backend de Drupal 7

Casi siempre que tenemos una necesidad que resolver en una web hecha en Drupal 7 conseguimos solventarla a través de los módulos contribuidos de la comunidad, ya que muchos de los problemas que nos surgen ya se les habían planteado a otros usuarios. Pero cuando la necesidad es más concreta no vamos a poder encontrar una solución por este camino. Nos puede ocurrir que tengamos que recuperar datos de una base de datos propia o que el cliente quiera hacer algo tan sumamente especial que es imposible que otro nos haya resuelto el problema.

Los módulos contribuidos suelen tener una parte de configuración en la zona de administración o backoffice desde la cual podemos gestionar las diferentes opciones que tienen. Pero cuando nosotros creamos una funcionalidad no tenemos esta posibilidad a menos que la implementemos. Vamos a ver como podemos añadir un enlace al backoffice donde agrupar nuestros enlaces personalizados de administración, y además como podemos crear un formulario que nos permita (de forma básica) cambiar un parámetro que se almacene en la base de datos de Drupal.

Añadir el enlace de menú al backoffice

Lo primero que debemos hacer es crear una categoría dentro del backoffice para agrupar todos los formularios de configuración que vayamos a crear. En drupal contamos con varias categorías principales en la zona de administración, y se trataría de añadir la nuestra personalizada. La pondríamos al mismo nivel que ‘Contenido’, ‘Estructura’, ‘Apariencia’ o ‘Configuración’, aunque también podríamos añadirlo dentro de cualquiera de estas ramas. A mí personalmente me gusta más separar las configuraciones personalizadas para tenerlas más visibles y accesibles.

Vamos a crear un módulo personalizado llamado ‘customconfig’ que haga uso del hook_menu para colocar este enlace.

Como vemos, en este hook añadimos un elemento nuevo en el menú con al que accederemos a través de la URL ‘admin/custom’. Esta URL no solo nos va a servir para acceder a la zona de configuración personalizada, sino que también le va a indicar a Drupal que debe colocar este enlace bajo la administración, ya que su URL predecesora es ‘admin’. Por otro lado le estamos dando un título y una descripción al enlace, además de crear un permiso llamado ‘administer custom config’. Esto significa que ningún usuario que no tenga este permiso va a poder ver este elemento del backoffice. Por último, le damos un peso bastante alto para que nos coloque el enlace al final, después de todos los que tiene Drupal por defecto y los que añaden los módulos contribuidos. Se verá de la siguiente forma en la barra de administración creada por el módulo admin_menu:

custom_link

Añadir formulario de configuración

Ahora vamos a añadir otro enlace dentro del que acabamos de crear. Se hace con el mismo hook, y en él vamos a meter un formulario de configuración.

Como vemos en este otro elemento añadido, le damos una URL con una jerarquía que le indica a Drupal que debe colgar del elemento creado anteriormente, y que la URL de acceso será ‘admin/custom/config1’. Le hemos dado un título y una descripción igual que antes, y mediante ‘access arguments’ le hemos indicado que el permiso de acceso es el mismo que en el elemento anterior. También le decimos que mediante la función ‘customconfig_config_form’ (que aún no hemos creado) obtendrá un formulario que deberá renderizar con la función ‘drupal_get_form’ (que es propia del CMS y sirve para convertir un array en un formulario), y que la función la hemos creado en un archivo a parte llamado ‘customconfig.admin.inc’.

backoffice

El siguiente paso es crear ese archivo y meter la función ‘customconfig_config_form’. En esta función vamos a crear un formulario en un array que permitirá guardar el valor de una variable en las tablas de base de datos de Drupal, de modo que podremos utilizarla en otros módulos para conocer su valor:

Utilizamos la función variable_get para recuperar la variable ‘customconfig_mantenimiento’ de la base de datos de Drupal, y si no existe le damos valor 0, que es lo mismo que decir que es falso o que está desactivado. Lo siguiente va a ser construir un sencillo formulario mediante la API de formularios de Drupal que contendrá un checkbox con el valor recién recuperado (es decir, el checkbox solo estará marcado sí el valor de la variable ‘customconfig_mantenimiento’ es igual a 1) y un botón de guardar que ejecutará la función ‘customconfig_config_form_submit’ al hacer click sobre él. Vamos a ver que acciones realiza esta función que se ejecuta al guardar el formulario.

Guardar el formulario

Lo que ejecuta esta función es muy sencillo. Recupera el valor del checkbox del formulario y si el usuario lo marcó guarda el valor de esa variable como 1 (activo) en la base de datos de Drupal, mientras que si no estaba activo guarda el valor 0 (inactivo). Todo esto lo hace con la función variable_set, en la que se especifica el nombre de la variable a crear o modificar y el valor que queremos darle.

Usos

Ahora se trata de crear funcionalidades que utilicen el valor de la variable ‘customconfig_mantenimiento’. Recuperaremos su valor siempre con la función variable_get.

Esto no suele ser recomendable porque cargamos una de las tablas clave de Drupal con registros. Lo suyo sería crear una función que al desinstalar el módulo eliminase esta variable de la base de datos de Drupal. Es recomendable no abusar de la creación de variables, y si nuestro módulo va a utilizar muchas plantearnos la creación de una nueva tabla que gestione únicamente nuestra funcionalidad. Por ejemplo en WordPress existe un método similar en el almacenamiento de variables y muchos plugins se basan únicamente en este, originando una tabla de variables de un tamaño monstruoso. El problema es que esa tabla es consultada también para variables del sistema, y cuanto mayor es su tamaño mayor es el tiempo que se pierde en cada consulta, penalizando el rendimiento del CMS.

Experto en la Gestión de Proyectos Web basados en Drupal con más de 8 años de experiencia. Desarrollo Full Stack (Front-end, Back-end, Site-Builder).

No Replies to "Crear formularios de configuración en el backend de Drupal 7"