CI(CodeIgniter)框架 视图继承

这个代码不是我撸的 ... 当时在哪儿找的忘了 ... 如果有侵权什么的 ... 联系我删了 ...

需要去core里面创建一个MY_loader.php  然后直接用就可以了

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
* Loader Extend Class
*
* Loads views and files
*
*/
class MY_Loader extends CI_Loader
{ /**
* 视图堆栈
*
* @var array
*/
private $_stacks = array(); /**
* 当前处理的视图
*
* @var int
*/
private $_current; /**
* 视图的继承
*
* @param string $tplname
*
* @access protected
*/
protected function _extends($tplname)
{
$this->_stacks[$this->_current]['extends'] = $tplname;
} /**
* 开始定义一个区块
*
* @param string $block_name
* @param mixed $config
*
* @access protected
*/
protected function _block($block_name, $config = null)
{
$stack =& $this->_stacks[$this->_current];
if (!empty($stack['blocks_stacks']))
{
// 如果存在嵌套的 block,则需要记录下嵌套的关系
$last = $stack['blocks_stacks'][count($stack['blocks_stacks']) - 1];
$stack['nested_blocks'][] = array($block_name, $last);
}
$this->_stacks[$this->_current]['blocks_config'][$block_name] = $config;
array_push($stack['blocks_stacks'], $block_name);
ob_start();
} /**
* 结束一个区块
*
* @access protected
*/
protected function _endblock()
{
$block_name = array_pop($this->_stacks[$this->_current]['blocks_stacks']);
$this->_stacks[$this->_current]['blocks'][$block_name] = ob_get_clean();
echo "%block_{$block_name}_{$this->_stacks[$this->_current]['id']}%";
} /**
* 载入一个视图片段
*
* @param string $element_name 视图名称
* @param array $vars
*
* @access protected
*/
protected function _element($element_name, array $vars = null)
{
$file_exists = FALSE;
$filename = '';
foreach ($this->_ci_view_paths as $view_file => $cascade)
{
// $filename = $view_file.$element_name.EXT;
$filename = $view_file.$element_name;
if ( ! file_exists($filename))
{
$file_exists = FALSE;
}else{
$file_exists = TRUE;break;
}
}
if(!$file_exists){
show_error('Unable to load the requested file: '.$filename);
}else{
extract($this->_ci_cached_vars);
if (is_array($vars)) extract($vars);
include($filename);
}
} /**
* Loader
*
* 这个函数用来加载视图或者文件.
* 这个函数改写 CI_Loader 类内函数,使其支持视图继承和多重继承。
*
* @access private
* @param array
* @return void
*/
function _ci_load($_ci_data)
{
// 设置默认的数据变量
foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return', '_ci_viewid', '_ci_stack') as $_ci_val)
{
$$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
} // 设置请求文件的路径
if ($_ci_path != '')
{
$_ci_x = explode('/', $_ci_path);
$_ci_file = end($_ci_x);
}
else
{
$_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
$_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view; foreach ($this->_ci_view_paths as $view_file => $cascade)
{
if (file_exists($view_file.$_ci_file))
{
$_ci_path = $view_file.$_ci_file;
$file_exists = TRUE;
break;
} if ( ! $cascade)
{
break;
}
}
} if ( ! file_exists($_ci_path))
{
show_error('Unable to load the requested file: '.$_ci_file);
} // 这允许任何加载使用 $this->load (views, files, etc.)
// 成为从内部控制器和模型函数访问. $_ci_CI =& get_instance();
foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
{
if ( ! isset($this->$_ci_key))
{
$this->$_ci_key =& $_ci_CI->$_ci_key;
}
} /*
* 提取缓存和变量 也就是把数组下标变成变量
*
*/
if (is_array($_ci_vars))
{
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
}
extract($this->_ci_cached_vars); if ( ! $_ci_viewid) $_ci_viewid = mt_rand(); $stack = array(
'id' => $_ci_viewid,
'contents' => '',
'extends' => '',
'blocks_stacks' => array(),
'blocks' => array(),
'blocks_config' => array(),
'nested_blocks' => array(),
);
array_push($this->_stacks, $stack);
$this->_current = count($this->_stacks) - 1;
unset($stack); ob_start(); if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
{
echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
}
else
{
include($_ci_path); // include() vs include_once() allows for multiple views with the same name
} log_message('debug', 'File loaded: '.$_ci_path); $stack = $this->_stacks[$this->_current];
$stack['contents'] = ob_get_clean(); // 如果有继承视图,则用继承视图中定义的块内容替换当前视图的块内容
if (is_array($_ci_stack))
{
foreach ($_ci_stack['blocks'] as $block_name => $contents)
{
if (isset($stack['blocks_config'][$block_name]))
{
switch (strtolower($stack['blocks_config'][$block_name]))
{
case 'append':
$stack['blocks'][$block_name] .= $contents;
break;
case 'replace':
default:
$stack['blocks'][$block_name] = $contents;
}
}
else
{
$stack['blocks'][$block_name] = $contents;
}
}
}
// 如果有嵌套 block,则替换内容
while (list($child, $parent) = array_pop($stack['nested_blocks']))
{
$stack['blocks'][$parent] = str_replace("%block_{$child}_{$_ci_viewid}%",
$stack['blocks'][$child], $stack['blocks'][$parent]);
unset($stack['blocks'][$child]);
}
// 保存对当前视图堆栈的修改
$this->_stacks[$this->_current] = $stack; if ($stack['extends'])
{
//私有继承.
// $filename = "{$stack['extends']}".EXT;
$filename = "{$stack['extends']}"; return $this->_ci_load(array(
'_ci_view' => $filename,
//'_ci_vars' => $this->_ci_cached_vars,
'_ci_return' => $_ci_return,
'_ci_viewid'=>$_ci_viewid,
'_ci_stack'=>$this->_stacks[$this->_current],
));
}
else
{
// 最后一个视图一定是没有 extends 的
$last = array_pop($this->_stacks);
foreach ($last['blocks'] as $block_name => $contents)
{
$last['contents'] = str_replace("%block_{$block_name}_{$last['id']}%",
$contents, $last['contents']);
}
$this->_stacks = array(); if ($_ci_return === TRUE)
{
@ob_end_clean();
return $last['contents'];
} if (ob_get_level() > $this->_ci_ob_level + 1)
{
ob_end_flush();
}
else
{
$_ci_CI->output->append_output($last['contents']);
@ob_end_clean();
} }
} }

