Agregar soporte a tokens al campo de un formulario

  • 30 Abr 2015
  • Drupal 7, PHP

En Drupal todo se hace con un formulario. Configuraciones y contenidos. En los formularios que sriven a la configuración de un módulo, el uso de token nos permite gambetear algo que podríamos llamar el hardcodeo de parámetros.

Desgraciadamente no todos los módulos de la comunidad de Drupal aceptan tokens. Una lástima. La cosa positiva es que implementarlo es realmente simple.

Vamos a ver el caso de la interfaz para importar de feeds. En este ejemplo, le pedimos a feeds que importe contenido a través de una URL. Esta URL no es más que una vista del propio sitio, que gracias a Data export nos genera un archivo CSV que feeds se ocupa de procesar. El "problema" es que esta URL está en más de un importer y el dominio cambia de ambiente a ambiente.

El primer problema es el token. No existe un token que devuelva el contenido de la variable global base_url. Para crearlo podemos usar custom tokens (que todavía está en versión beta... pero su trabajo lo hace).

Creamos un token con el siguiente código PHP (PHP filter)

<?php
  global $base_url;
  print $base_url;
?>

Drupal custom tokens

Y ahora, creamos un módulo (lo voy a llamar feeds_url_token) para modificar el formulario de feeds usando el hook form_alter

function feeds_url_token_form_feeds_import_form_alter(&$form, &$form_state, $form_id){
  $form['token_help'] = array(
    '#theme' => 'token_tree',
    '#token_types' => array('node'),
  );
  $form['#validate'] = array("feeds_url_token_form_submit");
}

function feeds_url_token_form_submit($form, &$form_state){
  $url = token_replace($form['feeds']['FeedsHTTPFetcher']['source']['#value']);
  $form['feeds']['FeedsHTTPFetcher']['source']['#value'] = $url;
}

En este caso en particular, es necesario sobreescribir #validate porque de lo contrario, la función de feeds que valida este formulario (que no tiene hooks) no acepta el parámetro ingresado ya que no es un URL válido.

Drupal feeds import form