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