Añadir un campo en el formulario de contacto de Drupal

Nuestros clientes tienen siempre necesidades muy precisas y es normal que las atendemos, al final vivimos de nuestra pasión gracias a ellos no? La pasada semana, un cliente deseaba que el formulario de contacto tenga un campo adicional: el nombre de la empresa del visitante.

Tenía dos soluciones: utilizar el módulo webform o programar un pequeño módulo para añadir el campo requerido.

Webform

A primera vista, webform parece ser la solución más sencilla pero no nos olvidaremos que este módulo (más de 2500 líneas de código) guarda todos los datos que envía cada visitante en nodos de la base de datos. Por ello, Webform crea cinco tablas en nuestra BD:

Webform - webform_component - webform_roles - webform_submissions - webform_submitted_data

2500 líneas de código y cinco tablas para añadir un solo campo? Vale la pena? Aún en caso de requerir registrar automáticamente los datos de los visitantes que utilizan el formulario, me parece excesivo y más aún para un sitio de alto tráfico.

Programar un módulo

Nos queda sin embargo una segunda solución bastante simple, ligera y rápida: programar un pequeño módulo (30 líneas y sin uso de BD) que añade este campo y lo muestra en el cuerpo del mail que vamos a recibir. Llamaremos este módulo: addcontact para nuestro ejemplo.

En un primer tiempo, vamos a crear en sites/all/modules/ un directorio: addcontact

En este directorio (sites/all/modules/addcontact/) vamos a crear dos archivos: addcontact.info y addcontact.module

Aquí va el código del archivo addcontact.info

; $Id$
name = Addcontact
description = Añadir un campo ‘Empresa’ en el formulario de  contacto del sitio
core = 6.x
package = PERSONAL

El código del archivo addcontact.module

<?php

// $Id$

/**
* @file
* Module personal
* Añadir un campo ‘Empresa’ en el formulario de  contacto del sitio
*
*/

Implementación del hook_FORM_ID_alter()

Para añadir un campo en el formulario de contacto, vamos a utilizar el hook hook_FORM_ID_alter() que nos permite modificar un formulario en particular en base a su ID.

El ID del formulario es: contact-mail-page. Podemos verlo en el código fuente como sigue :

<form id="contact-mail-page" method="post" accept-charset="UTF-8" action="_PATH_">

OJO. Debemos transformar este ID para poder utilizarlo en nuestro módulo reemplazando los – por _ (underscore)

Entonces en vez de utilizar contact-mail-page vamos a utilizar contact_mail_page como ID del formulario en nuestro módulo.

Vamos a implementar el hook hook_FORM_ID_alter() como addcontact_ form_contact_mail_page_alter(). Reemplazamos hook por el nombre del módulo, addcontact, y reemplazamos también FORM_ID por el ID del formulario: contact_mail_page.

En nuestro archivo addcontact.module añadimos esta función

<?php
/**
* Implementation of hook_FORM_ID_alter().
*/

function addcontact_form_contact_mail_page_alter(&$form, &$form_state){
   
   
//Añadir el campo empresa
   
$form['empresa']=array(
     
'#type' => 'textfield',
     
'#title' => t('Empresa'),
       
'#size' => 60,
     
'#maxlength' => 128,
     
'#required' => TRUE,   
    );
   
   
// Ordenar los campos añadiendo un peso #weight
   
$order = array('contact_information', 'name', 'mail', 'empresa', 'subject', 'cid', 'message', 'copy', 'submit');
    foreach (
$order as $key=>$value){
       
$form[$value]['#weight']=$key;
    }
}
?>

Ahora si vamos a nuestro formulario de contacto, vemos que tenemos un nuevo campo: Empresa.
Pero si enviamos el formulario, en el mail que recibimos no vemos el campo empresa en el cuerpo.

Para ello debemos implementar el hook hook_mail_alter() en nuestro módulo.

Implementación de hook_mail_alter()

Añadimos la siguiente function en nuestro archivo addcontact.module

<?php
/**
* Implementation of hook_mail_alter().
*/

function addcontact_mail_alter(&$message) {
// OJO, solo debemos cambiar el formulario contact_mail_page
// porque este hook es utilizado cada vez que el sistema manda un mail.
if ($message['id'] == 'contact_page_mail') {
       
$message['body'][1]=t("Mensaje: ").$message['body'][1];
       
$message['body'][2]=t("Empresa: ").$message['params']['empresa'];

    }
}

?>

Listo, ahora vamos a recibir el campo empresa en el cuerpo de nuestro mail.

Hemos visto entonces que con 30 líneas de código podemos añadir un campo en nuestro formulario de contacto, en vez de las 2500 líneas y de las cinco tablas del módulo webform.

En resumen

1. Crear el directorio addcontact en sites/all/modules/

2. En el directorio sites/all/modules /addcontact/ crear el archivo addcontact.info

