用户
 找回密码
 入住 CI 中国社区
搜索
查看: 7575|回复: 3
收起左侧

[库 Library] 在CI中使用PEAR类库的解决方法

[复制链接]
发表于 2008-9-23 11:34:49 | 显示全部楼层 |阅读模式
昨天看到有朋友询问如何在CI中使用PEAR类库的方法,当时提出了一个实现的思想。
原帖: http://codeigniter.org.cn/forums/thread-1064-1-1.html


现在基于第二个思路,添加PEAR类库载入通道,解决方法简单实现一下:

1、PEAR属于第三方类库,放在 application/libraries/PEAR 下面(当做自制类库对待);
2、PEAR类库平铺展开,取消子目录以及编辑包含路径;
3、继承扩展Loader类库,添加pear载入方法,并添加两个私有内置方法 _ci_load_pear 和 _ci_init_pear;
4、默认先装载 PEAR.php基类(也可以取消,直接装载相应类库);
5、然后装载相应的应用类库,需要提供类库前缀(因和CI命名约定不同),参数采用数组传递,然后初始化的时候利用implode 展开参数;
6、需要修改Base4.php文件,替换成扩展Loader类库;

扩展Loader类库代码如下:

PHP复制代码
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* LEMON
* QQ 83997439
* lemonfz@gmail.com
*
*/

 
class FG_Loader extends CI_Loader {
/**
  * Constructor
  *
  * Sets the path to the view files and gets the initial output buffering level
  *
  * @access public
  */

function FG_Loader()
{  
  parent::CI_Loader();
}
 
// --------------------------------------------------------------------
 
/**
  * Class Loader
  *
  * This function lets users load and instantiate classes.
  * It is designed to be called from a user's app controllers.
  *
  * @access public
  * @param string the name of the class
  * @param mixed the optional parameters
  * @return void
  */

function pear ($library = '', $prefix = '', $params = NULL)
{  
  if ($library == '')
  {
   return FALSE;
  }
  if (is_array($library))
  {
   foreach ($library as $class)
   {
    $this->_ci_load_pear($class, $prefix, $params);
   }
  }
  else
  {
   $this->_ci_load_pear($library, $prefix, $params);
  }
 
  $this->_ci_assign_to_models();
}
// --------------------------------------------------------------------    
/**
  * Load class
  *
  * This function loads the requested class.
  *
  * @access private
  * @param  string the item that is being loaded
  * @param mixed any additional parameters
  * @return  void
  */

function _ci_load_pear($class, $prefix, $params = NULL)
{
  // Get the class name
 
  $subclass = APPPATH . 'libraries/PEAR/' . $class . EXT;
  // Is this a class extension request?  
  if ( file_exists ( $subclass ) ) {
   $baseclass = APPPATH . 'libraries/PEAR/PEAR' . EXT;
   
   if ( ! file_exists ( $baseclass ) ) {
    log_message ( 'error', "Unable to load the requested class: " . $baseclass );
    show_error ( "Unable to load the requested class: " . $baseclass );
    return;
   }
     
   require_once $baseclass;
   require_once $subclass;
   
   $this->_ci_classes[] = $subclass;
   return $this->_ci_init_pear($class, $prefix, $params);  
  }
 
  log_message('error', "Unable to load the requested class: ".$class);
  show_error("Unable to load the requested class: ".$class);      
}
 
// --------------------------------------------------------------------
/**
  * Instantiates a class
  *
  * @access private
  * @param string
  * @param string
  * @return null
  */

function _ci_init_pear($class, $prefix = '', $params = NULL)
{
       
  $name = $prefix . $class;
 
  $var = "pear_" . strtolower ( $class );
 
  // Set the variable name we will assign the class to
  $classvar = ( ! isset($this->_ci_varmap[$var])) ? $var : $this->_ci_varmap[$var];
   
  // Instantiate the class
  $CI =& get_instance();
  if ($params !== NULL)
  {
   $CI->$classvar = new $name ( implode ( ',', $params ) );
  }
  else
  {  
   $CI->$classvar = new $name;
  }
}  
 
// --------------------------------------------------------------------  
}
/* End of file FG_Loader.php */
/* Location: ./application/libraries/FG_Loader.php */
复制代码


载入PEAR类库:

PHP复制代码
$this->load->pear ('SMTP', 'Net_' );
 
  if ( isset ($this->pear_smtp) ) {
   echo "pear load OK!";
  }
  else {
   echo "pear load faild!";
  }
