2010-03-24 79 views
2

我無法將模型加載到codeigniter中的擴展My_Router類。以下是我的代碼:如何在codeigniter中的擴展MY_Router類中加載模型

class MY_Router extends CI_Router { 

    function MY_Router() 
    { 
     parent::CI_Router(); 
    } 

    function _validate_request($segments) 
    { 
     // Does the requested controller exist in the root folder? 
     if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) 
     { 
      return $segments; 
     } 

     // Is the controller in a sub-folder? 
     if (is_dir(APPPATH.'controllers/'.$segments[0])) 
     { 
      // Set the directory and remove it from the segment array 
      $this->set_directory($segments[0]); 
      $segments = array_slice($segments, 1); 

      if (count($segments) > 0) 
      { 
       // Does the requested controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) 
       { 
        show_404($this->fetch_directory().$segments[0]); 
       } 
      } 
      else 
      { 
       $this->set_class($this->default_controller); 
       $this->set_method('index'); 

       // Does the default controller exist in the sub-folder? 
       if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) 
       { 
        $this->directory = ''; 
        return array(); 
       } 

      } 
      return $segments; 
     } 

     // Let's check if there are category segments 
    $category_routes = $this->category_routing($segments); 
     if($category_routes !== FALSE) 
    { 
      return $category_routes; 
     } 
    $user_routes = $this->user_routing($segments); 
    if($user_routes != FALSE) 
    { 
     return $user_routes; 
    } 

     show_404($segments[0]); 
    } 

    function category_routing($segments) 
    { 
     $this->load->model('category_model'); 
     if($this->category_model->category_exist($segments[0])) 
     { 
      //if only category 
      if(count($segments)==1) 
      { 
       return array('category', 'category_browse', $segments[0]); 
      } 
      //category pagination 
      if(count($segments)==2 and is_numeric($segments[1])) 
      { 
       return array('category','category_browse', $segments[0], $segments[1]); 
      } 
      //category upcoming 
      if(count($segments)==2 and $segments[1] == 'upcoming') 
      { 
       return array('category','upcoming', $segments[0]); 
      } 
      //category upcoming pagination 
      if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3])) 
      { 
       return array('category','upcoming', $segments[0], $segments[3]);  
      } 
      //category top 
      if(count($segments)==3 and $segments[1] == 'top') 
      { 
       return array('category','top', $segments[0], $segments[2]); 
      } 
      //category top pagination 
      if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3])) 
      { 
       return array('category','top', $segments[0], $segments[3]); 
      } 
     } 
     return FALSE; 
    } 

    function user_routing($segments) 
    { 
     $this->load->model('dx_auth/users', 'user_model'); 
     if($this->user_model->check_username($segments[0])) 
     { 
      //only profile 
      if(count($segments)==1) 
      { 
       return array('user','profile',$segments[0]);  
      } 
      //all friends 
      if(count($segments)==2 and $segment[1]=='allfriends') 
      { 
       return array('user','allfriends',$segments[0]); 
      } 
      //all subscribers 
      if(count($segments)==2 and $segment[1]=='allsubscribers') 
      { 
       return array('user','allsubscribers',$segments[0]); 
      } 
      //all subscription 
      if(count($segments)==2 and $segment[1]=='allsubscriptions') 
      { 
       return array('user','allsubscriptions',$segments[0]); 
      } 
     } 
     return FALSE; 
    } 
} 

我已經嘗試使用codeigniter提供的get_instance函數加載模型,但似乎它不工作。我需要的只是在擴展系統庫中加載模型。

回答

0

這是我做的,它的工作..謝謝菲爾的建議。

class MY_Router extends CI_Router { 

function MY_Router() 
{ 
    parent::CI_Router(); 
} 

function _validate_request($segments) 
{ 
    // Does the requested controller exist in the root folder? 
    if (file_exists(APPPATH.'controllers/'.$segments[0].EXT)) 
    { 
     return $segments; 
    } 

    // Is the controller in a sub-folder? 
    if (is_dir(APPPATH.'controllers/'.$segments[0])) 
    { 
     // Set the directory and remove it from the segment array 
     $this->set_directory($segments[0]); 
     $segments = array_slice($segments, 1); 

     if (count($segments) > 0) 
     { 
      // Does the requested controller exist in the sub-folder? 
      if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT)) 
      { 
       show_404($this->fetch_directory().$segments[0]); 
      } 
     } 
     else 
     { 
      $this->set_class($this->default_controller); 
      $this->set_method('index'); 

      // Does the default controller exist in the sub-folder? 
      if (! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT)) 
      { 
       $this->directory = ''; 
       return array(); 
      } 

     } 
     return $segments; 
    } 

    // Let's check if there are category segments 
    $category_routes = $this->category_routing($segments); 
    if($category_routes !== FALSE) 
    { 
     return $category_routes; 
    } 
    $user_routes = $this->user_routing($segments); 
    if($user_routes !== FALSE) 
    { 
     return $user_routes; 
    } 

    show_404($segments[0]); 
} 

