論壇升級後發現註冊用戶在輸入任何郵箱email時,一直提示email 地址無效.用firephp跟蹤發現:隨機生成的email的後綴是@localhost!php
找到緣由,修改以下:sql
//原來代碼if(empty($email) && $_G['setting']['forgeemail']) {$_GET['email'] = $email = strtolower(random(6)).'@'.$_SERVER['HTTP_HOST']; }//可是若是本地調試emai後綴就是@localhost,不符合郵箱的規則if(empty($email) && $_G['setting']['forgeemail']) {$_GET['email'] = $email = strtolower(random(16)).'@'.'klaus.com'; }//增長了16位隨機碼,減小生成相同的郵箱機率; //後綴固定,這樣就不提示'Email 地址無效'了!
可是這個感受太lower了,回到dz3.1之前的玩法是:數據庫
在DZ3.2之前的版本的後臺咱們能夠在全局——註冊與訪問——取消郵箱註冊必填以下圖:
緩存
接下來就問題來了,Discuz官方團隊可能也考慮到了這個問題,也許他們也像我這樣認爲這個地方在後臺出現沒多大必要,因而他們就在X3.2版本中更新了這個模塊,更新的結果我以爲應該是這樣的:在後臺取消這個設置,但數據庫裏面存儲的信息不變,並且在註冊的時候再也不使用這個數據庫裏面的設置的值爲依據。因而就形成了上面的問題了,雖然讓用戶以爲不須要必須填(由於沒紅星),但不填以後註冊不了dom
經過對X3.1後臺設置分析發現這裏是一個radio類型的,也就是開關(廢話而已,誰都看得出來);表單name爲settingnew[forgeemail],值爲0和1,0爲關閉,1爲打開,這個跟通常的習慣都是同樣的。也就是說這個值選擇1時咱們註冊的時候能夠不須要填寫郵箱,反之也就是默認狀況下咱們必須填寫郵箱才能註冊賬號。ide
而作過Discuz二次開發的同窗都應該清楚,其實後臺相似這樣的設置數據都是存儲在common_setting這個數據表中,而很快我發現這個數據表中直接有forgeemail這個記錄,說明這個地方dz是直接保存的(不想保存高亮值信息那樣,還經過進制轉化,哈哈,不用再看源代碼去了)。以下圖(固然下面是默認的樣子)
工具
說到這裏你們就應該明白了什麼問題了,其實這個問題就是3.2之後這個數據表中的skey爲forgeemail的記錄只是用於判斷是否帶紅星,而不用於判斷是否是真要填;換句話說無論這裏設置的是0仍是1,你的網站註冊的時候都得填寫郵箱(這可能也是DZ團隊在升級改變這個問題所忽視的地方,好比就算強制設計成必填,那麼也應該把數據庫的這個字段值在升級的時候自動覆蓋成0了)。網站
那麼若是完全解決(也就是可讓你的網站實現用戶不沒必要填寫郵箱也能夠註冊),這個相對比較複雜,要修改你註冊表單的驗證程序,並且我我的也不推薦這麼作,這裏就不詳述了。this
那麼接下來就是把註冊的時候帶上紅星(其實默認的時候就是這樣的),固然問題是針對在3.2以前經過後臺設置過這值的網站。那麼如今去數據庫找到common_setting這個數據表找到skey值forgeemail的svalue改成默認的0就能夠了,也能夠在數據庫管理工具或者網站後臺運行如下sql語句url
update pre_common_setting set 'svalue'='0' where 'skey'='orgeemail' 注意:這裏的表前綴爲DZ的默認的pre_,若是你修改了,改爲你新修改的
discuzX3.2後臺關閉註冊郵箱必填選項的功能。詳細過程以下:
步驟1:source/admincp/admincp_setting.php 文件
查找:
showsetting('setting_access_register_send_register_url', 'settingnew[sendregisterurl]', $setting['sendregisterurl'], 'radio');
大概是440-441行:
增長如下代碼:
showsetting('setting_access_register_forge_email', 'settingnew[forgeemail]', $setting['forgeemail'], 'radio');
步驟2:打開source/language/lang_admincp.php 文件
查找: 一個郵箱只容許註冊一個賬戶
大概811行,增長如下代碼:
'setting_access_register_forge_email' => '取消註冊郵箱必填', 'setting_access_register_forge_email_comment' => '開啓後若是用不不填寫註冊郵箱,將自動生成一個郵箱地址',
步驟3:修改source
/class/class_member.php
大概611行:
原文是:
$email = strtolower(trim($_GET['email']));if(empty($this->setting['ignorepassword'])) {if($_GET['password'] !== $_GET['password2']) { showmessage('profile_passwd_notmatch'); }if(!$_GET['password'] || $_GET['password'] != addslashes($_GET['password'])) { showmessage('profile_passwd_illegal'); } $password = $_GET['password']; } else { $password = md5(random(10)); } }
修改成(或直接替換如下:)
$email = strtolower(trim($_GET['email']));if(empty($email) && $_G['setting']['forgeemail']) { $_GET['email'] = $email = strtolower(random(6)).'@'.$_SERVER['HTTP_HOST']; }if(empty($this->setting['ignorepassword'])) { if($_GET['password'] !== $_GET['password2']) { showmessage('profile_passwd_notmatch'); } if(!$_GET['password'] || $_GET['password'] != addslashes($_GET['password'])) { showmessage('profile_passwd_illegal'); } $password = $_GET['password']; } else { $password = md5(random(10)); } }
工具->更新緩存:
全局->註冊與訪問控制:
若是你想在註冊頁面不顯示 註冊郵箱選項,直接去掉模板中的相應的email代碼便可。