你在这里


替换Drupal中的联系表单和邮件发送函数

James Qi 2013年1月31日 - 15:40 发布

  我们一些使用Drupal的网站中启用了系统自带的留言功能contact模块,用户使用的时候填入表单就可以反馈,不需要另外发送邮件,还是很方便的,但同事发现一些要求更改或者删除某个页面的留言中,用户并没有按照我们的提示填写需要更改或者删除的页面网址,导致需要反复联系多次,增加了工作量也不利于客户体验。

  本来同事是想在contact表单中加入一栏让用户填写相关的网址,但默认的contact模块并无此功能,这几天在网上搜索了半天才找到办法,就是修改contact模块中的表单及发送php程序可以搞定。我先是尝试直接修改drupal/modules/contact中的两个文件可以解决:

  • contact.pages.inc:修改其中的表单程序,添加一个表单域
  • contact.module:修改其中的邮件发送程序,添加新增的一个表单域的值

  又改进了一点,添加的一栏可以不需要用户填写,而是读取HTTP_REFERER函数,也就是上一页的来源网址,基本上都是用户需要修改或者删除的网址,采取hidden的表单域方式。

  上面的办法可以实现需要的功能,但修改core模块显然不是一个好办法,又花了好些时间在网上找更合适的方式,最后是采取自定义模块中调用hook_form_alter和hook_mail_alter的办法来实现,代码如下:

<?php
/*
* Implementation of hook_form_alter()
*/
function contact_referer_form_alter(&$form, &$form_state, $form_id) {
// We have to be careful to alter only the contact site form,
// as this hook is used for every form the system uses.
  if($form_id == 'contact_site_form' or $form_id == 'contact_mail_page'){
    $form['referer'] = array(
      '#type' => 'hidden',
      '#title' => t('REFERER'),
      '#required' => FALSE,
      '#maxlength' => 255,
      '#default_value' => $_SERVER['HTTP_REFERER'],
    );
  }
}
/*
* Implementation of hook_mail_alter()
*/
function contact_referer_mail_alter(&$message) {
// We have to be careful to alter only the contact form mail,
// as this hook is used for every mail the system sends.
  if ($message['id'] == 'contact_page_mail') {
    $message['body'][] = "HTTP_REFERER: ".$message['params']['referer'];
  }
}

  最后需要注意的是如果使用了boost缓存和captcha验证码,需要把contact页面排除,否则用户在第一遍输入验证码的时候可能会遇到报错,刷新后重新输入可以成功留言,但这是http_referer都变为/contact了,就失去了真正的来源网址。

 

自由标签:

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
验证码
本问题用于测试您是否为人类访问者,避免自动垃圾发贴。
图形验证
键入显示在图片中的字符