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


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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值