顯示具有 Discuz 標籤的文章。 顯示所有文章
顯示具有 Discuz 標籤的文章。 顯示所有文章

2012年8月13日 星期一

解決 Codeigniter-Smarty 與 Discuz X 2.5 相衝突的問題.


origin: https://github.com/QueenbyeR/blog-text/blob/master/%E8%A7%A3%E6%B1%BA%20Codeigniter-Smarty%20%E8%88%87%20Discuz%20X%202.5%20%E7%9B%B8%E8%A1%9D%E7%AA%81%E7%9A%84%E5%95%8F%E9%A1%8C/page-001.md


目錄環境

  • PHP 5.4
  • Apache 2.2
  • CodeIgniter 2.1.2
  • CodeIgniter-Smarty
  • Discuz X2.5 (2012年4月7日繁體中文UTF8)
  • CodeIgniter 在 /
  • Discuz 在 /bbs/ (程式碼會因路徑而稍微有所不同)

問題

使用 Smarty 時,在各別樣版首次執行時,\smarty_compile_dir 內若無已存在的樣版的話,會造成以下錯誤:
Discuz! System Error
Oops! System file lost: class/smarty/smarty_internal_templatecompilerbase.php

解決

打開 \www\bbs\source\class\class_core.php
找到 throw new Exception('Oops! System file lost: '.$filename);
在前一行加入
    if ( ! strpos($_SERVER['REQUEST_URI'], 'bbs') ) return true;

2012年7月2日 星期一

解決 Codeigniter 的 display_override hook 與 Disucz X2.5 衝突

為了能夠在 CI 中,取得 Discuz $_G 這個超級變數,我把 /source/class/class_core.php 直接載入了 CI 作為一個 Librarries。

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


但由於 Discuz X2.5 有自己的一套 input、output 機制,導致於我為 CI 所撰寫的  $hook['display_override']  會沒有反應。


這是因為 discuz 把 ob_start 設為 NULL 了,使得 $CI->output->get_output() 取不到半點字串。

為了讓它能夠正常運作,採用了一個較直接的思路:
「如果目前沒有瀏覽著論壇,則不呼叫 disucz 的 _init_output 方法」

if strpos($_SERVER['REQUEST_URI']'bbs'$this->is_in_bbs false;
...
if ($this->is_in_bbs$this->_init_output();

再觀察看看有沒有其它問題...

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]);
        }
    }
}