为什么我不能在模块中加载模型?! [在codeigniter 2.1.2中使用HMVC]

时间:2012-09-26 17:58:28

标签: php codeigniter codeigniter-2

我希望有人能在我离开窗户之前帮助我。我在这个上花了几个小时,不知道我做错了什么。

基本上,我已经在CodeIgniter 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

我已根据说明逐步安装了它。我在modules文件夹旁边有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
                                                    ));

                    }
            }   

}

我已经尝试了在互联网上找到的所有可能的解决方案 - 它们都不起作用.... 我希望你理解我的问题,但如果你需要进一步解释,请问我。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:0)

看起来您尝试加载的模型想要连接到数据库,但数据库驱动程序不可用。如果在应用程序中使用数据库查询,为什么不自动加载数据库驱动程序?

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

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

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

$this->load->database();

答案 1 :(得分:0)

尝试使用扩展MX_Controller类(不像你正在做的那样使用CI_Contoller)

根据您在上面评论中所写的内容,我认为您尝试在模块中创建新的DB实例(基于chrises注释)。 在Special_cart

的构造函数上执行此操作

因此将当前构造更新为

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

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

现在确定您的模型中应该有db驱动程序。

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

答案 2 :(得分:0)

尝试加载模型,说明模块名称,如下所示     

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

答案 3 :(得分: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 ,,,

答案 4 :(得分: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/ ,这里引用:

  

注意:

     

要使用HMVC功能,例如Modules :: run(),控制器必须   扩展MX_Controller类。仅使用模块化分离,   如果没有HMVC,控制器将扩展CodeIgniter控制器   类。您必须在控制器中使用PHP5样式构造函数。即:

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