zend框架混合使用zend视图和smarty视图

为了自由使用视图,实践摸索出一套办法。

zend自带了php视图,后缀是phtml,还有一些常用的帮助类等,假如分模块,结构类似

# cd application
# tree
Java代码 zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma_02
  1. .
  2. |-- application
  3. | |-- configs
  4. | | `-- application.ini
  5. | |-- modules/
  6. | | |-- bbs
  7. | | | |-- controllers
  8. | | | | |-- BbsapplyController.php
  9. | | | | |-- BbstopicController.php
  10. | | | | `-- IndexController.php
  11. | | | |-- models
  12. | | | `-- views
  13. | | | |-- helpers
  14. | | | |-- scripts
  15. | | | `-- templates
  16. | | | |-- Bbsapply
  17. | | | | |-- index.tpl
  18. | | | | `-- view.tpl
  19. | | | |-- Bbstopic
  20. | | | | |-- index1.tpl
  21. | | | | |-- index2.tpl
  22. | | | | `-- index.tpl
  23. | | | `-- index
  24. | | | `-- index.tpl
  25. | | `-- default
  26. | | |-- controllers
  27. | | | |-- IndexController.php
  28. | | | |-- NewsController.php
  29. | | |-- models
  30. | | `-- views
  31. | | |-- helpers
  32. | | |-- scripts
  33. | | | `-- index
  34. | | | |-- index.phtml
  35. | | | `-- index2.phtml
  36. | | `-- templates
  37. | | `-- news
  38. | | |-- category.tpl
  39. | | `-- index.tpl
  40. | `-- templates
  41. | |-- common1.tpl
  42. | |-- common2.tpl
  43. | `-- common3.tpl
  44. |-- library
  45. | |-- Lib1.php
  46. | |-- Lib2.php
  47. | |-- Dao
  48. | | |-- Lib1.php
  49. | | `-- Lib2.php
  50. | |-- Smarty
  51. | | |-- Config_File.class.php
  52. | | |-- Smarty.class.php
  53. | | |-- Smarty_Compiler.class.php
  54. | | |-- Templater.php
  55. | | |-- debug.tpl
  56. | | |-- internals
  57. | | | |-- core.assemble_plugin_filepath.php
  58. | | | |-- core.assign_smarty_interface.php
  59. | | | `-- core.write_file.php
  60. | | `-- plugins
  61. | | |-- block.textformat.php
  62. | | |-- compiler.assign.php
  63. | | |-- function.assign_debug_info.php
  64. | | `-- shared.make_timestamp.php
  65. | |-- Templater
  66. | | `-- plugins
  67. | | |-- function.pagelinks.php
  68. | | |-- function.wysiwyg.php
  69. | | `-- modifier.title1.php
  70. | `-- Zend
  71. | |-- Acl
  72. | |-- Amf
  73. | |-- Auth
  74. | |-- Barcode
  75. | |-- ......
  76. | `-- ......
  77. |-- script
  78. | `-- migrate
  79. | `-- script1.php
  80. `-- documentroot
  81. |-- design
  82. | |-- demo1.html
  83. | `-- demo2.html
  84. |-- p_w_picpaths
  85. | |-- bg.png
  86. | |-- index.png
  87. | |-- blank.gif
  88. | |-- captcha.png
  89. | `-- small.png
  90. |-- css
  91. | |-- 1.css
  92. | `-- 2.css
  93. |-- js
  94. | `-- lib
  95. | |-- jquery-1.4.2.min.js
  96. | `-- jquery-ui-1.8.6.custom.min.js
  97. `-- index.php


4个根目录的父目录由版本管理同步,
application 框架程序
library 类库,需要放在php.ini的include_path里,其中含了smarty和Zend框架的类库。
script 一些脚本
documentroot apache的文档根目录

把smarty的模板根目录定位到application,主要是为了有一些smarty公用的模板有地方可放。

为方便起见,zend视图完全按照zend的要求,连后缀都不改,目录结构都不改。
zend视图默认的是"模块名/views/scripts/控制器名/动作名.phtml"
smarty模板则相应使用"模块名/views/templates/控制器名/动作名.tpl"

假设有两个模块,缺省模块和论坛的bbs模块,在目录中可以看出,缺省模块的index控制器使用了zend视图,别的统统使用smarty视图。


application/documentroot/index.php
引导文件的部分代码
Java代码 zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma_02
  1. defined('APPLICATION_PATH')
  2. || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
  3. //创建前端控制器对象,
  4. $front_controller = Zend_Controller_Front::getInstance();
  5. $front_controller->addModuleDirectory(APPLICATION_PATH . '/modules');
  6. //分发
  7. $front_controller->dispatch();



如果使用zend视图,则控制器类什么都不做。

在需要使用smarty的控制器里,例如
application/modules/default/controllers/NewsController.php
Java代码 zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma_02
  1. //缺省模块的新闻控制器
  2. class NewsController extends Zend_Controller_Action
  3. {
  4. function init(){
  5. $viewRenderer = $this->getHelper('viewRenderer');
  6. $viewRenderer->setView(new Smarty_Templater())
  7. ->setViewBasePathSpec(APPLICATION_PATH )
  8. ->setViewScriptPathSpec('modules/:module/views/templates/:controller/:action.:suffix')
  9. ->setViewSuffix('tpl')
  10. ->initView();
  11. $this->view = $this->_helper->viewRenderer->view;
  12. parent::init();
  13. }
  14. /**
  15. * 缺省模块的新闻控制器的index行为,使用samrty模板
  16. */
  17. public function indexAction()
  18. {
  19. $this->view->greeting = "Hello,World!";
  20. }


application/modules/default/views/templates/news/index.tpl
Java代码 zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma zend框架混合使用zend视图和smarty视图_zend框架混合使用zend视图和sma_02
  1. {$greeting}


就这样,整个世界都清净了。