1

「application/models」ディレクトリ以外の別のディレクトリからモデルをロードする方法を見つけようとしています。「アプリケーション/モジュール」からモデルをロードしたい。

で提供されている手順に従って CI_Loader を拡張することにより、手順を試しました

http://ellislab.com/forums/viewthread/103276/#

しかし、「指定されたクラスが見つかりません:Model.php」というエラーが表示されますが、コアの「Model.php」は「system/core」フォルダーの下にあります。

でも、私もモデルをロードしようとしました

 $this->load->model (APPPATH.'modules/mymodel.php');

しかし、成功しません。

アップデート:

モデルローダーを次のように動作させたい:

$this->load->module('mymodel') 

$this->mymodel->mymodelmethod() !!

NOT like:    $this->load->models('mymodel') 

"application/modules"フォルダの外からモデルをロードする方法はありますか? アドバイスしてください。ありがとう

4

4 に答える 4

2

問題は、参照するコードが古いバージョンの codeigniter 用であることです。古いバージョンの codeigniter では、CI_Modelクラスの名前はModel. クラスModelがphpの最新バージョンに存在しないため、エラーが発生しています:

Unable to locate the specified class: Model.php

これが発生しているコードの部分は、最後 (114 行目) に向かっています。

    if ( ! class_exists('Model'))
    {
        load_class('Model', FALSE);
    }

system/core/Loader.php を確認すると、使用しているバージョンの codeigniter が次のように置き換えられていることがわかります。

    if ( ! class_exists('CI_Model'))
    {
        load_class('Model', 'core');
    }

MY_Loader.php を書き直して、使用している codeigniter のバージョン (おそらく 2.1) と互換性を持たせる必要があります。

これを行う最善の方法は、コア Loader.php の Codeigniter 2.1 バージョンmodel()を取得し、MY_Loader.php を書き直すためのベースとしてそのメソッドを使用することです。

書き直すときに心に留めMY_Loader.phpておくべきことは、以降のバージョンの codeigniter ではコンストラクターも変更されているため、MY_Loader クラスは次のようになります。

class MY_Loader extends CI_Loader {

    function __construct()
    {
        parent::__construct();
    }

    public function model($model, $name = '', $db_conn = FALSE)
    {
        ...
    }
}

コア クラスの拡張の詳細については、Codeigniter のドキュメントを参照してください。


アップデート

機能が変更されたことに気付いたので、回答を更新しました。まったく新しいローダーを作成し、それをコア CI_Model クラスに基づいて作成することもできますが、モデル ローダーを拡張するだけで完了するとなると、かなりの労力がかかるように思えます。

class MY_Loader extends CI_Loader {

    protected $_ci_module_paths     = array();
    protected $_ci_modules          = array();

    function __construct()
    {
        parent::__construct();

        $this->_ci_module_paths = array(APPPATH);
    }

    public function initialize()
    {
        $this->_ci_classes = array();
        $this->_ci_loaded_files = array();
        $this->_ci_models = array();
        $this->_ci_modules = array();
        $this->_base_classes =& is_loaded();

        $this->_ci_autoloader();

        return $this;
    }

    public function module($module, $name = '', $db_conn = FALSE)
    {
            if (is_array($module))
            {
                    foreach ($module as $babe)
                    {
                            $this->$module($babe);
                    }
                    return;
            }

            if ($module == '')
            {
                    return;
            }

            $path = '';

            // Is the $module in a sub-folder? If so, parse out the filename and path.
            if (($last_slash = strrpos($module, '/')) !== FALSE)
            {
                    // The path is in front of the last slash
                    $path = substr($module, 0, $last_slash + 1);

                    // And the module name behind it
                    $module = substr($module, $last_slash + 1);
            }

            if ($name == '')
            {
                    $name = $module;
            }

            if (in_array($name, $this->_ci_modules, TRUE))
            {
                    return;
            }

            $CI =& get_instance();
            if (isset($CI->$name))
            {
                    show_error('The module name you are loading is the name of a resource that is already being used: '.$name);
            }

            $module = strtolower($module);

            foreach ($this->_ci_module_paths as $mod_path)
            {
                    if ( ! file_exists($mod_path.'modules/'.$path.$module.'.php'))
                    {
                            continue;
                    }

                    if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
                    {
                            if ($db_conn === TRUE)
                            {
                                    $db_conn = '';
                            }

                            $CI->load->database($db_conn, FALSE, TRUE);
                    }

                    if ( ! class_exists('CI_Model'))
                    {
                            load_class('Model', 'core');
                    }

                    require_once($mod_path.'modules/'.$path.$module.'.php');

                    $module = ucfirst($module);

                    $CI->$name = new $module();

                    $this->_ci_modules[] = $name;
                    return;
            }

            // couldn't find the model
            show_error('Unable to locate the module you have specified: '.$module);
    }


