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:动作,是控制器中 ...
随机推荐
- python schedule 任务调度
python schedule可以简单处理一些日常提醒的工作,下面简要说一下用法: import schedule import time def job(): print("I'm wor ...
- 天诛进阶之D算法 #3700
http://mp.weixin.qq.com/s/ngn98BxAOLxXPlLU8sWH_g 天诛进阶之D算法 #3700 2015-11-24 yevon_ou 水库论坛 天诛进阶之D算法 #3 ...
- ORACLE 角色授权
直接例子: 1.CREATE USER 用户名 identified by 密码 default tablespace 表空间名;GRANT CONNECT TO 用户名; GRANT RESOURC ...
- Oracle案例04——TNS-12547: TNS:lost contact
Oracle数据库服务器DG从库重启后,无法完成数据同步,具体报错信息如下: 一.报错信息 alter log报错 ****************************************** ...
- eclipse 实用快捷键(最全)
注释: (1)Ctrl+Space 说明:内容助理.提供对方法,变量,参数,javadoc等得提示, 应运在多种场合,总之需要提示的时候可先按此快捷键. 注:避免输入法的切换设置与此设置冲突 ( ...
- jmeter测试mysql性能
1.下载jdbc.将jdbc解压,将mysql-connector-java-version-ga-bin.jar这个文件copy到jmeter/lib下 2.打开jmeter,设置jdbc请求. 1 ...
- C#图解教程读书笔记(第2章 C#编程概述)
这章主要是一个对于C#程序的概括解释 和C/C++不同,不是用include声明引用的头文件,而是通过using的方式,声明引用的命名空间. 命名和C/C++类似,并且也是区分大小写的,这件事情在VB ...
- CSS 优先级和特指度
1.ID 选择符 > 类选择符 > 元素选择符.特指度高的优先级高 2.行内样式 > 内嵌样式 > 链接样式 3.设定的样式 > 继承的样式 特指度的计算: 特指度能够用 ...
- sqlserver数据库 表中字段值有空格,如何去除空格(例如char (5) 存入数据不足5位时sqlserver会自动补空格)
普通的空格 前后的空格,使用LTrim和RTrim即可,例如:LTrim(RTrim(Name)) 中间的空格,使用replace函数替换,例如:Replace(Name,' ','') 如果是普通的 ...
- BZOJ1037:[ZJOI2008]生日聚会Party(DP)
Description 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party.hidadz带着朋友们来到花园中,打算坐成一排玩游戏. 为了游戏不至于无聊,就座的方案应满足如下条件: ...