修改了一点点 ... 其中有后缀EXT

但是没法加载 .. 说找不到文件  所以就去掉了

使用就很简单了 :

<?php  $this->_extends('xxx'); ?>

<?php $this->_block('xxx');?>

<?php $this->_endblock(); ?>

CI框架视图继承的更多相关文章

  1. 第一天ci框架开发商城2

    ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...

  2. CI框架笔记

    @update 2016-4-2 13:45:35 一.目录结构 ci_demo ├─myapp 应用主目录 │ ├─autoload.php 自定义的自动加载文件(可选) │ ├─myapp.php ...

  3. 各种demo——CI框架学习

    各种demo——CI框架学习   寒假学习一下CI框架,请各位多多指教! 一.CI的HelloWorld! 注意:CI禁止直接通过文件目录来访问控制器. ./application/controlle ...

  4. **【ci框架】精通CodeIgniter框架

    http://blog.csdn.net/yanhui_wei/article/details/25803945 一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架 ...

  5. CI框架大纲总结

    一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架的简介 |-----关于框架的概念 |-----使用CI框架的好处 |-----为什么选择CI框架 3.codei ...

  6. CI框架中自定义view文件夹位置

    要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...

  7. CI框架浅析(全篇)

        业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很轻便的框架,整个下载包 ...

  8. ci框架学习告一段落,总结一下

    从网上弄了一张框架学习思维导图,从图中就可以看出ci用了设计模式中的MVC架构,使得用起来很简单方便 用了大概两个星期开发了一个<文章管理系统>觉得开发过程中学到了很多,挺不错的,而且在学 ...

  9. CI框架简单使用

    CodeIgniter框架 1.回忆MVC 1.1.M:模型,提供数据,保存数据 1.2.V:视图,只负责显示,表单form 1.3.C:控制器,协调模型和视图 1.4.action:动作,是控制器中 ...

随机推荐

  1. HTML 段落p

    可以把 HTML 文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>This is a paragraph</p> <p&g ...

  2. MySQL存储过程和临时表

    MySQL创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...

  3. SQL-SERVER学习(二) 数据表的存储过程

    在C语言的程序设计中,会把一个重复使用的功能提取出来,做成一个的函数,这样就可以减少冗余代码,且更方便维护.调用.在面向对象的设计语言中,会把一个重复使用的功能提取出来,做成一个类,同样也是为了减少冗 ...

  4. 在Server2012R2上导入Server2008R2的HyperV虚拟机

    Importing Windows 2008 R2 Hyper-V VM Into Windows 8.1 For the purposes of this post, let’s try and i ...

  5. lua的面向对象实现

    百度搜索一下,给出出的解决方案和学习帖子很多,可是我还是有很多的问题! (1)什么是面向对象? (2)lua中怎么实现面向对象? (3)什么样的实现既简单又能完成我的功能? (4)一定要按照c++的方 ...

  6. 图解:TCP协议中的三次握手和四次挥手

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  7. HTTP(一)

    HTTP(一) http php http请求 HTTP请求:请求行.消息报头.请求正文.格式如下: Method Request-URI HTTP-Veraion CRLF 参数说明 Method ...

  8. jQuery ajax从后台取不到数据

    ajax post  data  获取不到数据,注意 content-type的设置 .post/get 关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的. 好吧今天我也遇到了 ...

  9. Java日志系统

    前言 各组件之间的关系: slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实 ...

  10. Jenkins报错Caused: java.io.IOException: Cannot run program "sh" (in directory "D:\Jenkins\Jenkins_home\workspace\jmeter_test"): CreateProcess error=2, 系统找不到指定的文件。

    想在本地执行我的python文件,我本地搭建了一个Jenkins,使用了execute shell来运行我的脚本,发现报错 [jmeter_test] $ sh -xe D:\tomcat\apach ...