    public function add_package_path($path, $view_cascade=TRUE)
    {
        $path = rtrim($path, '/').'/';

        array_unshift($this->_ci_library_paths, $path);
        array_unshift($this->_ci_model_paths, $path);
        array_unshift($this->_ci_module_paths, $path);
        array_unshift($this->_ci_helper_paths, $path);

        $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;

        // Add config file path
        $config =& $this->_ci_get_component('config');
        array_unshift($config->_config_paths, $path);
    }

    public function remove_package_path($path = '', $remove_config_path = TRUE)
    {
        $config =& $this->_ci_get_component('config');

        if ($path == '')
        {
            $void = array_shift($this->_ci_library_paths);
            $void = array_shift($this->_ci_model_paths);
            $void = array_shift($this->_ci_module_paths);
            $void = array_shift($this->_ci_helper_paths);
            $void = array_shift($this->_ci_view_paths);
            $void = array_shift($config->_config_paths);
        }
        else
        {
            $path = rtrim($path, '/').'/';
            foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_module_paths', '_ci_helper_paths') as $var)
            {
                if (($key = array_search($path, $this->{$var})) !== FALSE)
                {
                    unset($this->{$var}[$key]);
                }
            }

            if (isset($this->_ci_view_paths[$path.'views/']))
            {
                unset($this->_ci_view_paths[$path.'views/']);
            }

            if (($key = array_search($path, $config->_config_paths)) !== FALSE)
            {
                unset($config->_config_paths[$key]);
            }
        }

        // make sure the application default paths are still in the array
        $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH)));
        $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH)));
        $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH)));
        $this->_ci_module_paths = array_unique(array_merge($this->_ci_module_paths, array(APPPATH)));
        $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE));
        $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH)));
    }

    private function _ci_autoloader()
    {
        if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'))
        {
            include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php');
        }
        else
        {
            include(APPPATH.'config/autoload.php');
        }

        if ( ! isset($autoload))
        {
            return FALSE;
        }

        // Autoload packages
        if (isset($autoload['packages']))
        {
            foreach ($autoload['packages'] as $package_path)
            {
                $this->add_package_path($package_path);
            }
        }

        // Load any custom config file
        if (count($autoload['config']) > 0)
        {
            $CI =& get_instance();
            foreach ($autoload['config'] as $key => $val)
            {
                $CI->config->load($val);
            }
        }

        // Autoload helpers and languages
        foreach (array('helper', 'language') as $type)
        {
            if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
            {
                $this->$type($autoload[$type]);
            }
        }

        // A little tweak to remain backward compatible
        // The $autoload['core'] item was deprecated
        if ( ! isset($autoload['libraries']) AND isset($autoload['core']))
        {
            $autoload['libraries'] = $autoload['core'];
        }

        // Load libraries
        if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
        {
            // Load the database driver.
            if (in_array('database', $autoload['libraries']))
            {
                $this->database();
                $autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
            }

            // Load all other libraries
            foreach ($autoload['libraries'] as $item)
            {
                $this->library($item);
            }
        }

        // Autoload models
        if (isset($autoload['model']))
        {
            $this->model($autoload['model']);
        }

        // Autoload modules
        if (isset($autoload['module']))
        {
            $this->module($autoload['module']);
        }
    }

}

上記は、次の方法でコントローラーで使用できます。

$this->load->module('test_module');
$this->test_module->method();
于 2013-10-31T15:53:33.890 に答える
1

If i am getting your problem correctly , you have to initialize the instance of CI.

Example :-

In your external file do this :-

    class modules
    {
        var $CI;

        function __construct()
        {
            $this->CI =& get_instance();
        }

        function retrieve_data()
        {
          // Load Model
          $this->CI->load->model('YOUR MODEL NAME'); // Give the name of your model that you want to laod
        }
     }

Hope it helps you :)

于 2013-10-31T15:51:01.357 に答える
0

何もうまくいかない場合は、これを試してください

public function setPackagePaths($path, $view_cascade=TRUE, $model_cascade=TRUE, $library_cascade=TRUE, $helper_cascade=TRUE) { 
        $path = rtrim($path, '/').'/';

        ///$this->_ci_view_paths = $this->_ci_library_paths = $this->_ci_model_paths = array();
        $this->_ci_library_paths = array($path.'libraries/' => $library_cascade) + $this->_ci_library_paths ;
        $this->_ci_helper_paths = array($path.'helpers/' => $helper_cascade) + $this->_ci_helper_paths ;
        $this->_ci_model_paths = array($path.'models/' => $model_cascade) + $this->_ci_model_paths ;
        $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;



        // Add config file path
        $config =& $this->_ci_get_component('config');
        array_unshift($config->_config_paths, $path);
    }

この関数を Loader クラスに更新するのは難しい方法です。しかし、うまく動作します。

于 2016-09-16T18:08:52.657 に答える