; $Id$
name = Addcontact
description = Añadir un campo ‘Empresa’ en el formulario de  contacto del sitio
core = 6.x
package = PERSONAL

3. En el directorio sites/all/modules /addcontact/ crear el archivo addcontact.module con el hook hook_form_FORM_ID_alter() et hook_mail_alter()

<?php
// $Id$

/**
* @file
* Module perso
* Añadir un campo en el formulario de contacto del sitio
*
*/

function addcontact_form_contact_mail_page_alter(&$form, &$form_state){
   
   
//Añadir el campo empresa
   
$form['empresa']=array(
     
'#type' => 'textfield',
     
'#title' => t('Empresa'),
       
'#size' => 60,
     
'#maxlength' => 128,
     
'#required' => TRUE,   
    );
   
   
// Ordenar los campos añadiendo un peso #weight
   
$order = array('contact_information', 'name', 'mail', 'empresa', 'subject', 'cid', 'message', 'copy', 'submit');
    foreach (
$order as $key=>$value){
       
$form[$value]['#weight']=$key;
    }
}

/**
* Implementation of hook_mail_alter().
*/

function addcontact_mail_alter(&$message) {
// OJO, solo debemos cambiar el formulario contact_mail_page
// porque este hook es utilizado cada vez que el sistema manda un mail.
if ($message['id'] == 'contact_page_mail') {
       
$message['body'][1]=t("Mensaje: ").$message['body'][1];
       
$message['body'][2]=t("Empresa: ").$message['params']['empresa'];

    }
}

?>

Preguntas? No duden en enviar un comentario….

Para más información :

Hook Form Alter: http://api.drupal.org/api/function/hook_form_alter
Hook Form ID Alter: http://api.drupal.org/api/function/hook_form_FORM_ID_alter/6
Hook Mail Alter: http://api.drupal.org/api/function/hook_mail_alter/6
Referencias sobre la FormApi: http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....
Un buen post de Lullabot sobre los formularios: http://www.lullabot.com/articles/modifying-forms-drupal-5-and-6
Módulo contact: http://drupal.org/handbook/modules/contact/
Form API Quickstart Guide: http://drupal.org/node/751826
Módulo Webform: http://drupal.org/project/webform

Tags:

Comentarios

Formulario de contacto en Drupal 7.19

Hola acabo de ver tu codigo y esta interesente, ya que asi nos ahorramos peticiones al DB y tambien espacio en disco.
Lo que queria saber es lo siguiente:
- Si este modulo tambien se puede usar ahora en Drupal 7.19
- Podemos colocar texto u otra info antes del formulario
- Colocar un texto "Mensaje enviado, gracias." sin redireccionarlo a otra pagina

Espero tu respuesta y comentarios.

PD. Este formulario es similar al modulo contact del core y se genera automaticamente o tengo que pegarlo en una nueva pagina estatica.

Hacerca de forms

Hola que tal, muy bueno tu post, oyes una pregunta, soy un poco novato n drupal miy tengo u formulario con views, lo que pasa es que cuando lleno de nuevo el formulario me lo publica automticamente y lo que quiero es ver si se puede hacer que no se publique si no que el administrador valide ese contenido y lo publique si o no, bueno ese es mi problema si me pudieras orientar te lo agradeceria bastante saludos ñ_ñ.

Hace mucho tiempo que no veía

Hace mucho tiempo que no veía está información

cambios

Hola, esta perfecto este tema, pero tengo un problema con un cliente, http://grupodimpsa.mx/img/contac.jpg, que archivo contiene el codigo php para meterle esas imagenes y ese contorno, ahorita tengo algo asi: http://www.grupodimpsa.mx/demo/contact

saludos

Hola Puedes utilizar el

Hola Puedes utilizar el modulo panels http://drupal.org/project/panels.
estos son unos ejemplos de como puedes utilizar panels.

http://francisconi.org/drupal/panels/disenos-personalizados-nodos-panels...
http://francisconi.org/drupal/panels/disenos-personalizados-nodos-panels...

Yo creo que es la solución ya que puedes poner el formulario contact y tambien views.
Saludos!!!

Es muy interesante

Utilice el código la verdad funciona a la perfección el único problema es que estoy utilizando modulo CAPTCHA y me aparece al principio en lugar de estar hasta bajo me gustaría saber como resolver esto utilizo Drupal 6..

Afecta el link de Mollom

Aplique tu solucion, que ya andaba buscando como añadir un campo sencillo a el formulario de envio y es bastante practica, sencilla y limpia, solo tengo un problema, tengo instalado el modulo de Mollom para evitar el Spam en los envios y al momento de aplicar tu solucion me desaparecio el vinculo para reportar contenido en los correos, hay forma de solucionarlo o no? (igual no es tan importante, ya que lo he usado pocas veces).

Gracias por tus aportes!

