Imagen de bea

El hook Form_alter

Si se quieren hacer modificaciones, como añadir, borrar o alterar campos en formularios (como pueden ser los de añadir contenido, buscadores, logarse..) basta con un utilizar el hook form_alter de drupal.

Los dos parametros de éste hook son los siguientes:
hook_form_alter($form_id, &$form)

  • $form_id: Representa la identidad del formulario, es el nombre de la función que genera el formulario.
  • $form: Array que contiene las características de todos los elementos del formulario

Para una mejor compresión a continuación mostramos una receta que contiene cómo ingrediente principal el hook form_alter.

Al añadir un nuevo contenido en drupal (existentes como una página u otros contenidos creados con el módulo cck de drupal se puede observar que por el final del formulario siempre aparece un campo de título 'Mensaje de registro'. En muchos casos éste nunca es rellenado por lo que en ésta receta enseñaremos a eliminarlo.

formlario ejemplo

Para ello lo primero que hay que hacer es crear el módulo dónde se escribirá la siguiente función:

function_nombre_módulo_form_alter($form_id, &$form){

Cuando no se saben como se llama exactamente el formulario o los campos que contiene éste, lo mejor es hacer unos 'print' de los parametros anteriormente mencionados, y de ésta forma seran pintados en la página del formulario de drupal:

<?php

function_nombre_módulo_form_alter

($form_id, &$form){
   
print_r ($form_id) ;  //identifica el formulario
   
print_r ($form); //muestra todos los datos de todos los campos del formulario

   

}
?>

Parte del resultado (recordando que la parte que nos interesa es el campo de mensaje de registro del tipo de contenido 'receta'..) es el siguiente.
$form_id:

receta_node_form

Gracias al $form_id vemos que el formulario se llama “receta_node_form”, por lo que si los cambios que queremos realizar únicamente queremos que ocurran para éste formulario bastaría con introducir un if dentro del hook:

<?php
function_nombre_módulo_form_alter
($form_id, &$form){
    if (
$form_id=='receta_node_form'){
       
//los cambios a realizar..
   
}
    }
?>

$form:

[log] => Array
        (
            [#type] => textarea
            [#title] => Mensaje de registro
            [#rows] => 2
            [#weight] => 20
            [#description] => Una explicación de las adiciones o actualizaciones que se han hecho para ayudar a que otros autores entiendan sus motivaciones.
        )
    [author] => Array
        (
            [#type] => fieldset
            [#access] => 1
            [#title] => Información de autoría
            [#collapsible] => 1
            [#collapsed] => 1
            [#weight] => 20

Entre todo el array que muestra este parámetro nos quedamos con el nombre del campo que nos interesa eliminar : 'log'. Y finalmente mediante la funcion 'unset' (encargada de borrar variables) borramos ese campo:

<?php
function_nombre_módulo_form_alter
($form_id, &$form){
      if (
$form_id=='receta_node_form'){
        unset (
$form['log']);
      }
    }
?>

Adjuntamos el pequeño módulo (llamado 'form_alter') explicado en esta receta.

En ésta receta se ha visto eliminar un campo, pero tambíen se pueden modificar o añadir. Por ejemplo:

  • Modificar la descripción del campo de registro:
    <?php
       $form
    ['log']['#description'] = 'nueva descripcion del campo..';
    ?>
  • Crear un nuevo formulario, por ejemplo un select de nombre ¿Sabes utilizar un form_alter? y con respuestas si o no.
    <?php
    $defecto
    =1;
    $options = array('si','no');
      
    $form['utilizar'] = array(
         
    '#type' => 'select',
         
    '#title'=> 'Sabes utilizar el form_alter',
         
    '#default_value' => $defecto,
         
    '#options' => $options,
         
    '#description' => t('Escoja entre las opciones si y no')
    );
    ?>
AdjuntoTamaño
form_alter.tar_.gz895 bytes

Comentarios

Necesito hacer que un campo

Necesito hacer que un campo file generado con cck, sea readonly (que no permita escribir) he estado intentando lo siguente, pero hasta ahora sin exito:

<?php
function puebadecambio_form_alter(&$form, $form_id) {

if (

$form_id == 'mi_formulario') {
      
$form['field_informe']['#attributes'] = array('readonly' => 'readonly');
     }    
return
$form;
}
?>

si me pudieras dar alguna sugerencia seria genial.

Gracias por por aporte

Buen manual para comenzar a utilizar los modulos personalizados. Lo unico que esta un poco desfasado con respecto a la version 6.x pero aun asi ha sido de gran utilidad

Muy Util

Creo que este artículo es de gran utilidad y explica claramente para que sirve un form alter y para que se utiliza. Muchas gracias.

Todavía estamos montando esta cocina con Drupal, así que probablemente más de un detalle esté sin acabar en esta web

Inicio de sesión

Navegación

Comentarios recientes

Nuevos

  • fernando
  • dsevila
  • zialdoka
  • ek10
  • juanramonperez