我们一些使用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了,就失去了真正的来源网址。
评论