我是靠谱客的博主 标致爆米花,这篇文章主要介绍yii,CI,yaf框架+smarty模板使用方法,现在分享给大家,希望可以做个参考。

本文实例讲述了yii,CI,yaf框架+smarty模板使用方法。分享给大家供大家参考,具体如下:

最近折腾了框架的性能测试,其中需要测试各个模板跟smarty配合的性能,所以折腾了一桶,现总结一下。之前已经写过kohana框架+smarty模板,这里不再重复了。

一、yii框架+smarty模板

yii是覆盖了viewRenderer组件。

1.1,下载yii框架并解压,下载smarty框架并解压,将smarty/libs文件夹拷到yii框架application/protected/vendors下面,并重命名smarty。

1.2,yii配置文件main.php

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
'components'=>array( 'viewRenderer' => array( 'class'=>'batman.protected.extensions.SmartyViewRender', // 这里为Smarty支持的属性 'config' => array ( 'left_delimiter' => "{#", 'right_delimiter' => "#}", 'template_dir' => APP_DIR . "/views/", 'config_dir' => APP_DIR . "/views/conf/", 'debugging' => false, 'compile_dir' => 'D:/temp/runtime', ) )

其中batman是我已经在index.php定义好的别名。

复制代码
1
2
3
Yii::setPathOfAlias('batman', dirname(__FILE__)); Yii::import("batman.protected.vendors.*"); define('APP_DIR', dirname(__FILE__).'/protected/');

1.3,在protected/extensions/下面新建SmartyViewRender.php

复制代码
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
26
27
28
29
30
<?php class SmartyViewRender extends CApplicationComponent implements IViewRenderer { public $fileExtension = '.html'; private $_smarty = null; public $config = array(); public function init() { $smartyPath = Yii::getPathOfAlias('batman.protected.vendors.smarty'); Yii::$classMap['Smarty'] = $smartyPath . '/Smarty.class.php'; Yii::$classMap['Smarty_Internal_Data'] = $smartyPath . '/sysplugins/smarty_internal_data.php'; $this->_smarty = new Smarty(); // configure smarty if (is_array ( $this->config )) { foreach ( $this->config as $key => $value ) { if ($key {0} != '_') { // not setting semi-private properties $this->_smarty->$key = $value; } } } Yii::registerAutoloader('smartyAutoload'); } public function renderFile($context, $file, $data, $return) { foreach ($data as $key => $value) $this->_smarty->assign($key, $value); $return = $this->_smarty->fetch($file); if ($return) return $return; else echo $return; } }

1.4,验证

新建一个HelloController.php

复制代码
1
2
3
4
5
6
<?php class HelloController extends Controller { public function actionWorld() { $this->render('world', array('content'=>'hello world')); } }

新建一个word.html

复制代码
1
2
3
<body> {#$content#} </body>

二、CI框架+smarty模板

网上很多方法,将smarty作为一个普通的library,在使用的时候,controller代码类似于下面:

复制代码
1
2
3
4
5
6
7
8
9
public function index() { $this->load->library('smarty/Ci_smarty', '', 'smarty'); $this->smarty->assign("title","恭喜你smarty安装成功!"); $this->smarty->assign("body","欢迎使用smarty模板引擎"); $arr = array(1=>'zhang',2=>'xing',3=>'wang'); $this->smarty->assign("myarray",$arr); $this->smarty->display('index_2.html'); }

这种方法跟CI自带的使用模板的方法

复制代码 代码如下:
复制代码
$this->load->view();

不和谐,而且要一系列的
复制代码 代码如下:
复制代码
$this->smarty->assign();

语句,麻烦不说,还破坏了原本CI的简洁美,所以果断唾弃之。

那怎么保持CI加载view时的简洁美呢,答案就是覆盖Loader类的view()方法。好吧,let's begin。

2.1,条件:

到官网上现在CI框架和smarty模板。

2.2,确保CI已经能跑起来

将CI框架解压到网站跟目录下,先写一个不带smarty模板的controller输出“hello world”。

2.3,引入smarty

将smarty解压,将libs文件夹考到application/third_paty下面,并将libs重命名smarty,重命名取什么都ok了,这里就叫smarty吧。

2.4,覆盖loader类的view()方法

因为view()方法在Loader类里,所以我要覆盖Loader的view()方法。

先看看$this->load->view()是怎么工作的?CI_Controller类的构造函数里有这么一行

复制代码 代码如下:
复制代码
$this->load =& load_class('Loader', 'core');

load_class函数会先在application/core下面找config_item('subclass_prefix').Loader.php文件,找不到再到system/core下面找Loader.php。config_item('subclass_prefix')就是在配置文件里写的你要继承CI核心类的子类的前缀。我使用的是默认值'MY_'。找到文件后,require该文件,然后new MY_Loader(如果application/core/MY_Loader.php存在),或者是new Loader,赋值给$this->load。

在application/core下面新建一个MY_Loader.php文件

复制代码
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php define('DS', DIRECTORY_SEPARATOR); class MY_Loader extends CI_Loader { public $smarty; public function __construct() { parent::__construct(); require APPPATH.'third_party'.DS.'smarty'.DS.'smarty.class.php'; $this->smarty = new Smarty (); // smarty 配置 $this->smarty->template_dir= APPPATH.'views'.DS;//smarty模板文件指向ci的views文件夹 $this->smarty->compile_dir = 'd:/temp/tpl_c/'; $this->smarty->config_dir = APPPATH.'libraries/smarty/configs/'; $this->smarty->cache_dir = 'd:/temp/cache'; $this->smarty->left_delimiter = '{#'; $this->smarty->right_delimiter = '#}'; } public function view($view, $vars = array(), $return = FALSE) { // check if view file exists $view .= config_item('templates_ext'); $file = APPPATH.'views'.DS.$view; if (! file_exists ( $file ) || realpath ( $file ) === false) { exit( __FILE__.' '.__LINE__."<br/>View file {$file} does not exist, <br/>{$file} => {$view}"); } // changed by simeng in order to use smarty debug foreach ( $vars as $key => $value ) { $this->smarty->assign ( $key, $value ); } // render or return if ($return) { ob_start (); } $this->smarty->display ( $view ); if ($return) { $res = ob_get_contents (); ob_end_clean (); return $res; } } }

我把template_ext配置成了".html",这样就ok了。我们来验证一下吧。

2.5,验证

在controller下面建一个home.php

复制代码
1
2
3
4
5
6
7
8
9
10
class Home extends CI_Controller { public function index() { $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands'); $data['title'] = "恭喜你smarty安装成功!"; $data['body'] = "欢迎使用smarty模板引"; $arr = array(1=>'zhang',2=>'xing',3=>'wang'); $data['myarray'] = $arr; $this->load->view('index_2', $data); } }

在views下面建一个index_2.html

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!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"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src='<!--{$base_url}-->js/jquery.min.js' type='text/javascript' ></script> <link href="<!--{$base_url}-->css/login.css" rel="stylesheet" type="text/css" /> <title>smarty安装测试</title> </head> <body> <h1>{#$title#}</h1> <p>{#$body#}</p> <ul> {#foreach from=$myarray item=v#} <li>{#$v#}</li> {#/foreach#} </ul> </body> </html>

好了,可以试试你的成果了。

三、yaf框架+smarty模板

yaf是利用引导文件Bootstrap.php来加载smarty。

3.1,使用Bootstrap

在index.php中用

复制代码 代码如下:
复制代码
$app->bootstrap()->run();

引入Bootstrap.php文件

3.2,在application/Bootstrap.php文件中导入smarty。

复制代码
1
2
3
4
5
6
7
<?php class Bootstrap extends Yaf_Bootstrap_Abstract { public function _initSmarty(Yaf_Dispatcher $dispatcher) { $smarty = new Smarty_Adapter(null, Yaf_Application::app()->getConfig()->smarty); Yaf_Dispatcher::getInstance()->setView($smarty); } }

3.3,添加Smarty_Adapter类

将smarty解压后放到application/library文件夹下,重命名为Smarty。在Smarty下新建Adapter.php,确保Smarty.class.php在Smarty/libs/下。Adapter.php内容:

复制代码
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
<?php Yaf_Loader::import( "Smarty/libs/Smarty.class.php"); Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php"); Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templatelexer.php"); Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_templateparser.php"); Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_compilebase.php"); Yaf_Loader::import( "Smarty/libs/sysplugins/smarty_internal_write_file.php"); class Smarty_Adapter implements Yaf_View_Interface { /** * Smarty object * @var Smarty */ public $_smarty; /** * Constructor * * @param string $tmplPath * @param array $extraParams * @return void */ public function __construct($tmplPath = null, $extraParams = array()) { $this->_smarty = new Smarty; if (null !== $tmplPath) { $this->setScriptPath($tmplPath); } foreach ($extraParams as $key => $value) { $this->_smarty->$key = $value; } } /** * Return the template engine object * * @return Smarty */ public function getEngine() { return $this->_smarty; } /** * Set the path to the templates * * @param string $path The directory to set as the path. * @return void */ public function setScriptPath($path) { if (is_readable($path)) { $this->_smarty->template_dir = $path; return; } throw new Exception('Invalid path provided'); } /** * Retrieve the current template directory * * @return string */ public function getScriptPath() { return $this->_smarty->template_dir; } /** * Alias for setScriptPath * * @param string $path * @param string $prefix Unused * @return void */ public function setBasePath($path, $prefix = 'Zend_View') { return $this->setScriptPath($path); } /** * Alias for setScriptPath * * @param string $path * @param string $prefix Unused * @return void */ public function addBasePath($path, $prefix = 'Zend_View') { return $this->setScriptPath($path); } /** * Assign a variable to the template * * @param string $key The variable name. * @param mixed $val The variable value. * @return void */ public function __set($key, $val) { $this->_smarty->assign($key, $val); } /** * Allows testing with empty() and isset() to work * * @param string $key * @return boolean */ public function __isset($key) { return (null !== $this->_smarty->get_template_vars($key)); } /** * Allows unset() on object properties to work * * @param string $key * @return void */ public function __unset($key) { $this->_smarty->clear_assign($key); } /** * Assign variables to the template * * Allows setting a specific key to the specified value, OR passing * an array of key => value pairs to set en masse. * * @see __set() * @param string|array $spec The assignment strategy to use (key or * array of key => value pairs) * @param mixed $value (Optional) If assigning a named variable, * use this as the value. * @return void */ public function assign($spec, $value = null) { if (is_array($spec)) { $this->_smarty->assign($spec); return; } $this->_smarty->assign($spec, $value); } /** * Clear all assigned variables * * Clears all variables assigned to Zend_View either via * {@link assign()} or property overloading * ({@link __get()}/{@link __set()}). * * @return void */ public function clearVars() { $this->_smarty->clear_all_assign(); } /** * Processes a template and returns the output. * * @param string $name The template to process. * @return string The output. */ public function render($name, $value = NULL) { return $this->_smarty->fetch($name); } public function display($name, $value = NULL) { echo $this->_smarty->fetch($name); } }

3.4,smarty配置文件。

再来看看我们的conf/application.ini文件

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
[common] application.directory = APP_PATH "/application" application.dispatcher.catchException = TRUE application.view.ext="tpl" [smarty : common] ;configures for smarty smarty.left_delimiter = "{#" smarty.right_delimiter = "#}" smarty.template_dir = APP_PATH "/application/views/" smarty.compile_dir = '/data1/www/cache/' smarty.cache_dir = '/data1/www/cache/' [product : smarty]

3.5,验证

新建一个controller,添加方法:

复制代码
1
2
3
public function twoAction() { $this->getView()->assign('content', 'hello World'); }

新建一个模板two.tpl

复制代码
1
2
3
4
5
6
7
8
<html> <head> <title>A Smarty Adapter Example</title> </head> <body> {#$content#} </body> </html>

希望本文所述对大家PHP程序设计有所帮助。

最后

以上就是标致爆米花最近收集整理的关于yii,CI,yaf框架+smarty模板使用方法的全部内容,更多相关yii内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(115)

评论列表共有 0 条评论

立即
投稿
返回
顶部