复制代码


存在的问题:
1、PEAR的树形路径包含需要解决,以能够完整解决此问题;
2、需要硬性修改Base4.php文件,这是我不愿意的地方,很不爽,不知道有没有其他方式绕过去;
3、只是简单的载入类库,其他功能和细节没有严格测试;

最后,时间比较仓促,只是提供了一个思路的解决方法,希望有精力的朋友不断去完善,或者提出更好的方法。毕竟PEAR是一个非常丰富的类库,CI作为框架不可能实现自带很多类库,并做到功能很强大,所以直接引入PEAR类库未尝不是一个很好的办法。


类库源代码下载: codeigniter-use-pear.rar (2.13 KB, 下载次数: 16)

评分

参与人数 1威望 +5 收起 理由
Hex + 5 原创内容

查看全部评分

发表于 2008-10-30 14:32:10 | 显示全部楼层
如果是 PHP5 就可以用  MY_Loader 实现不修改系统核心代码了。

我认为楼主的 FG_Loader 应该写成 MY_Loader,会比较好。
 楼主| 发表于 2008-12-21 15:07:19 | 显示全部楼层
个人习惯FG_开头,大家按照自己的需要替换一下吧。
 楼主| 发表于 2008-12-24 22:57:07 | 显示全部楼层

將 PEAR 放進 CodeIgniter

上面我提到的思路的解决方法实际上相对复杂,同样是提供类库导入通道,我的思路是依据CI的Load机制来做,而本文的作者却另辟蹊径,采用了一种更简单的方法。实际上我们可以把这个问题想的再简单的一点,只要记住:“载入一个类库实际上就是最终只要能include/require这个文件就可以了”。

下面是作者原文:

將 PEAR 放進 CodeIgniter這個做法是參考此篇「Using Zend Framework with CodeIgniter」修改而來的。
事實上外掛Zend的需要性可能比PEAR還要高,我之所以要外掛PEAR來做是因為CI的分頁類好像有問題@_@,索性就直接使用PEAR的分頁類了,而且PEAR的分頁類還有Jumping和Sliding不同模式可選用,在某些情況下,PEAR的彈性可能比較高。however...看你喜不喜歡多掛一個做同樣事情的library而已。
一、下載PEAR函式庫必要的「PEAR核心檔」即可,然後再下載所需的類別套件,以我為例就是「Pager套件」,最終的資料夾結構大概長這樣


二、將PEAR放到你的applicaiton/libraries/中,在application/libraries/中建立一個新檔,並命名為PEAR.php的類別檔(注意與applicaiton/libraries/PEAR底下的PEAR.php是不一樣的,不要混淆了),內容如下:

PHP复制代码
 
if (!defined('BASEPATH')) {exit('No direct script access allowed');}
class CI_PEAR
{
        /**
         * Constructor
         *
         * @param        string $class class name
         */

        function __construct($class = NULL)
        {
                // include path for PEAR library
                // alter it accordingly if you have put the 'PEAR' folder elsewhere
                ini_set('include_path',
                ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries/PEAR');
 
                if ($class)
                {
                        require_once (string) $class . EXT;
                        log_message('debug', "PEAR Class $class Loaded");
                }
                else
                {
                        log_message('debug', "PEAR Class Initialized");
                }
        }
 
        /**
         * PEAR Class Loader
         *
         * @param        string $class class name
         */

        function load($class)
        {
                require_once (string) $class . EXT;
                log_message('debug', "PEAR Class $class Loaded");
        }
}
 
复制代码


三、在controllers中,你就可以這樣的使用

PHP复制代码
 
 
//注意,不必加上最後的.php
$this->pear->load('PEAR/Pager/Pager');
//設定分頁參數
$params = array(
    'mode'       => 'Jumping',
    'perPage'    => 3,
    'delta'      => 2,
    'itemData'   => array('a','b','c','d','e',[...omissis...],'z')
);
$pager = Pager::factory($params);
$data  = $pager->getPageData();
$links = $pager->getLinks();
 
复制代码



原文地址: http://doublekai.org/blog/?p=658
另一篇参考文章: Using Zend Framework with CodeIgniter

欢迎访问我的博客: http://blog.lemonfz.com/articles/the-pear-into-codeigniter.html

[ 本帖最后由 LEMON 于 2008-12-25 00:26 编辑 ]

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

本版积分规则