用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8936|回复: 9
收起左侧

[HMVC] ci实现HMVC方法

[复制链接]
发表于 2013-8-8 02:51:33 | 显示全部楼层 |阅读模式
本帖最后由 lxx254069025 于 2013-8-8 02:57 编辑

使用过YII的人都知道。YII使用的是HMVC,其中的WIDGET是非常方便的。那么CI怎么实现这个widget呢?
其实很简单。(尼玛,从小语言就差,文字代表能力太水,直接贴代码)

1:在system/core/Loader.php尾部添加如下代码:

PHP复制代码
  public function widget($name = null)
    {
        include BASEPATH.'core/Widget.php';//
        if($name == null)
            throw new Exception ('参数不能为空');
        else
        {
            include APPPATH.'/widget/'.$name.'.php';
 
            $widget = new $name();
            $widget->render();
 
        }
 
    }
复制代码


2:在system/core/Widget.php新建这个文件,添加如下代码:
<?php

PHP复制代码
class Widget extends IndexController                               //这个继承类嘛,你可以继承其他的,反正也是继承CI_Controller的
{
 
    protected function wview($view = null,array $data = null)
    {
        if($view != null)
        {
            $view = strtolower($view);
            $viewfile = APPPATH.'/widget/view/'.$view.'.php';
            if(!is_file($viewfile))
                throw new Exception("这个文件不存在!");
 
            if($data && is_array($data))
            {
 
                ob_start();
                extract($data);
                include($viewfile);
                ob_end_flush();
            }else{
                include($viewfile);
            }
        }
 
 
    }
}
 
 
复制代码


3:最后就是编写widget了,在application目录新建widget文件夹,再创建子目录view。接下来就可以开始写widget了。
我写了一个Header.php代码如下。
PHP复制代码
<?php
 
class Header extends Widget
{
 
    public function render()
    {
 
        $this->wview('header',array('sb'=>'ssdf'));//视图为header。在view目录下,后者为值,数组类型,
    }
 
 
}
?>
复制代码


在子目录中的header.php的输出值就比较容易了,和CI一样的。

PHP复制代码
<?php echo $sb?>
复制代码


如果向widget里传值就得各位自己写了,重点在于__set()这个魔术方法。





评分

参与人数 1威望 +3 收起 理由
yuvista + 3 赞一个!

查看全部评分

 楼主| 发表于 2013-8-8 02:54:32 | 显示全部楼层
本帖最后由 lxx254069025 于 2013-8-8 02:58 编辑

补充一下,在其他视图中引用是这样的。
PHP复制代码
<?php $this->widget('Header')?>
复制代码


如有什么不严谨的地方,还请各位自己修改。
发表于 2013-8-8 09:15:02 | 显示全部楼层
本帖最后由 yuvista 于 2013-8-8 10:29 编辑

帅啊,不过load.php 最好通过扩展的方式实现,尽量不要改动system文件
发表于 2013-8-8 13:10:50 | 显示全部楼层
抱歉!你这个算不上HMVC,严格意思上说是个视图扩展
发表于 2013-8-14 15:12:08 | 显示全部楼层
可是这个跟load->view没有区别啊- -
 楼主| 发表于 2013-10-15 10:58:08 | 显示全部楼层
IvanCI 发表于 2013-8-14 15:12
可是这个跟load->view没有区别啊- -

区别就是load->view不能实现某一块业务逻辑。
发表于 2013-10-16 17:35:36 | 显示全部楼层
如果把通用的业务写在控制器里,视图通过AJax去调用,和这个HMVC是否类似。
比如做一个控制器的方法实现Header中的render方法并返回,一样可以方便复用。那HMVC究竟有什么优点呢?
发表于 2013-10-21 09:43:33 | 显示全部楼层
lxx254069025 发表于 2013-10-15 10:58
区别就是load->view不能实现某一块业务逻辑。

业务逻辑也要写到controller或者model中

嗯 然后view文件中是可以进行数据的判断的.

也可以处理数据, 其实view文件就是一个php文件~ 完全可以写php语句处理逻辑
发表于 2014-11-13 02:17:22 | 显示全部楼层
不错不错好东东
发表于 2014-12-27 14:58:48 | 显示全部楼层
本帖最后由 eplanet 于 2014-12-27 15:01 编辑

$data['top'] = $this->load->view('platform/top', $data, TRUE);
$data['menu'] = $this->load->view('platform/menu', $data, TRUE);
$data['page'] = $this->load->view('platform/main', $data, TRUE);

$this->load->view('platform/template', $data);

我一般都是这么来拼装页面的,没看出你的和这个的差异有多大啊。前台也几乎完全一样。
而且公共业务逻辑,也可以通过继承,在基类里实现,子类只要调用即可。

本版积分规则