Alterar formulario con id dinamica en Drupal

Imagen

Realmente no es algo muy común encontrarnos un formulario con una id dinámica, pero nos puede causar algún quebradero de cabeza si tenemos que alterar uno alguna vez, por ejemplo el de la cesta de la compra en Drupal commerce, y este tiene una ID dinámica para saber a que producto corresponde; es decir, que parte de su ID es la acción, pero la otra se ajusta dependiendo de lo que estemos haciendo, en este caso, la id del producto que queramos añadir al carrito.

Alterar el formulario

Vamos a ver un ejemplo basándonos en el formulario de añadir al carrito de Drupal commerce, si utilizamos hook_form_alter para tratar de averiguar cual esla id del que estamos usando, veremos algo como esto si mostramos la variable $form_id:

Id del formulario de añadir al carrito en Drupal commerce

En el ejemplo vemos que es el formulario para añadir al carrito el producto con la id 1. Lógicamente, no podemos poner infinitos if o switch para poner un alter por producto, ya que nos seria imposible mantener el código, a si que la solución, parte por ejecutar un hook_form_alter y buscar en la id del formulario una cadena de texto:

/**
 * Implements hook_form_alter().
 */
function nireneko_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if (strstr($form_id, 'commerce_order_item_add_to_cart_form') && (strstr($form_id, 'commerce_product') )) {
    //Ejecutamos el codigo que deseemos para el formulario
  }
}

Dentro del if ya podremos modificar el formulario para alterar la parte que nos interese, ya sea la función a la que se realiza el envió, añadir alguna clase, modificar o deshabilitar algún campo.

Como vemos, es muy sencillo de hacer aunque pueda parecer lioso cuando comenzamos a pensar en el problema; pero unicamente es buscar una cadena de texto que se repita y ponerla dentro de la función strstr(). Recordar que los hooks se tienen que añadir en los archivos mimodulo.module de los módulos que estemos desarrollando.