es posible añadir adjuntos en el profile

Hola.
Yo quería que los usuarios de mi sitio web pudieran incluir un pdf adjunto con el curriculum en el profile. LLevo una temporada dándole vuletas al tema pero no doy con la solución.
Conocéis alguna forma de adjuntarlo?
Saludos y Muchas gracias...

Agregar URL al Mail

Muy buen tutorial me parece fenomenal sobre todo a mi que me cuesta jaja.

Yo lo que quiero hacer es que cuando un visitante solicite informacion de un carro que me envie el URL del carro que esta viendo y solicitando la informacion y cuando yo reciba el correo me aparezca el link y de ser posible la imagen.

Se puede hacer esto con los mismos pasos de este tutorial? o como puedo hacerlo.
Gracias

Simple y facil de aprender

Simple y facil de aprender

Si se puede,pon el código en

Si se puede,pon el código en node.tpl.php de tu tema.

 

<?php
print $picture
?>

 

<?php
if (!$page):
?>

  <?php
print $node_url
?>

" title="

<?php
print $title
?>

">

<?php
print $title
?>

<?php
endif;
?>

 
 
 

<?php
if ($submitted):
?>

   

<?php
print $submitted
?>

 

<?php
endif;
?>

 
 

<?php
if ($terms):
?>

   

<?php
print $terms
?>

 

<?php
endif;
?>

 
 
 
   

<?php
print $content
?>

 
 
 

<?php
print $links;
?>

 
//código que se agrega inicio

<?php
if($page != 0){
   require_once drupal_get_path('module', 'contact')  .'/contact.pages.inc';
 print drupal_get_form('contact_mail_page');
   }
 
?>

//fin
 

Url Original:
http://www.forosdelweb.com/f136/modificacion-formulario-contacto-895365/

Campo tipo fecha

Muchas gracias por el tutorial, una consulta si quisiera añadir un campo de tipo fecha, ¿cómo tendría que hacer?....

De antemano muchas gracias

Saludos

Seleclist

gracias por el tuto una inquietud como se puede insertar en este modulo un select list que se cargue desde la base de datos no se si me hago entender lo que quiero hacer por ejemplo es que teniendo datos en el select list pero que stos se carguen desde la base de datos como lo hacen en el de seleccionar paises y al seleccionar un pais salen las ciudades y asi espero me puedas ayudar gracias

Gracias

Buen tutorial y muy bien explicado.
Un saludo!

Gracias

Gracias Gerard!

No funciona

Hola,
Este modulo esta muy bien, pero cuando se aplica no vuelves a la pagina de contacto.
Lo que he hecho es modificar el codigo del modulo conntact directamente añadiendo los campos al formulario y luego incluyendo las variables en el menssage del mail.

Pero merci por el codigo

OJO con modificar el core

Hola Mar,

Si he entendido bien, modificaste el módulo contact. Si es el caso, ten cuidado en tu próxima actualización del core, porque deberás volver a aplicar tu parche.

Es muy, muy, muy recomendable no tocar el core y aplicar tus personalizaciones a través de hooks.

Saludos

Muy bueno el tema. Gracias

Muy bueno el tema. Gracias Karim.

Una pregunta. Podemos poner varios campos de esta forma? Es decir puedo añadir varios campos al formulario?

JL

Claro que se puede añadir

Claro que se puede añadir varios campos. Por ejemplo, si quieres añadir un campo teléfono, en el hook hook_FORM_ID_alter() puedes añadir los siguiente:

<?php
$form
['telefono']=array(
     
'#type' => 'textfield',
     
'#title' => t('Teléfono'),
       
'#size' => 60,
     
'#maxlength' => 128,
     
'#required' => TRUE,  
    );
?>

Y en el hook hook_mail_alter() añades el campo para recibirlo en el cuerpo del mensaje

<?php
if ($message['id'] == 'contact_page_mail') {
...
$message['body'][3]=t("Teléfono: ").$message['params']['telefono'];
}
?>

Voila.

Muy interesante, yo

Muy interesante, yo normalmente usaba un webform, pero visto lo que has explicado a partir de ahora usaré esta opción :)

Por cierto en las últimas lineas hay una frase en frances. :P

Gracias por la observación

Gracias por la observación Eloi. Esto de manejar sitios en varios idiomas, a veces ni te das cuenta en que idioma escribes :)

Webform sin embargo tiene sus ventajas cuando deseamos recuperar la información de los formularios como en el caso de encuestas, pedidos ect... Hay que ver el uso que le quieres dar al formulario.

Saludos

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><img>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato

By submitting this form, you accept the Mollom privacy policy.

Arcerca del autor

Karim BoudjemaKarim Boudjema. Un belga apasionado de las TIC's en los Andes de Bolivia.

Ver mi perfil en LinkedInVer mi perfil en Twitter

>> Más...

Comentarios recientes