测试Opencart的MVCL运行过程

Opencart是一个轻量级、强大的,严格遵守MVC设计模式的开源PHP商城系统,支持多语言,所以有MVCL的说法,L是Language的层(多语言的翻译文件)。

新的项目基于TP开发一个商城系统,准备模仿OpenCart的一些模块,所以有了这篇文章。

以下以一个示例,介绍OpenCart的运行过程,适合入门的新手。主要是测试控制器、传递变量、模板显示的操作。

首页默认是加载common下的home控制器里面的index方法:
C:\wamp\www\x1.com\catalog\controller\common\home.php
common是公共模块

路由结构:http://x1.com/index.php?route=模块/控制器

第1步:在common下添加了test控制器
C:\wamp\www\x1.com\catalog\controller\common\test.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class ControllerCommonTest extends Controller {
	public function index() {
		// 设置data[]变量
		$data['name'] = 'jack';

		// 加载其他模块
		$data['test_left'] = $this->load->controller('common/test_left');
		$data['test_right'] = $this->load->controller('common/test_right');

		// 模板渲染
		$this->response->setOutput($this->load->view('common/test', $data));
	}
}

1.1 变量赋值:opencart的每个控制器都会定义一个$data的数组,所有的变量都存储在$data[‘变量名’]中。
1.2 控制默认加载的是index方法,一般index方法都会最后渲染模板,并把$data传递过去。
1.3 在index方法中,可以加载其他的子控制器。$this->load->controller(‘common/test_left’)。

第2步:新建2个控制器test_left和test_right。
C:\wamp\www\x1.com\catalog\controller\common\test_left.php

Select Code
1
2
3
4
5
6
7
8
9
10
<?php
class ControllerCommonTestLeft extends Controller {
	public function index() {
		// 设置data[]
		$data['nav'] = 'left nav';

		// 返回视图文件
		return $this->load->view('common/test_left', $data);
	}
}

C:\wamp\www\x1.com\catalog\controller\common\test_right.php

Select Code
1
2
3
4
5
6
7
8
9
10
<?php
class ControllerCommonTestRight extends Controller {
	public function index() {
		// 设置data[]
		$data['nav'] = 'right block';

		// 返回视图文件
		return $this->load->view('common/test_right', $data);
	}
}

这2个子控制器,也有自己的子模板文件,最终返回字符串。每个控制器就好像网站上的每一个小块,所以Opencart的输出页面,就是由一个个的小块组合拼接而成。

这里画了一个示意图,重点是理解这个模块的思维(就好像函数的结构化流程)。

opencart_01

第3步:建立3个模板文件,默认的访问的是test.tpl

$data[‘变量’]的值传入模板后,直接使用php的echo输出变量即可。见下

test.tpl: C:\wamp\www\x1.com\catalog\view\theme\default\template\common\test.tpl

Select Code
1
2
3
4
5
6
7
<table border="1" width="600" align="center">
	<tr>
		<td><?php echo $test_left; ?></td>		//子模块test_left传递的值
		<td width="50%"><?php echo $name; ?></td>      //test模块定义的变量
		<td><?php echo $test_right; ?></td>		//子模块test_right传递的值
	</tr>
</table>

test_left.tpl:C:\wamp\www\x1.com\catalog\view\theme\default\template\common\test_left.tpl

Select Code
1
2
3
4
<div id="left">
	<p>test left</p>
	<div><?php echo $nav ?></div>
</div>

test_right.tpl:C:\wamp\www\x1.com\catalog\view\theme\default\template\common\test_right.tpl

Select Code
1
2
3
4
<div id="right">
	<p>test right</p>
	<div><?php echo $nav ?></div>
</div>

第4步:访问前台
访问路径:http://x1.com/index.php?route=common/test

效果演示:

opencart_02

第5步:补充:整理的更多访问方法
这为了解部分(不为这篇文章的重点),结合其他控制器文件、模板文件,作为进一步的了解

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- 加载language常量设置 -->
$this->load->language('common/footer');

<!-- 赋值 -->
$data['text_information'] = $this->language->get('text_information');

<!-- 可能是:需要设置的js代码,为空-->
$data['scripts'] = $this->document->getScripts('footer');

<!-- 加载模块 -->
$this->load->model('catalog/information');

<!-- 访问model -->
foreach ($this->model_catalog_information->getInformations() as $result){
	...
}

<!-- 设置url -->
$data['contact'] = $this->url->link('information/contact');

<!-- 访问全局常量 -->
$ip = $this->request->server['REMOTE_ADDR'];

<!-- 设置变量 -->
$this->document->setTitle($this->config->get('config_meta_title'));

小结:通过测试MVC的运行过程,理解Opencart的结构,是这篇文章的重点!

附件:Opencart首页的控制器访问方法源码如下:

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class ControllerCommonHome extends Controller {
	public function index() {
		$this->document->setTitle($this->config->get('config_meta_title'));
		$this->document->setDescription($this->config->get('config_meta_description'));
		$this->document->setKeywords($this->config->get('config_meta_keyword'));

		if (isset($this->request->get['route'])) {
			$this->document->addLink(HTTP_SERVER, 'canonical');
		}

		$data['column_left'] = $this->load->controller('common/column_left');
		$data['column_right'] = $this->load->controller('common/column_right');
		$data['content_top'] = $this->load->controller('common/content_top');
		$data['content_bottom'] = $this->load->controller('common/content_bottom');
		$data['footer'] = $this->load->controller('common/footer');
		$data['header'] = $this->load->controller('common/header');

		$this->response->setOutput($this->load->view('common/home', $data));
	}
}