用户
 找回密码
 入住 CI 中国社区
搜索
楼主: Hex
收起左侧

[核心代码 Core] [3.0.6]为 CI 增加 HMVC 支持【更新日期:2016.4.25】

    [复制链接]
发表于 2012-7-11 11:25:20 | 显示全部楼层
各位老大们,看了论坛里的文章,感觉你们都是高手,我是个低手,你们说的很多东西我都不懂,我又不聪明,我又想把ci学好,我怎么办呀?小弟求教了
发表于 2012-7-18 23:18:42 | 显示全部楼层
Hex 发表于 2008-12-3 10:28
大家多提意见,哪里写的不好,直接提出来,共同学习,共同进步!

谢谢!!!
发表于 2012-8-13 09:26:39 | 显示全部楼层
支持
发表于 2012-9-19 17:42:53 | 显示全部楼层
最近使用HEX的HMVC发现一个model的问题,在module里面load的model是放在 $CI->$module_class_name 下的,但model里的__get是从$CI里取变量,所以module里面load的model等变量在model里面是访问不了的。

CodeIgniter的CI_Model的__get方法:
PHP复制代码
 
function __get($key)
        {
                $CI =& get_instance();
                return $CI->$key;
        }
 
复制代码


修改后的CI_Model见附件。

修改Loader文件:
PHP复制代码
 
diff --git a/application/core/My_Loader.php b/application/core/My_Loader.php
 index 57570bf..23a124f 100755
 --- a/application/core/My_Loader.php
 +++ b/application/core/My_Loader.php
 @@ -372,6 +372,7 @@ class Zen_Loader extends CI_Loader {
                                 {
                                         $CI->$module_class_name->$name = new $model();
                                 }
 +                $CI->$module_class_name->$name->set_module_class($module_class_name);
                         }
                         else
                         {
 
 
复制代码




Model-201209191736.zip

905 Bytes, 下载次数: 5

放到application/core下

 楼主| 发表于 2012-9-20 10:00:02 | 显示全部楼层
yzou 发表于 2012-9-19 17:42
最近使用HEX的HMVC发现一个model的问题,在module里面load的model是放在 $CI->$module_class_name 下的,但 ...

首先,很感谢对HMVC扩展提出意见。

你说的在 module 里 load 的 model 不能在 model 里访问,是说的不能在 module 外面访问吗?
我确实是把 module 隔离起来了,每个 module 是几乎独立的,也就是普通控制器无法访问 module 里的模型等内容。
发表于 2012-9-23 00:07:32 | 显示全部楼层
Hex 发表于 2012-9-20 10:00
首先,很感谢对HMVC扩展提出意见。

你说的在 module 里 load 的 model 不能在 model 里访问,是说的不能 ...

我之前说得有点不清楚。我举个例子吧。

1. 在某个module的controller里:
PHP复制代码
.....
class ...... {
public $anything = 'anything';
public function sample()
{
    $this->load->model('model_a');
    $this->load->model('model_b');
 
    $this->any_var = 'any_var';
 
    $this->model_a->sample();
    $this->model_b->sample();
}
...
}
 
复制代码
2. 在model_a里:
PHP复制代码
...
public function sample()
{
    echo $this->anything;    // 错误,未定义
    echo $this->any_var;    // 错误,未定义
    $this->model_b->sample();
    // 出错,$this->model_b没有定义
}
...
复制代码
3. 在model_b里:
PHP复制代码
...
 public function sample()
 {
     echo $this->anything;    // 错误,未定义
     echo $this->any_var;    // 错误,未定义
     $this->model_a->sample();
     // 出错,$this->model_a没有定义
 }
 ...
 
复制代码
结论:
因为module的变量是放在$CI->$module_class_name下的而不是$CI下,所以需要修改CI_Model的__get()方法。
 楼主| 发表于 2012-9-24 10:32:29 | 显示全部楼层
yzou 发表于 2012-9-23 00:07
我之前说得有点不清楚。我举个例子吧。

1. 在某个module的controller里:2. 在model_a里:3. 在model_b ...

这次清楚了~我考虑解决下这个问题。
发表于 2012-9-24 12:33:54 | 显示全部楼层
Hex 发表于 2012-9-24 10:32
这次清楚了~我考虑解决下这个问题。

我的项目里正好遇到这个问题了,我按照我#182楼的方法修改了CI_Model的__get方法和Loader的model方法,考虑了几种方法就这个修改的少
发表于 2012-10-22 11:58:27 | 显示全部楼层
支持2.1.3了吗?
发表于 2012-10-22 16:57:21 | 显示全部楼层
yzou 发表于 2012-9-23 00:07
我之前说得有点不清楚。我举个例子吧。

1. 在某个module的controller里:2. 在model_a里:3. 在model_b ...

还不是很明白,在model中调用module??

本版积分规则