您的位置:首页 > 运维架构

iWebShop 二次开发之商城后台模板渲染流程

2016-09-20 10:19 330 查看



iwebshop视图分两块,一块是公共模块叫layouts(布局),一块叫viewContent(视图内容)。
layouts是全局的,即是一个网站的基础排版,比如一个经典的三栏布局,上(网站logo、主菜单)、左(左边菜单)、右(右边内容)。
如下图所示:



在上面布局的右边即是viewContent(视图内容),这部分内容是由用户定义的,即我们所写的视图会自动插入到右边。
那么我们看看admin.html布局文件结构,打开文件:views/sysdefult/layouts/admin.html
如下图所示:



我们先看看iwebshop处理layouts(布局)的入口点在哪?
这先要看我写的第一篇文章了《iwebshop之MVC框架剖析http://blog.csdn.net/error4o4/article/details/52460429
这篇文章讲述了iwebshopmvc框架,其实就是搞清楚基本的入口点。

我们现在看这个文件lib/core/webapplication_class.php
找到execRequest方法,代码如下:

/**
* @brief 请求执行方法,是application执行的入口方法
*/
public function execRequest()
{
IUrl::beginUrl();
$ctrlId = IUrl::getInfo("controller");
$actionId = IUrl::getInfo('action');
IInterceptor::run("onBeforeCreateController",$ctrlId);
//重点看这句,这一句主要是创建一个控制器对象,接着我们看下一段创建控制器的代码
$this->controller = $this->createController($ctrlId);
IInterceptor::run("onCreateController",$this->controller);
//以及这句代码
$this->controller->run($actionId);
IInterceptor::run("onFinishController",$this->controller);
}
重点看这句,这一句主要是创建一个控制器对象
$this->controller = $this->createController($ctrlId);
以及这句代码
$this->controller->run($actionId);
接着我们看创建控制器(createController)的代码实现:

/**
* @brief 创建当前的Controller对象
* @param string $ctrlId 控制器ID
* @return object Controller对象
*/
public function createController($ctrlId)
{
$ctrlId = $ctrlId ? $ctrlId : $this->defaultController;
$ctrlObject = null;
$ctrlFile = $this->basePath."controllers/".$ctrlId.".php";

if(is_file($ctrlFile) && class_exists($ctrlId) && get_parent_class($ctrlId) == "IController")
{
$ctrlObject = new $ctrlId($this,$ctrlId);
}
//主要看这一句的new IController,这里通过IController这个类创建一个控制器
return $ctrlObject ? $ctrlObject : new IController($this,$ctrlId);
}主要看上面代码的这一句:
return $ctrlObject ? $ctrlObject : new IController($this,$ctrlId);
这里通过IController这个类创建一个控制器。

接着我们看IController这个类的实现,打开文件:lib/web/controller/controller_class.php
接着找到IControllerrun方法中的这句代码$actionObj = $this->createAction($actionId);
然后我们在IController类中找到上面$this->createAction方法的实现,在createAction方法中找到这句代码:
$this->action = new IViewAction($this,$actionId);
现在我们看IViewAction类的实现,打开文件:lib/web/action/view_action.php
找到IViewAction类中的run方法中的这句代码$controller->render($this->view);
乍一看,我们现在又要回到控制器类了,打开文件:lib/web/controller/controller_class.php
找到render方法中的这句代码$output = $this->renderView($view,$data,$return);
renderView方法的实现可以在控制器基类中找到,打开文件:lib/web/controller/controller_class.php
然后再在renderView方法中找到这句代码:
$layoutFile = $this->getLayoutFile().$this->extend;
哈哈...我们终于找到了生成布局文件的入口点了。
然后getLayoutFile的实现又在controllerbase的子类中实现
打开文件:lib/web/controller/controller_class.php就可找到getLayoutFile的实现,代码如下:
/**
* @brief 获取layout文件路径(无扩展名)
* @return string layout路径
*/
public function getLayoutFile()
{
//$this->layout这句是一定要注意的,布局的文件名是用户自己写控制器的时候继承IController时赋值的,
//换而言之就是用户去定义布局文件名是什么。
if(!$this->layout)
return false;

return $this->getViewPath().$this->defaultLayoutPath.DIRECTORY_SEPARATOR.$this->layout;
}
下面是renderView的完整实现:
/**
* @brief 渲染处理 交流QQ:82530662
* @param string $viewFile 要渲染的页面
* @param string or array $rdata 要渲染的数据
* @param boolean $return 是否返回路径名称
*/
public function renderView($viewFile,$rdata=null,$return=false)
{
//要渲染的视图
$renderFile = $viewFile.$this->extend;

//检查视图文件是否存在
if(is_file($renderFile))
{
//控制器的视图(需要进行编译并且生成可以执行的php文件)
if(stripos($renderFile,IWEB_PATH.'web/view/')===false)
{
//生成文件路径
$runtimeFile = str_replace($this->app->getBasePath(),$this->app->getRuntimePath(),$viewFile.".php");

//layout文件
$layoutFile = $this->getLayoutFile().$this->extend;
$issetLayout= is_file($layoutFile);

if($this->isRanderCache == false || !is_file($runtimeFile) || (filemtime($renderFile) > filemtime($runtimeFile)) || ($issetLayout && (filemtime($layoutFile) > filemtime($runtimeFile))))
{
//获取view内容
$viewContent = file_get_contents($renderFile);

//处理layout
if($issetLayout && stripos($viewContent,"<html") === false)
{

$viewContent = $this->renderLayout($layoutFile,$viewContent);
}

//标签编译
$inputContent = $this->tagResolve($viewContent);

//创建文件
$fileObj = new IFile($runtimeFile,'w+');
$fileObj->write($inputContent);
$fileObj->save();
unset($fileObj);
}
}
else
{
$runtimeFile = $renderFile;
}

return $return ? $runtimeFile : $this->requireFile($runtimeFile,$rdata);
}
else
{
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: