jueves, 3 de marzo de 2011

Personalizar módulo de contacto

En este post vamos a explicar cómo personalizar mínimamente el formulario de contacto. La versión 7 de Drupal viene con un montón de módulos por defecto que podemos utilizar. Uno de ellos es el módulo Contact que activamos accediendo al menú Modules


Pulso sobre el enlace de Contact form a ver qué aparece. Este es el resultado:



Si pulsamos sobre Configure nos muestra la siguiente información:
  • Add one or more categories on this page to set up your site-wide contact form.
  • A Contact menu item (disabled by default) is added to the Navigation menu, which you can modify on the Menus administration page.
  • If you would like additional text to appear on the site-wide contact page, use a block. You can create and edit blocks on the Blocks administration page.
Además de esto, en la capa de edición del módulo Contact muestra un listado de categorías (sólo hay una por defecto) que podemos editar y borrar. La categoría por defecto es Website feedback si pulsamos en edit podemos editar campos como: a quién se envía un mail con el formulario, podemos escribir un mail de auto-respuesta, el peso de la categoría y el campo selected que indica si la categoría está seleccionada por defecto o no.

Ahora vamos a probar a enviar el form de contacto, pero nos da fallo de envío por culpa del puerto 25 (es el que está por defecto). En concreto, dice:
  •  Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in DefaultMailSystem->mail() (line 77 of C:\wamp\www\drupal-7.0\modules\system\system.mail.inc).
  •  Unable to send e-mail. Contact the site administrator if the problem persists.
  • Notice: Array to string conversion in DefaultMailSystem->format() (line 24 of C:\wamp\www\drupal-7.0\modules\system\system.mail.inc).
  •  Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in DefaultMailSystem->mail() (line 77 of C:\wamp\www\drupal-7.0\modules\system\system.mail.inc).
  •  Unable to send e-mail. Contact the site administrator if the problem persists.

Después de varios intentos, y visitas a foros aquí http://www.desarrolloweb.com/faq/336.php me dicen que pruebe a convertir localhost en un servidor de correo utilizando Post Cast Server. Lo descargo, instalo, ejecuto y configuro, y volvemos a probar. Ahora los mensajes que envío utilizando el formulario de contacto, aparecen en la bandeja de salida de Post Cast Server así que independientemente de que los envíe o no sabemos que funciona. Lo único que en el asunto aparece el nombre de la categoría Website feedback así que vamos a Structure -> Contact Form, edit y cambiamos el nombre de la categoría por lo que creamos conveniente.

Cómo queremos que cuando alguien envíe un mail, le envíen un mail de vuelta agradeciendo su interés, vamos a rellenar el campo auto-reply. Además, vamos a personalizarlo utilizando el nombre que la persona ha proporcionado en el campo Name. Cómo esto no he encontrado por internet cómo hacerlo a través de las interfaces de Drupal, vamos a trastear el código fuente para ver qué podemos hacer. Antes de todo, en el campo Auto-reply, empezamos con “Estimado __SENDER__,”. __SENDER__ es lo que vamos a sustituir desde el código del módulo Contact por el nombre que hayan indicado en el form. Vamos a “directorio_Drupal\modules\contact” y abrimos el fichero contact_forms.module. Buscamos la cadena autoreply y encontramos lo siguiente:

case 'page_autoreply':
      $message['subject'] .= t('[!category] !subject', $variables, array('langcode' => $language->language));
      $message['body'][] = $params['category']['reply'];
      break;

Para cambiar el __SENDER__ por el nombre en cuestión, utilizamos la función str_replace y cambiamos la línea:

$message['body'][] = $params['category']['reply']; 

por

$message['body'][] = str_replace ( '__SENDER__' , format_username($params['sender']) , $params['category']['reply']);

Con esto lo que le decimos es que en el body, busque la cadena ‘__SENDER__’ y la sustituya por el nombre de usuario definido en format_username($params['sender']).

Por otro lado, si añadimos una nueva categoría lo que hacemos es crear cómo una clasificación de formularios de contacto a través de categorías, por ejemplo uno para contactos de clientes, otro para dudas, etc. Dado que nosotros no necesitamos ningún formulario más no añadimos otra categoría.

Bien ya tenemos el formulario de contacto definido y funcionando como queremos. Ahora vamos a intentar que aparezca en la pestaña de contacto. En la estructura básica ya pusimos una página de contacto, es ahí dónde queremos que aparezca el formulario de contacto. Para conseguir esto hacemos lo siguiente. Vamos Stucture -> Menus, en Main Menu clickamos en list links y después en la fila de Página de Contacto, clickamos en edit.  Lo primero que hacemos es cambiar “Página de contacto” por algo un poco más amigable y que invite al usuario a ponerse en contacto con nosotros como “Contacte con nosotros” (vale muy original igual no es, pero de momento servirá) y rellenamos el contenido. En el path escribimos “contact” que es nombre del nodo de contacto designado por Drupal. Guardamos los cambios, vamos a la página de contacto y el resultado es correcto.




Aunque el resultado es correcto, no es lo que yo quería. Exactamente yo quiero que por un lado aparezca el formulario (eso ya está) pero que además aparezca la información de dónde está la empresa. Además, quiero que aparezca un aviso de que en ningún caso se va a almacenar ningún dato relativo al usuario. De nuevo esto no es posible desde el módulo en sí, así que volvemos a trastera el código de Drupal. La verdad es que no ha sido nada fácil hacer esto, respecto a lo que hemos ido haciendo hasta ahora, he visitado muchas webs y no todas han sido útiles pero entre todas me han dado la idea de qué hacer. Aquí os dejo los enlaces de algunas de ellas:


Volvemos a la carpeta dónde está el módulo de contact y abrimos el fichero contact.pages.inc que es dónde se definen los campos que contiene el formulario (en la versión que yo tengo a partir de la línea 65, justo después de $form['#attributes']['class'][] = 'contact-form';. En Drupal el formulario es un array de campos que el núcleo de Drupal procesa y genera el html correspondiente. Así que añadimos un tipo de campo más:

  $form['info'] = array(
       '#type' => 'item',
       '#title' => t('¿Todavía tienes dudas? pues no dudes en visitar nuestras instalaciones situadas en XXXXXXXXXXXXXXXXXXXXX o si lo prefieres, ponte en contacto con nosotros a través de la web.'),
  );

Tened en cuenta que si ponéis código html dentro no hay ningún problema porque el navegador lo interpretará y por lo tanto podéis formatear el texto tanto cómo queráis. Finalmente, eliminamos la página de contacto que habíamos creado cuando hicimos la estructura básica ya que de momento no lo vamos a utilizar.
El último problema que tenemos que resolver es que el formulario de contacto sólo se muestra cuando estamos autenticados, para solucionar esto vamos a Home » Administration » People, en el tab Permissions y marcamos la opción de Anonymous user.


2 comentarios:

  1. Genial, estaba intentado ver como modficar el formulario por defecto del Contact y me estaba volviendo loco, ya que no sabía donde menterle mano.
    Gracias por el artículo.

    ResponderEliminar
  2. muchas gracias!! realmente es dificil encontrar informacion asi

    ResponderEliminar