【问题标题】:Why I can't load models in modules?! [Using HMVC in codeigniter 2.1.2]为什么我不能在模块中加载模型?! [在 codeigniter 2.1.2 中使用 HMVC]
【发布时间】:2012-09-26 17:58:27
【问题描述】:

我希望在我跳下窗户之前有人能帮我解决这个问题。我花了几个小时在这个上,不知道我做错了什么。

基本上,我在 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
--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
                                                    ));

                    }
            }   

}

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

【问题讨论】:

    标签: php codeigniter codeigniter-2


    【解决方案1】:

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

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

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

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

    $this->load->database();
    

    【讨论】:

    • 这是我的配置文件中的内容:$autoload['libraries'] = array('session','database','form_validation','email','redux_auth');。我还尝试在单个模型中加载您提到的数据库,但效果不佳:/ HMVC 内核中是否存在一些错误?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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】:

        尝试使用扩展 MX_Controller 类(而不是 CI_Contoller 就像你正在做 atm)

        根据您在上面的评论中所写的内容,我认为您尝试在模块中创建新的 DB 实例(基于 chrises 评论)。 在 Special_cart 的构造函数上执行此操作

        所以更新当前的构造就像

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

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

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

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

        【讨论】:

        • 但是在插入自动加载配置时,数据库驱动程序是否也应该被加载?这样,即使在模型的构造函数中,数据库驱动程序也应该准备就绪,不是吗?
        • 应该,是的。但基于问题,情况并非如此。由于某种原因,CI 在从 MX 加载时丢失了 db 类的实例。不知道为什么,但是从以前的经验来看,代码本身会丢失指向之前创建的另一个对象的指针。这就是为什么我写信尝试重新加载数据库,看看是否有帮助。但第一个解决方案是更改 Special_cart 的父类。 $this->load->database('default') 只是确认数据库实例已创建且可用。
        【解决方案5】:

        我遇到了同样的问题和错误。我错过了将控制器扩展到 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();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-07-27
          • 1970-01-01
          • 2014-03-25
          • 1970-01-01
          • 2018-03-01
          • 1970-01-01
          • 2014-02-18
          • 1970-01-01
          • 2017-04-15
          相关资源
          最近更新 更多