Jadual Kandungan
{#$title#}
Rumah pembangunan bahagian belakang tutorial php yii,CI,yaf框架+smarty模板使用方法_PHP

yii,CI,yaf框架+smarty模板使用方法_PHP

May 28, 2016 am 11:49 AM
ci smarty yaf yii bingkai templat

本文实例讲述了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',

  )

)

Salin selepas log masuk

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

1

2

3

Yii::setPathOfAlias('batman', dirname(__FILE__));

Yii::import("batman.protected.vendors.*");

define('APP_DIR', dirname(__FILE__).'/protected/');

Salin selepas log masuk

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

<&#63;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;

 }

}

Salin selepas log masuk

1.4,验证

新建一个HelloController.php

1

2

3

4

5

6

<&#63;php

class HelloController extends Controller {

 public function actionWorld() {

  $this->render('world', array('content'=>'hello world'));

 }

}

Salin selepas log masuk

新建一个word.html

1

2

3

<body>

{#$content#}

</body>

Salin selepas log masuk

二、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');

}

Salin selepas log masuk

这种方法跟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

<&#63;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;

  }

 }

}

Salin selepas log masuk

我把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);

 }

}

Salin selepas log masuk

在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 id="title">{#$title#}</h1>

<p>{#$body#}</p>

<ul>

  {#foreach from=$myarray item=v#}

  <li>{#$v#}</li>

  {#/foreach#}

</ul>

</body>

</html>

Salin selepas log masuk

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

三、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

<&#63;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);

 }

}

Salin selepas log masuk

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

<&#63;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);

 }

}

Salin selepas log masuk

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]

Salin selepas log masuk

3.5,验证

新建一个controller,添加方法:

1

2

3

public function twoAction() {

  $this->getView()->assign('content', 'hello World');

}

Salin selepas log masuk

新建一个模板two.tpl

1

2

3

4

5

6

7

8

<html>

<head>

<title>A Smarty Adapter Example</title>

</head>

<body>

