在Web开发中,将设计和逻辑分离是一种常见的做法,这有助于提高开发效率和维护性。CodeIgniter框架提供了一个模板解析器类,允许开发者在视图文件中使用伪变量,从而实现设计和逻辑的分离。这种分离的好处是显而易见的:设计师和开发者可以在同一项目中同时工作,而不会相互干扰。虽然CodeIgniter已经通过MVC模式提供了这种分离,但深入理解模板解析器的工作原理和优势仍然非常有用。
CodeIgniter的模板解析器类允许解析视图文件中包含的伪变量。它可以解析简单的变量或变量标签对。如果曾经听说过Smarty模板引擎,或者曾经使用过它,那么理解CodeIgniter的模板解析器将会非常容易。让通过一个简单的例子来说明这一点。
假设为一个名为“X”的社交网络工作,设计师不习惯使用包含PHP代码的文件。为了使这个过渡更容易,可以引入一种模板引擎。这样,设计师就不必担心破坏任何脚本的关键代码,并且可以通过CSS文件轻松地修改网站的设计。在示例中,假设有一个用于个人资料页面的视图。这个视图可以非常通用,让看看如何实现:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link type="text/css" href="http://staging.athletescentral.com/css/buttons.css" rel="stylesheet">
<title>{user_name} {separator} {profile_title}</title>
</head>
<body>
<div id="content">
<div class="header">
<a href="{home_url}">
<h1>{home_header_text}</h1>
</a>
</div>
<div class="line">
</div>
<div class="col_control_panel">
<div class="control_panel_header">
<a href="{profile_url}">{profile_name}</a>
</div>
<div class="default_pic">
<a href="{default_picture_view}">
<img src="{default_pic_src}">
</a>
</div>
<div class="homepanel">
<div class="control_panel_view">
<div class="control_panel_header">{user_control_panel}</div>
<ul>
<li><a class="cp_button" href="link1">link1 text</a></li>
<li><a class="cp_button" href="link2">link2 text</a></li>
<li><a class="cp_button" href="link3">link3 text</a></li>
<li><a class="cp_button" href="link4">link4 text</a></li>
</ul>
</div>
</div>
</div>
<h3>{wall_heading}</h3>
{wall_entries}
<h5>{user_name}</h5>
<div class="wall_entries_body">
{body}
</div>
{/wall_entries}
</div>
</body>
</html>
如所见,视图文件中没有实际的PHP代码,只有一些包含伪变量的模板。大括号内的内容被视为伪变量,模板解析器类将替换这些伪变量。
那么,伪变量是如何被替换的呢?可能想知道如何使用这个模板解析器类,以及它如何知道要替换什么。首先,必须初始化这个类,以便能够使用它。要初始化它,就像初始化任何其他库一样:
<?php
class Profile extends CI_Controller{
public function __construct(){
parent::__construct();
$this->load->library('parser');
}
}
?>
接下来,需要命名变量,并将它们发送给解析器进行解析。这和在控制器中准备数据的方式相同,接收来自模型的数据并将其发送到视图,只是在这个例子中,会使用以下方式将它们发送给解析器:
$this->parser->parse();
这个方法接受两个参数,分别是视图和数据变量。建议将这些变量放在一个数组中,这样看起来更清晰。
让看看示例中的Profile类,将数据发送到profile_view.php
文件。
<?php
class Profile extends CI_Controller{
public function __construct(){
parent::__construct();
$this->load->library('parser');
}
public function index($user_name){
$data = array();
$data['user_name'] = $user_name;
$data['separator'] = '|';
$data['profile_title'] = 'Profile view';
$data['home_url'] = 'www.yourdomain.com/';
$data['home_header_text'] = 'Home Page';
$this->load->model('user_model');
$user_info = $this->user_model->get_user_info($user_name);
$data['profile_name'] = $user_info['first_name'] . ' ' . $user_info['last_name'];
$data['default_picture_view'] = $user_info['default_picture_view'];
$data['default_pic_src'] = $user_info['default_pic_src'];
$data['user_control_panel'] = 'Top Control Panel Menu';
$data['wall_heading'] = 'Friends love =)';
$data['wall_entries'] = $this->user->get_wall_posts($user_name);
$this->parser->parse('profile_view', $data);
}
}
?>
注意第一个参数是视图文件名,第二个参数是要传递到视图的数据。这与以下代码的工作方式相同:
$this->load->view($view_file);
因此,可以预期输出将显示在浏览器中。同时注意,墙消息是如何被重复的。这是通过打开和关闭相同的伪变量来实现的。