市場就是力量,discuz是國內(nèi)人氣最高,使用最廣泛的論壇系統(tǒng),發(fā)展到今天它已經(jīng)整合了論壇、門戶、博客、CMS等版塊,內(nèi)容豐富,深受用戶的喜愛,一直以來很多用戶用它來整合自己的應(yīng)用。由于discuz版塊眾多,系統(tǒng)相對封裝,源代碼缺少注釋,api資料不夠豐富,官方對discuz用戶的咨詢也并非賣力,而網(wǎng)上資料不是版本陳舊就是魚龍混雜。對于想整合discuz論壇的朋友存在一定的難度。因此,如果你想美好整合discuz的話,不妨耐心看完以下提示。
一、準(zhǔn)備工作
1、uc api說明書,通讀全文。參考http://faq.comsenz.com/library/UCenter/introduction/introduction_list.htm(官方),了解同步登陸機(jī)制
2、uc 后臺添加應(yīng)用說明。參考http://faq.comsenz.com/viewnews-506(官方) http://wenku.baidu.com/view/3790fdd7195f312b3169a588.html(草根)
3、uc client客戶端必要代碼,這里下載
4、如果是x3后面的版本,請先更改bug,參見http://www.discuz.net/thread-3505581-1-1.html
解決方案如下: /source/class/discuz的discuz_application.php 查找
<?php
PRivate function _xss_check() {static $check = array('"', '>', '<', '/'', '(', ')', 'CONTENT-TRANSFER-ENCODING');if(isset($_GET['formhash']) && $_GET['formhash'] !== formhash()) {system_error('request_tainting');}if($_SERVER['REQUEST_METHOD'] == 'GET' ) {$temp = $_SERVER['REQUEST_URI'];} elseif(empty ($_GET['formhash'])) {$temp = $_SERVER['REQUEST_URI'].file_get_contents('php://input');} else {$temp = '';}if(!empty($temp)) {$temp = strtoupper(urldecode(urldecode($temp)));foreach ($check as $str) {if(strpos($temp, $str) !== false) {system_error('request_tainting');}}}return true;}
二、示例
我們學(xué)習(xí)一門技術(shù)時(shí),看看它的技術(shù)說明就足夠了,但discuz遠(yuǎn)非如此。discuz不是zend frame、dedecms、ci這些白開水的東西,沒有一點(diǎn)鉆研精神和愛折騰的氣質(zhì)是無法理解它深?yuàn)W的內(nèi)涵,更不用說駕馭它。要達(dá)到成功,我們需要有詳盡的說明文字,另外還需要配備必要的圖片,雖然有了這些你也未必能夠成功。
先看一下我的項(xiàng)目結(jié)構(gòu)
tanahk 是真正的項(xiàng)目地址,x3.2是我的discuz論壇,打開它
可以看到這個(gè)discuz x3.2已經(jīng)整合了Ucenter,其中uc_server是uc服務(wù)器,uc_client是客戶端,uc_client這個(gè)文件夾在discuz x、discuz home、discuz xspace等產(chǎn)品中都是已經(jīng)捆綁好的。需要記住的一點(diǎn),在整個(gè)共用站點(diǎn)系統(tǒng)中,我們只需要一個(gè)uc_client,因?yàn)閡c_server只會(huì)在它定義的uc_client路徑中尋找data文件中的apps數(shù)組。
因此在多站點(diǎn)同步登陸登出的關(guān)鍵文件只有兩個(gè),一個(gè)是config.ini.php,另一個(gè)是uc.php。前者告訴uc_server我們這個(gè)應(yīng)用的配置,后者供uc_server調(diào)用。
把examples/api/uc.php文件復(fù)制到我們的tanahk/api/uc.php,examples/config.inc.php和examples/include也添加進(jìn)來。目錄結(jié)構(gòu)變?yōu)?/p>
code文件夾我用來查看一些源碼。
好了,現(xiàn)在可以在UCenter后臺添加我們的項(xiàng)目應(yīng)用了。uc的后臺一般為http://www.xxx.com/x3.2/uc_server/admin.php
選擇“應(yīng)用管理”--“添加新應(yīng)用”
參考上面準(zhǔn)備工作中2。
應(yīng)用類型:其它 應(yīng)用名稱:Tanahk,這里只能填寫英文 通信密鑰:隨意一串不多于64位的字母數(shù)字。 應(yīng)用的物理路徑:可以為空,只要應(yīng)用主url填寫正確 應(yīng)用接口文件名稱:保留,uc.php,不用填api/uc.php 是否開啟同步登陸:是,這是關(guān)鍵,以后多個(gè)項(xiàng)目共用一個(gè)uc就行了,不用自己新建一套用戶系統(tǒng)。 提交。
提交后一般是通信錯(cuò)誤的。
我們先修改tanahk/api/config.inc.php 。這里的數(shù)據(jù)非常重要,如果安裝了discuz x或其它discuz產(chǎn)品,最好對照discuz root/config下面的配置文件修改。
<?phpdefine('UC_CONNECT', null); // 連接 UCenter 的方式: MySQL/NULL, 默認(rèn)為空時(shí)為 fscoketopen() // mysql 是直接連接的數(shù)據(jù)庫, 經(jīng)實(shí)踐,還是填寫null好。mysql有時(shí)無法執(zhí)行//數(shù)據(jù)庫相關(guān) (mysql 連接時(shí), 并且沒有設(shè)置 UC_DBLINK 時(shí), 需要配置以下變量)define('UC_DBHOST', 'localhost'); // UCenter 數(shù)據(jù)庫主機(jī)define('UC_DBUSER', 'root'); // UCenter 數(shù)據(jù)庫用戶名define('UC_DBPW', '111111'); // UCenter 數(shù)據(jù)庫密碼define('UC_DBNAME', 'ultrax'); // UCenter 數(shù)據(jù)庫名稱define('UC_DBCHARSET', 'utf8'); // UCenter 數(shù)據(jù)庫字符集define('UC_DBTABLEPRE', '`ultrax`.pre_ucenter_'); // UCenter 數(shù)據(jù)庫表前綴define('UC_DBCONNECT', 0); // 是否持久化鏈接//通信相關(guān)define('UC_KEY', '…'); // 與 UCenter 的通信密鑰, 要與注冊應(yīng)用時(shí)填寫的保持一致define('UC_API', 'http://www.xxx.com/x3.2/uc_server'); // UCenter 的 URL 地址, 在調(diào)用頭像時(shí)依賴此常量define('UC_CHARSET', 'utf-8'); // UCenter 的字符集define('UC_認(rèn)真對照,特別是UC_KEY與UC_APPID,id一般為2以后的數(shù)字,查看uc后臺,1被discuz x霸占了。 上面的配置不能遺漏。 UC_DBHOST,如果填寫mysql,最好帶port,可以包括端口號,例如 “hostname:port”,或者到本地套接字的路徑,例如對于 localhost 的 “:/path/to/socket”。UC_PPP:默認(rèn)值為 20,與 UCenter 日志顯示的條數(shù)和通知管理顯示的條數(shù)有關(guān)系。
在上述配置最后加上一句 :
$cookiename = 'tanahk'; // 用戶自定義的cookie名它用來貯存用戶登陸成功后的cookie值。
我們現(xiàn)在需要花大力氣修改uc.php。首先是修改開頭的常量定義
error_reporting(0);define('IN_DISCUZ', TRUE);define('UC_CLIENT_VERSION', '1.5.0'); //note UCenter 版本標(biāo)識define('UC_CLIENT_RELEASE', '20081031');define('API_DELETEUSER', 1); //note 用戶刪除 API 接口開關(guān)define('API_RENAMEUSER', 1); //note 用戶改名 API 接口開關(guān)define('API_GETTAG', 1); //note 獲取標(biāo)簽 API 接口開關(guān)define('API_SYNLOGIN', 1); //note 同步登錄 API 接口開關(guān)define('API_SYNLOGOUT', 1); //note 同步登出 API 接口開關(guān)define('API_UPDATEPW', 1); //note 更改用戶密碼 開關(guān)define('API_UPDATEBADWordS', 1); //note 更新關(guān)鍵字列表 開關(guān)define('API_UPDATEHOSTS', 1); //note 更新域名解析緩存 開關(guān)define('API_UPDATEAPPS', 1); //note 更新應(yīng)用列表 開關(guān)define('API_UPDATECLIENT', 1); //note 更新客戶端緩存 開關(guān)define('API_UPDATECREDIT', 1); //note 更新用戶積分 開關(guān)define('API_GETCREDITSETTINGS', 1); //note 向 UCenter 提供積分設(shè)置 開關(guān)define('API_GETCREDIT', 1); //note 獲取用戶的某項(xiàng)積分 開關(guān)define('API_UPDATECREDITSETTINGS', 1); //note 更新應(yīng)用積分設(shè)置 開關(guān)define('API_RETURN_SUCCEED', '1');define('API_RETURN_FAILED', '-1');define('API_RETURN_FORBIDDEN', '-2');// 改你真實(shí)的discuz地址define('DISCUZ_ROOT', realpath(dirname(__FILE__) . '/../../x3.2/'));// 本應(yīng)用配置路徑define('DISCUZ_UC_CONFIG', realpath(dirname(__FILE__)));然后是修改下面的note通知方式。
//note 普通的 http 通知方式if(!defined('IN_UC')) { if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } // set_magic_quotes_runtime 5.3.0版本不贊成使用,5.4.0廢棄 if (PHP_VERSION_ID < 530) set_magic_quotes_runtime(0); // 修改常量MAGIC_QUOTES_GPC,與php5.4接地氣,讓它一直為false define('MAGIC_QUOTES_GPC', false); require_once DISCUZ_UC_CONFIG . '/config.inc.php'; $GLOBALS['cookiename'] = $cookiename; $_DCACHE = $get = $post = array(); $code = isset($_GET['code']) ? $_GET['code'] : ''; parse_str(_authcode($code, 'DECODE', UC_KEY), $get); $timestamp = time(); if($timestamp - $get['time'] > 3600) exit('Authracation has expiried'); if(empty($get)) exit('Invalid Request'); $action = $get['action']; require_once DISCUZ_ROOT . '/uc_client/lib/xml.class.ph
新聞熱點(diǎn)
疑難解答
圖片精選