{#$content#}

</body>

</html>

Salin selepas log masuk

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menilai keberkesanan kos sokongan komersial untuk rangka kerja Java Bagaimana untuk menilai keberkesanan kos sokongan komersial untuk rangka kerja Java Jun 05, 2024 pm 05:25 PM

Menilai kos/prestasi sokongan komersial untuk rangka kerja Java melibatkan langkah-langkah berikut: Tentukan tahap jaminan yang diperlukan dan jaminan perjanjian tahap perkhidmatan (SLA). Pengalaman dan kepakaran pasukan sokongan penyelidikan. Pertimbangkan perkhidmatan tambahan seperti peningkatan, penyelesaian masalah dan pengoptimuman prestasi. Timbang kos sokongan perniagaan terhadap pengurangan risiko dan peningkatan kecekapan.

Bagaimanakah keluk pembelajaran rangka kerja PHP berbanding rangka kerja bahasa lain? Bagaimanakah keluk pembelajaran rangka kerja PHP berbanding rangka kerja bahasa lain? Jun 06, 2024 pm 12:41 PM

Keluk pembelajaran rangka kerja PHP bergantung pada kecekapan bahasa, kerumitan rangka kerja, kualiti dokumentasi dan sokongan komuniti. Keluk pembelajaran rangka kerja PHP adalah lebih tinggi jika dibandingkan dengan rangka kerja Python dan lebih rendah jika dibandingkan dengan rangka kerja Ruby. Berbanding dengan rangka kerja Java, rangka kerja PHP mempunyai keluk pembelajaran yang sederhana tetapi masa yang lebih singkat untuk bermula.

Bagaimanakah pilihan rangka kerja PHP yang ringan mempengaruhi prestasi aplikasi? Bagaimanakah pilihan rangka kerja PHP yang ringan mempengaruhi prestasi aplikasi? Jun 06, 2024 am 10:53 AM

Rangka kerja PHP yang ringan meningkatkan prestasi aplikasi melalui saiz kecil dan penggunaan sumber yang rendah. Ciri-cirinya termasuk: saiz kecil, permulaan pantas, penggunaan memori yang rendah, kelajuan dan daya tindak balas yang dipertingkatkan, dan penggunaan sumber yang dikurangkan: SlimFramework mencipta API REST, hanya 500KB, responsif yang tinggi dan daya pemprosesan yang tinggi.

Apakah aplikasi biasa templat C++ dalam pembangunan sebenar? Apakah aplikasi biasa templat C++ dalam pembangunan sebenar? Jun 05, 2024 pm 05:09 PM

Templat C++ digunakan secara meluas dalam pembangunan sebenar, termasuk templat kelas kontena, templat algoritma, templat fungsi generik dan templat pengaturcaraan meta. Sebagai contoh, algoritma pengisihan generik boleh mengisih tatasusunan jenis data yang berbeza.

Bagaimana untuk memilih rangka kerja golang terbaik untuk senario aplikasi yang berbeza Bagaimana untuk memilih rangka kerja golang terbaik untuk senario aplikasi yang berbeza Jun 05, 2024 pm 04:05 PM

Pilih rangka kerja Go terbaik berdasarkan senario aplikasi: pertimbangkan jenis aplikasi, ciri bahasa, keperluan prestasi dan ekosistem. Rangka kerja Common Go: Gin (aplikasi Web), Echo (Perkhidmatan Web), Fiber (daya pemprosesan tinggi), gorm (ORM), fasthttp (kelajuan). Kes praktikal: membina REST API (Fiber) dan berinteraksi dengan pangkalan data (gorm). Pilih rangka kerja: pilih fasthttp untuk prestasi utama, Gin/Echo untuk aplikasi web yang fleksibel, dan gorm untuk interaksi pangkalan data.

Pelan Hala Tuju Pembelajaran Rangka Kerja Java: Amalan Terbaik dalam Domain Berbeza Pelan Hala Tuju Pembelajaran Rangka Kerja Java: Amalan Terbaik dalam Domain Berbeza Jun 05, 2024 pm 08:53 PM

Pelan hala tuju pembelajaran rangka kerja Java untuk bidang yang berbeza: Pembangunan web: SpringBoot dan PlayFramework. Lapisan kegigihan: Hibernate dan JPA. Pengaturcaraan reaktif bahagian pelayan: ReactorCore dan SpringWebFlux. Pengkomputeran masa nyata: ApacheStorm dan ApacheSpark. Pengkomputeran Awan: AWS SDK untuk Java dan Google Cloud Java.

Apakah salah faham yang biasa berlaku dalam proses pembelajaran kerangka Golang? Apakah salah faham yang biasa berlaku dalam proses pembelajaran kerangka Golang? Jun 05, 2024 pm 09:59 PM

Terdapat lima salah faham dalam pembelajaran rangka kerja Go: terlalu bergantung pada rangka kerja dan fleksibiliti terhad. Jika anda tidak mengikut konvensyen rangka kerja, kod tersebut akan menjadi sukar untuk dikekalkan. Menggunakan perpustakaan lapuk boleh menyebabkan isu keselamatan dan keserasian. Penggunaan pakej yang berlebihan mengaburkan struktur kod. Mengabaikan pengendalian ralat membawa kepada tingkah laku yang tidak dijangka dan ranap sistem.

Penjelasan praktikal terperinci pembangunan rangka kerja golang: Soalan dan Jawapan Penjelasan praktikal terperinci pembangunan rangka kerja golang: Soalan dan Jawapan Jun 06, 2024 am 10:57 AM

Dalam pembangunan rangka kerja Go, cabaran biasa dan penyelesaiannya ialah: Pengendalian ralat: Gunakan pakej ralat untuk pengurusan dan gunakan perisian tengah untuk mengendalikan ralat secara berpusat. Pengesahan dan kebenaran: Sepadukan perpustakaan pihak ketiga dan cipta perisian tengah tersuai untuk menyemak bukti kelayakan. Pemprosesan serentak: Gunakan goroutine, mutex dan saluran untuk mengawal akses sumber. Ujian unit: Gunakan pakej, olok-olok dan stub untuk pengasingan dan alat liputan kod untuk memastikan kecukupan. Penerapan dan pemantauan: Gunakan bekas Docker untuk membungkus penggunaan, menyediakan sandaran data dan menjejak prestasi dan ralat dengan alat pengelogan dan pemantauan.

See all articles