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:动作,是控制器中 ...
随机推荐
- svn环境搭建
(一)svn介绍 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对代码文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG ...
- 【Leetcode】【Medium】Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- Wpf 系列
http://www.cnblogs.com/chillsrc/category/684419.html
- QT的组合键
https://www.cnblogs.com/Jace-Lee/p/5859293.html
- xtrabackup在线迁移mysql并搭建为主主同步
一.背景 工作中有需求数据库需要迁移,但是不能停服,不能锁库锁表影响业务的正常运行,所以使用XtraBackup 二.环境: 操作系统:CentOS Linux release 7.4.1708 (C ...
- hiredis
hiredis是redis开源库对外发布的客户端API包. 当redis-server配置启动后,可以通过hiredis操作redis资源. 主要分为: strings.hash.lists.sets ...
- WiFi安全测试工具WiFiPhisher
官方下载地址:https://github.com/sophron/wifiphisher打不开的要翻GFW好事做到底wifiphisher-master.zip=================== ...
- PhoneGap API 之多媒体
一. MediaApi 简单介绍 PhoneGap API Media 对象提供录制和回放设备上的音频文件的能力 参数: var media = new Media(src, mediaSuccess ...
- MATLAB入门学习(六)
今天学三维作图 (*^__^*)…… 三维曲线作图 用到的命令:plot3 基本格式:plot3(x,y,z,s) 这里要画曲线,你需要知道该曲线的参数方程x=x(t),y=y(t),z=z(t) 然 ...
- hdu-2685 I won't tell you this is about number theory---gcd和快速幂的性质
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2685 题目大意: 求gcd(am-1,an-1)%k 解题思路: 对于am-1 = (a - 1) ...