2012年6月24日 星期日

在 CodeIgniter 中整合 Discuz X2.5, 引用超級變數 $_G 來獲取用戶名, uid等資訊.

origin: https://github.com/QueenbyeR/blog-text/blob/master/%E5%9C%A8%20CodeIgniter%20%E4%B8%AD%E6%95%B4%E5%90%88%20Discuz%20X2.5%2C%20%E5%BC%95%E7%94%A8%E8%B6%85%E7%B4%9A%E8%AE%8A%E6%95%B8%20%24_G%20%E4%BE%86%E7%8D%B2%E5%8F%96%E7%94%A8%E6%88%B6%E5%90%8D%2C%20uid%E7%AD%89%E8%B3%87%E8%A8%8A/page-001.md



環境:
  • CodeIgniter 2.1.2
  • Discuz X2.5 (2012年4月7日繁體中文UTF8)
目錄:
  • CodeIgniter 在 /
  • Discuz 在 /bbs/ (程式碼會因路徑而稍微有所不同)
這次是我第一次使用 Discuz 也是第一次使用 CI。主要網站應用程式用 CI 寫,另外架了個 Discuz 作論壇以及網站會員管理。所以我必須要能夠在 CI 程式中,取得用戶從 Discuz 登入後的用戶資訊 (當前用戶名、uid等)。
試過了 UCenter 來取得資訊,行不通 (一定是我太蠢了),而且網路上都找不到良好的解決方案。
要透過 UCenter 來取得用戶資訊,必須先取得用戶名或其uid,但我就是卡在無法從 cookie 上解密 Discuz 的用戶名出來;網上找了一下,應該是 Discuz 的加密方法不一樣,爬了一些 Disucz 核心,還是找不到好的方法,只好以最少的核心改動來兼容 CI。

改動檔案

本改動未經測試過安全性、性能等指標。僅供參考。
打開 \www\bbs\source\class\discuz\discuz_application.php
找到
    class discuz_application extends discuz_base{
在之後加入
var $is_in_bbs = true;

找到
public function __construct() {
在之後加入
if ( ! strpos($_SERVER['REQUEST_URI'], 'bbs') ) $this->is_in_bbs = false;

找到
    $this->_init_env();
    $this->_init_config();
    $this->_init_input();
    $this->_init_output();
取代為
    $this->_init_env();
    $this->_init_config();
    $this->_init_input();
    if ($this->is_in_bbs) $this->_init_output();

找到
define('IS_ROBOT', checkrobot());

foreach ($GLOBALS as $key => $value) {
    if (!isset($this->superglobal[$key])) {
        $GLOBALS[$key] = null; unset($GLOBALS[$key]);
    }
}
取代為
define('IS_ROBOT', checkrobot());

if ($this->is_in_bbs) {
    foreach ($GLOBALS as $key => $value) {
        if (!isset($this->superglobal[$key])) {
            $GLOBALS[$key] = null; unset($GLOBALS[$key]);
        }
    }
}

沒有留言:

張貼留言