2012-09-26 53 views
0

我希望有人能帮助我这个人之前我跳下窗口。我花了几个小时在这一个,不知道我在做什么错。为什么我无法在模块中加载模型? [在笨2.1.2使用HMVC]

基本上,我在笨2.1.2安装HMVC,一切工作正常,但由于某种原因无法加载模型我做它的标准控制器相同的方式。在旧的codeigniter 1.7.1中,我可以简单地通过调用$ this-> load-> model('my_model')来使用它,但现在我不能?!

我试图加载模式,我得到这个错误每一个时间:

A PHP Error was encountered 
Severity: Notice 
Message: Undefined property: Special_cart::$db 
Filename: core/Model.php 
Line Number: 51 

我已经安装了它按照指示一步一步。我在模块文件夹旁边获得third_party。在模块我已经存储了这样几个模块:

modules 
--boxes 
----controller 
----models 
----views 

我调用模块在我的代码是这样的:

<?=modules::run('boxes/special_cart/index');?> 

我模块控制器代码如下所示:

class Special_cart extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

    } 





    public function index() 
    { 
     if ($this->session->userdata('cart')) 
     { 
      # get product id's and each quantity 

      $cart_product_list = array_count_values($this->session->userdata('cart')); 

      # get list of product_id 
      $product_list = array_keys($cart_product_list); 

      # get product details 
      $this->load->model('productmodel'); 
      $this->load->model('stockmodel'); 

      $cart_products = $this->productmodel->cart_get_products_details($product_list); 
      $final_cart_array = array(); 

      foreach($cart_products as $cart_product){ 
       $product_stock = $this->stockmodel->view_product_stock($cart_product["id"]); 
       if(empty($product_stock) || $product_stock["UNITS"]<=0) 
        $cart_product["UNITS"] = 0; 
       else{ 
        if($cart_product_list[$cart_product["id_web"]]>$product_stock["UNITS"]) 
         $cart_product["UNITS"] = $product_stock["UNITS"]; 
        else{ 
         $cart_product["UNITS"] = $cart_product_list[$cart_product["id_web"]]; 
        } 
       } 
       $final_cart_array[] = $cart_product; 

      } 

      $refresh_cart_array = array(); 


      foreach($final_cart_array as $cart_product){ 

       for($i=1;$i<=$cart_product["UNITS"];$i++){ 
        $refresh_cart_array[] = $cart_product["id_web"]; 
       } 

      } 


      $this->load->view("special_cart",array(
               'refresh_cart_array'  => $refresh_cart_array, 
               'final_cart_array' => $final_cart_array 
               )); 





       } else { 
       $this->load->view("special_cart",array(
                'refresh_cart_array'  => NULL, 
                'final_cart_array' => NULL 
                )); 

        } 
      } 

} 

我已经试过互联网上找到每一个可能的解决方案 - 他们没有工作.... 我希望你明白我的问题,但如果你需要一些进一步的解释,请叫我。谁能帮忙?

回答

0

貌似你试图负载要连接到数据库的模型,但数据库驱动程序不可用。如果在应用程序中使用数据库查询,为什么不自动加载数据库驱动程序?

中的application/config/autoload.php文件中的 “库” 数组中只需插入 “数据库”。不要忘记将你的数据库凭证插入到application/config/database.php中。

$autoload['libraries'] = array('database'); 

如果您只需在一个模型中建立数据库连接,请在尝试访问数据库库之前加载它。

$this->load->database(); 
+0

这是我在我的配置文件:$ autoload ['libraries'] = array('session','database','form_validation','email','redux_auth');.我也尝试加载你在单个模型中提到的数据库,但是没有工作:/ HMVC内核中可能存在一些错误? – Pavel

0

尝试使用扩展MX_Controller类(不CI_Contoller像你大气压做)根据你已经在评论上面写道

,我想你试图模块来创建数据库的新实例(基于chrises评论)。 做它Special_cart

的constuctor

所以更新当前构建要像

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->database('default'); 
} 

(我是从我的头顶写这个,所以检查的方法)

现在肯定分贝驱动程序应该在您的模型中可用。

关于与HMVC我不认为有任何问题。我使用HMVC有一段时间了,我没有发现任何问题,它(使用数据库)

+0

但是,当插入到自动加载配置中时,db驱动程序是否也没有被加载?有了这个,数据库驱动程序应该准备好,即使在模型的构造函数中,不应该吗? –

+0

它应该,是的。但基于问题,情况并非如此。 由于某些原因,CI从MX加载时丢失了db类的实例。不知道为什么,但从以前的经验来看,这是代码本身会丢失指向另一个以前创建的对象的极端情况。这就是为什么我写信来尝试重新加载数据库,看看它会有帮助。但第一个解决方案是改变Special_cart的父类。 $ this-> load-> database('default')只是确认db实例已经创建并可用。 – NemC

0

尝试加载模型声明模块名称如下

 
    $this->load->model('module_name/productmodel'); 

0
Class Models extends MX_Loader{ 

    function getUser($username){ 

     $sql="SELECT * FROM user WHERE username = ? "; 
     return $this->db->query($sql,array($username))->row(); 

    } 
} 

必须使用扩展MX_Loader因为我不知道如果使用CI_Model数据库核心无法在Codeigniter负载,,,

0

我有同样的问题和错误。我错过了将控制器扩展到MX_Controller。因此,解决办法是将是CI_Controller改变MX_Controller这样的:

class Special_cart extends MX_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('productmodel'); 
     $this->load->model('stockmodel'); 
    } 

    public function index() 
    { 
     if ($this->session->userdata('cart')) 
     { 
      # get product id's and each quantity 

      $cart_product_list = array_count_values($this->session->userdata('cart')); 

      # get list of product_id 
      $product_list = array_keys($cart_product_list); 

      # get product details 

      $cart_products = $this->productmodel->cart_get_products_details($product_list); 
      $final_cart_array = array(); 

      foreach($cart_products as $cart_product){ 
       $product_stock = $this->stockmodel->view_product_stock($cart_product["id"]); 
       if(empty($product_stock) || $product_stock["UNITS"]<=0) 
        $cart_product["UNITS"] = 0; 
       else{ 
        if($cart_product_list[$cart_product["id_web"]]>$product_stock["UNITS"]) 
         $cart_product["UNITS"] = $product_stock["UNITS"]; 
        else{ 
         $cart_product["UNITS"] = $cart_product_list[$cart_product["id_web"]]; 
        } 
       } 
       $final_cart_array[] = $cart_product; 

      } 

      $refresh_cart_array = array(); 


      foreach($final_cart_array as $cart_product){ 

       for($i=1;$i<=$cart_product["UNITS"];$i++){ 
        $refresh_cart_array[] = $cart_product["id_web"]; 
       } 

      } 


      $this->load->view("special_cart",array(
               'refresh_cart_array'  => $refresh_cart_array, 
               'final_cart_array' => $final_cart_array 
               )); 





       } else { 
       $this->load->view("special_cart",array(
                'refresh_cart_array'  => NULL, 
                'final_cart_array' => NULL 
                )); 

        } 
      } 
} 

这是文档 https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/ ,在这里也说明了报价:

Notes:

To use HMVC functionality, such as Modules::run(), controllers must extend the MX_Controller class. To use Modular Separation only, without HMVC, controllers will extend the CodeIgniter Controller class. You must use PHP5 style constructors in your controllers. ie:

<?php 
class Xyz extends MX_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
    } 
}