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 = PERSONALEl 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 = PERSONAL3. 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



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.
<?phpprint $picture
?>
<?phpif (!$page):
?>
<?phpprint $node_url
?>
" title="
<?phpprint $title
?>
">
<?phpprint $title
?>
<?phpendif;
?>
<?phpif ($submitted):
?>
<?phpprint $submitted
?>
<?phpendif;
?>
<?phpif ($terms):
?>
<?phpprint $terms
?>
<?phpendif;
?>
<?phpprint $content
?>
<?phpprint $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/