lxx254069025 发表于 2013-8-8 02:51:33

ci实现HMVC方法

本帖最后由 lxx254069025 于 2013-8-8 02:57 编辑

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

1:在system/core/Loader.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

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

class Header extends Widget
{

    public function render()
    {

      $this->wview('header',array('sb'=>'ssdf'));//视图为header。在view目录下,后者为值,数组类型,
    }


}
?>

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

<?php echo $sb?>

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





lxx254069025 发表于 2013-8-8 02:54:32

本帖最后由 lxx254069025 于 2013-8-8 02:58 编辑

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

如有什么不严谨的地方,还请各位自己修改。

yuvista 发表于 2013-8-8 09:15:02

本帖最后由 yuvista 于 2013-8-8 10:29 编辑

帅啊,不过load.php 最好通过扩展的方式实现,尽量不要改动system文件

kuailewang 发表于 2013-8-8 13:10:50

抱歉!你这个算不上HMVC,严格意思上说是个视图扩展

IvanCI 发表于 2013-8-14 15:12:08

可是这个跟load->view没有区别啊- -

lxx254069025 发表于 2013-10-15 10:58:08

IvanCI 发表于 2013-8-14 15:12 static/image/common/back.gif
可是这个跟load->view没有区别啊- -

区别就是load->view不能实现某一块业务逻辑。

Bobby 发表于 2013-10-16 17:35:36

如果把通用的业务写在控制器里,视图通过AJax去调用,和这个HMVC是否类似。
比如做一个控制器的方法实现Header中的render方法并返回,一样可以方便复用。那HMVC究竟有什么优点呢?

IvanCI 发表于 2013-10-21 09:43:33

lxx254069025 发表于 2013-10-15 10:58 static/image/common/back.gif
区别就是load->view不能实现某一块业务逻辑。

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

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

也可以处理数据, 其实view文件就是一个php文件~ 完全可以写php语句处理逻辑

cloudlylyly 发表于 2014-11-13 02:17:22

不错不错好东东

eplanet 发表于 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);

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