function category_routing($segments) 
{ 
    if($this->check_category_exist($segments[0])) 
    { 
     //if only category 
     if(count($segments)==1) 
     { 
      return array('category', 'category_browse', $segments[0]); 
     } 
     //category pagination 
     if(count($segments)==2 and is_numeric($segments[1])) 
     { 
      return array('category','category_browse', $segments[0], $segments[1]); 
     } 
     //category upcoming 
     if(count($segments)==2 and $segments[1] == 'upcoming') 
     { 
      return array('category','upcoming', $segments[0]); 
     } 
     //category upcoming pagination 
     if(count($segments)==3 and $segments[1] == 'upcoming' and is_numeric($segments[3])) 
     { 
      return array('category','upcoming', $segments[0], $segments[3]);  
     } 
     //category top 
     if(count($segments)==3 and $segments[1] == 'top') 
     { 
      return array('category','top', $segments[0], $segments[2]); 
     } 
     //category top pagination 
     if(count($segments)==4 and $segments[1] == 'top' and is_numeric($segments[3])) 
     { 
      return array('category','top', $segments[0], $segments[3]); 
     } 
    } 
    return FALSE; 
} 

function check_category_exist($cat_name) 
{ 
    //connect to database and find the category 
    include(APPPATH.'config/database'.EXT); 
    $conn = mysql_connect($db['default']['hostname'],$db['default']['username'],$db['default']['password']); 
    mysql_select_db($db['default']['database'],$conn); 
    $sql = sprintf("SELECT COUNT(id) as count FROM categories WHERE permalink = '%s'", mysql_real_escape_string($cat_name)); 
    $query = mysql_query($sql); 
    $row = mysql_fetch_object($query); 
    mysql_close($conn); 
    if($row->count) 
    { 
     return TRUE; 
    } 
    return FALSE; 
} 

function user_routing($segments) 
{ 
    if($this->check_username_exist($segments[0])) 
    { 
     //only profile 
     if(count($segments)==1) 
     { 
      return array('user','profile',$segments[0]);  
     } 
     //all friends 
     if(count($segments)==2 and $segments[1]=='allfriends') 
     { 
      return array('user','allfriends',$segments[0]); 
     } 
     //all subscribers 
     if(count($segments)==2 and $segments[1]=='allsubscribers') 
     { 
      return array('user','allsubscribers',$segments[0]); 
     } 
     //all subscription 
     if(count($segments)==2 and $segments[1]=='allsubscriptions') 
     { 
      return array('user','allsubscriptions',$segments[0]); 
     } 
    } 
    return FALSE; 
} 

function check_username_exist($username) 
{ 
    //connect to database and find the category 
    include(APPPATH.'config/database'.EXT); 

    $conn = mysql_connect($db['default']['hostname'], $db['default']['username'], $db['default']['password']); 
    mysql_select_db($db['default']['database'],$conn); 
    $sql = sprintf("SELECT COUNT(id) as count FROM users WHERE username = '%s'", mysql_real_escape_string($username)); 
    $query = mysql_query($sql); 
    $row = mysql_fetch_object($query); 
    mysql_close($conn); 
    if($row->count) 
    { 
     return TRUE; 
    } 
    return FALSE; 
} 

}

-1

當使用外部庫基笨類,你必須再次調用它是這樣的:

// load it 
$CI =& get_instance(); 
$CI->load->model('model_name'); 

//use it 
$CI->model_name->method() 

希望幫助

+0

他正在路由器中使用get_instance(),這會導致致命錯誤。 – 2010-03-25 10:37:09

+0

是的菲爾是正確的我找到了一條出路,我做了包括數據庫配置和連接到我的數據庫使用PHP myslq函數,並可以訪問數據庫。我在這裏發佈我的代碼。可能對嘗試這樣做的人有所幫助。 – Yalamber 2010-03-27 04:36:28

3

不存在對CodeIgniter的超級全局沒有訪問,直到CI_Base一直這稱爲由Controller擴展的。控制器類然後加載裝載機庫:

// In PHP 5 the Loader class is run as a discreet 
    // class. In PHP 4 it extends the Controller 
    if (floor(phpversion()) >= 5) 
    { 
     $this->load =& load_class('Loader'); 
     $this->load->_ci_autoloader(); 
    } 

路由器裝載非常上(在系統/笨/ CodeIgniter.php一看,看什麼時候,上線99),因此具有可幾乎任何東西。

你可以使用load_class('Whatever');以不同的順序加載類,但如果你不小心,這可能會帶來一些問題,並且你仍然無法訪問數據庫驅動程序。

基本上,你不能這樣做。您需要嘗試直接使用數據庫庫或使用本機MySQL綁定來訪問您的數據。

+0

感謝菲爾在下面看到我的答案,它的工作方式。 – Yalamber 2010-03-27 04:38:48

+0

使用本機MySQL綁定是我的建議。你欠我一分;-) – 2010-03-28 10:46:53

0

下面的代碼將解決你的問題太多,將讓您的編碼極大的方便,靈活。

require_once(BASEPATH . 'database/DB' . EXT); 
$db = & DB(); 
$query = $db->query("select ..."); 
$results = $query->result();