CI框架视图继承
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框架视图继承的更多相关文章
- 第一天ci框架开发商城2
ci框架开发商城2 1/28/2016 9:45:52 PM mvc完整案例 mvc完成新闻的增删改查 news控制器news.php class News extends CI_controller ...
- CI框架笔记
@update 2016-4-2 13:45:35 一.目录结构 ci_demo ├─myapp 应用主目录 │ ├─autoload.php 自定义的自动加载文件(可选) │ ├─myapp.php ...
- 各种demo——CI框架学习
各种demo——CI框架学习 寒假学习一下CI框架,请各位多多指教! 一.CI的HelloWorld! 注意:CI禁止直接通过文件目录来访问控制器. ./application/controlle ...
- **【ci框架】精通CodeIgniter框架
http://blog.csdn.net/yanhui_wei/article/details/25803945 一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架 ...
- CI框架大纲总结
一.大纲 1.codeigniter框架的授课内容安排 2.codeigniter框架的简介 |-----关于框架的概念 |-----使用CI框架的好处 |-----为什么选择CI框架 3.codei ...
- CI框架中自定义view文件夹位置
要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...
- CI框架浅析(全篇)
业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很轻便的框架,整个下载包 ...
- ci框架学习告一段落,总结一下
从网上弄了一张框架学习思维导图,从图中就可以看出ci用了设计模式中的MVC架构,使得用起来很简单方便 用了大概两个星期开发了一个<文章管理系统>觉得开发过程中学到了很多,挺不错的,而且在学 ...
- CI框架简单使用
CodeIgniter框架 1.回忆MVC 1.1.M:模型,提供数据,保存数据 1.2.V:视图,只负责显示,表单form 1.3.C:控制器,协调模型和视图 1.4.action:动作,是控制器中 ...
随机推荐
- 关于pom版本提交不成功的问题
今天碰到个问题:我在原来的一个pom项目的client服务里面修改了一个java类,但是没有升级版本.然后再预发环境更新后,从显示的日志来看,仍然是我修改前的版本. 这就奇怪了,看了svn确实已经提交 ...
- webStrorm 简单配置
1.主题配色 主题设置 File -> Settings -> Appearance & Behavior -> Appearance ->Theme. ===& ...
- mobile webiste 中的css的font-size em及line-height等换算
在mobile web设计 中,我们常常需要使用em这个字体大小的单位.em到底是多少呢? em到底应该设置为多少个em呢?通常换算成方法是1em=target fontsize we want/fo ...
- Linux 服务器性能问题排查思路
一个基于 Linux 操作系统的服务器运行的同时,也会表征出各种各样参数信息.通常来说运维人员.系统管理员会对这些数据会极为敏感,但是这些参数对于开发者来说也十分重要,尤其当你的程序非正常工作的时候, ...
- temp表空间被过多占用处理方法
这个步骤比较简单,查询v$sort_usage就可以了: (select username,session_addr,sql_id,contents,segtype,blocks*8/1024/102 ...
- 原生js实现类名(class)的增、删
先判断是否有这个类名: function hasClass( elements,cName ){ return !!elements.className.match( new RegExp( &q ...
- (名词 形容词 动词 副词)重读&(冠词 介词 连词 代词 辅助词(Be))弱读
二,一些发音规则 除了上面的练习之外,这里还有几个注意点需要我们有足够的认识,那就是英语有重读.弱读.连读.爆破.语感(节奏和断句)等(其实当你跟读并背诵新概念之后,这一切都是神马,你不知觉地也会发现 ...
- Entity FrameWork Code First 配置关系
Has方法与With方法 A.HasRequired(a => a.B).WithOptional(b => b.A);上面一句配置意思就是A类包含B类一个不为null的实例,B类包含A类 ...
- Gluon.vision的几类数据集
http://mxnet.apache.org/api/python/gluon/data.html import mxnet as mx from mxnet import nd,autograd, ...
- 「uoj#188. 【UR #13】Sanrd」
题目 不是很能看懂题意,其实就是求\([l,r]\)区间内所有数的次大质因子的和 这可真是看起来有点鬼畜啊 这显然不是一个积性函数啊,不要考虑什么特殊的函数了 我们考虑Min_25筛的过程 设\(S( ...