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:58 编辑
补充一下,在其他视图中引用是这样的。
<?php $this->widget('Header')?>
如有什么不严谨的地方,还请各位自己修改。 本帖最后由 yuvista 于 2013-8-8 10:29 编辑
帅啊,不过load.php 最好通过扩展的方式实现,尽量不要改动system文件 抱歉!你这个算不上HMVC,严格意思上说是个视图扩展 可是这个跟load->view没有区别啊- - IvanCI 发表于 2013-8-14 15:12 static/image/common/back.gif
可是这个跟load->view没有区别啊- -
区别就是load->view不能实现某一块业务逻辑。 如果把通用的业务写在控制器里,视图通过AJax去调用,和这个HMVC是否类似。
比如做一个控制器的方法实现Header中的render方法并返回,一样可以方便复用。那HMVC究竟有什么优点呢? lxx254069025 发表于 2013-10-15 10:58 static/image/common/back.gif
区别就是load->view不能实现某一块业务逻辑。
业务逻辑也要写到controller或者model中
嗯 然后view文件中是可以进行数据的判断的.
也可以处理数据, 其实view文件就是一个php文件~ 完全可以写php语句处理逻辑
不错不错好东东 本帖最后由 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]