`
lovefly_zero
  • 浏览: 390120 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

走进Zend Framework框架编程(六):视图( 第二部分)

    博客分类:
  • PHP
阅读更多
6.6视图脚本的变量转义输出(escaping output)
视图脚本得到变量以后,需要通过转义进行输出,变成页面可以显示的Html代码。
输出语句的格式:
echo $this->escape($this->variable);
$variable变量是在视图脚本里用render方法传递过来的。
一般情况下,传递的变量是通过PHP的 htmlspecialchars()函数转义的。而我们也可以实现我们自己的转义函数。请参考以上“使用回调函数”示例。

6.7视图脚本的模板系统—操作PHPLib类型的模板
模板系统进一步完美的实现了视图与程序逻辑的分离。视图脚本可以完美的操作PHPLib等类型的模板。

6.7.1PHPlib的安装和调用
为了测试下面的示例,我们必须安装PHPLib模板系统到我们的环境中。从网上下载到phplib-7.4.ZIP安装压缩包,解压到安装ZEND的library文件夹下,就完成了安装。
为了在ZF的视图脚本里调用得到模板类文件,必须在引导文件Index.php的set_include_path部分添加PHPLib模板类库文件夹phplib-7.4/php到搜索路径中。以下示例同时包含了Smarty模板引擎的类库文件的搜索路径:
set_include_path('.' .
  PATH_SEPARATOR . '../library/'.
  PATH_SEPARATOR . '../library/phplib-7.4/php/'.
  PATH_SEPARATOR . '../library/Smarty-2.6.19/libs/'.
  PATH_SEPARATOR . 'models/'.
  PATH_SEPARATOR . get_include_path()
);
注意,所有路径都是以引导文件所在文件夹作为参照的。尽管视图文件里所在文件夹不是引导文件所在根目录,但在视图文件里包含PHPLib类库文件的语句include_once 'template.inc';仍然是以引导文件所在目录作为参照的。

6.7.2在视图文件里调用PHPLib模板
首先包含PHPLib类库文件,然后声明模板类的一个实例。使用模板类,首先需要指定一些属性,比如指定模板所在路径,指定模板文件等,然后用set_var传递模板变量,最后用parse方法调用模板文件。PHPLib模板系统的详细用法请参考其帮助文档。
示例:
<?php
  include_once 'template.inc';
  $tpl = new Template();
  $tpl->set_root('views');
  if ($this->books)
  {
    $tpl->set_file(array(
        "booklist" => "booklist.tpl",
        "eachbook" => "eachbook.tpl",
    ));
    foreach ($this->books as $key => $val)
    {
      $tpl->set_var('author', $this->escape($val['author']));
      $tpl->set_var('title', $this->escape($val['title']));
      $tpl->parse("books", "eachbook", true);
    }
    $tpl->pparse("output", "booklist");
  }
  else
  {
    $tpl->setFile("nobooks", "nobooks.tpl");
    $tpl->pparse("output", "nobooks");
  }
?>
booklist.tpl文件内容:
<?php
  if ($this->books):
?>
  <table border=1>
  <tr>
    <th>作者</th>
    <th>书名</th>
  </tr>
  <?php
    foreach ($this->books as $key => $val):
  ?>
  <tr>
    <td><?php echo $this->escape($val['author']) ?></td>
    <td><?php echo $this->escape($val['title']) ?></td>
  </tr>
  <?php endforeach; ?>
  </table>
<?php
  else:
?>
  <p>There are no books to display.</p>
<?php
  endif;
eachbook.tpl文件内容:
<!-- eachbook.tpl -->
<tr>
  <td>{author}</td>
  <td>{title}</td>
</tr>

6.8视图脚本的模板系统—使用 Zend_View_Interface调用第三方模板引擎
我们还可以通过实现Zend_View_Interface接口,来得到一个可用的模板系统。
ZF对Zend_View_Interface接口的原始定义:
/** Return the actual template engine object */
public function getEngine();
/* Set the path to view scripts/templates */
public function setScriptPath($path);
/* Set a base path to all view resources */
public function setBasePath($path, $prefix = 'Zend_View');
/* Add an additional base path to view resources */
public function addBasePath($path, $prefix = 'Zend_View');
/* Retrieve the current script paths */
public function getScriptPaths();
/* Overloading methods for assigning template variables as object properties */
public function __set($key, $value);
public function __get($key);
public function __isset($key);
public function __unset($key);
/* Manual assignment of template variables, or ability to assign multiple
  variables en masse.*/
public function assign($spec, $value = null);
/* Unset all assigned template variables */
public function clearVars();
/* Render the template named $name */
public function render($name);
使用该接口,我们可以很容易的把第三方的模板引擎,比如Smarty,包装成Zend_View兼容的模板类。

6.8.1Smarty的安装
下载Smarty软件包,解压到ZEND的library文件夹下,就完成了安装。
为了在ZF的视图脚本里调用得到模板类文件,必须在引导文件Index.php的set_include_path部分添加Smarty模板类库文件夹Smarty-2.6.19/libs到搜索路径中,参看前面PHPlib的安装说明部分。
Smarty模板引擎需要建立template_dir和compile_dir文件夹才能工作。ZF手册里的示例因为缺少这些设置而无法运行,正确的代码片段如下:
    public function setScriptPath($path)
    {
        if (is_readable($path))
{
            $this->_smarty->template_dir = $path;
            $this->_smarty->compile_dir = $path;  //必须加语句:设置编译路径
            $this->_smarty->cache_dir = $path;    //设置缓存路径
return;
         }
……
我们把对Zend_View_Interface接口的实现的类,放在models文件夹下的ZendViewSmarty.php文件中,该文件的内容如下:
<?php
require_once 'Zend/View/Interface.php';
require_once 'Smarty.class.php';
class ZendViewSmarty implements Zend_View_Interface
{
    /**
     * Smarty object
     * @var Smarty
     */
    protected $_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;
            $this->_smarty->compile_dir = $path;
            $this->_smarty->cache_dir = $path;
            return;
        }
        throw new Exception('Invalid path provided');
    }
    /**
     * Retrieve the current template directory
     * @return string
     */
    public function getScriptPaths()
    {
        return array($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);
    }
    /**
     * Retrieve an assigned variable
     * @param string $key The variable name.
     * @return mixed The variable value.
     */
    public function __get($key)
    {
        return $this->_smarty->get_template_vars($key);
    }
    /**
     * 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 [email={@link]{@link[/email] assign()} or
     * property overloading ([email={@link]{@link[/email] __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)
    {
        return $this->_smarty->fetch($name);
    }
}
?>
控制脚本中对我们我的模板类的调用代码:
   function smartyAction()
   {
      $view = new ZendViewSmarty(); //实例化新的模板类
      $view->setScriptPath('views'); //设置模板文件路径
      $view->book = 'Enter Zend Framework Programme'; //传递变量给模板引擎
      $view->author = '张庆(网眼)';
      echo $view->render('bookinfo.tpl'); //视图呈现
   }
我们看到,由于Smarty模板引擎的良好特性,除过实现上述接口的代码比较复杂以外,我们这里的控制代码要比应用PHPLib模板简单得多。我们的数据不必像PHPLib引擎那样,要把数据传给视图脚本,再由视图脚本声明PHPLib类,再把数据发送给模板去呈现。这里是在控制脚本里把数据直接传递给Smarty模板去呈现的。这是因为ZendViewSmarty实现的是Zend_View接口,它和Zend_View的用法是一样的。
注意:本例只是使用Smarty引擎的其中一种方法。在ZF中还可以用别的形式来使用Smarty模板引擎,我们会在别的章节里介绍。
张庆(网眼)文章出处phpchina
分享到:
评论

相关推荐

    Zend_Framework_ZH中文手册

    在Zend Framework中,MVC是一种关键的设计模式,用于分离应用程序的不同部分。模型(Model)处理业务逻辑,视图(View)负责数据展示,控制器(Controller)协调模型和视图的交互。手册将深入讲解如何设置和使用这些...

    Zend框架入门教程

    ### Zend框架入门教程知识点解析 #### 一、简介与背景 **标题与描述解析:** - **标题**:“Zend框架入门教程”明确指出这是一份针对初学者的指南,旨在帮助用户快速掌握Zend框架的基本使用方法。 - **描述**:这...

    zendframework留言分页

    - Zend Framework是一个MVC(模型-视图-控制器)架构的PHP框架,它遵循面向对象编程原则,提供了一系列独立且可重用的组件,如路由、控制器、视图助手等。 - 在本项目中,`index.php`是入口文件,负责初始化Zend ...

    Zend Framework 1.8中文版参考手册.pdf

    1. **入门指南**:介绍如何安装Zend Framework,设置开发环境,以及创建第一个项目。 2. **组件详解**:详细阐述每个组件的功能、用法和示例,如控制器、视图助手、模型、数据库访问等。 3. **最佳实践**:提供了...

    zend完整框架Demo

    9. **服务容器**:`Zend\ServiceManager`是Zend Framework 2及更高版本中的一个重要组件,但也可以通过第三方库在旧版本中使用。它允许你定义服务并按需注入,提高了代码的可测试性和灵活性。 10. **组件化**:Zend...

    zend framework初级教程源代码

    8. **模块化**: Zend Framework 2 引入了模块化,这意味着大型应用可以被划分为多个独立的模块,每个模块都有自己的控制器、模型、视图和配置。 9. **安全**:框架内建的安全特性,如认证(Authentication)、授权...

    最新zend framework 文档

    这个“最新Zend Framework文档”很可能是官方或社区维护的指南,旨在帮助开发者掌握框架的最新特性和最佳实践。 Zend Framework的核心设计理念是“组件式”,这意味着你可以根据项目需求选择和组合不同的模块,而...

    zend+framework技术大全前十章

    在第一章,我们将介绍 Zend Framework 的设计理念,包括MVC(模型-视图-控制器)模式、依赖注入、面向对象编程等原则。此外,还会讨论 Zend Framework 如何与其他PHP库和框架集成,以及如何利用其强大的组件化设计来...

    (zf2)zend framework 2官方文档pdf

    **Zend Framework 2**(简称ZF2)是基于PHP的一个开源Web应用程序框架。它提供了大量的组件和服务,旨在帮助开发者构建高性能且易于维护的应用程序。ZF2强调模块化设计,允许开发者选择所需的功能组件来构建应用。 ...

    大道PHP:LAMP+Zend+开源框架整合开发与实战(随书光盘源码2).rar

    理解Zend框架的MVC(Model-View-Controller)模式,以及其服务、控制器、模型和视图的交互,有助于提高开发效率。 4. 开源框架整合:除了Zend,书中的实战部分还可能涵盖了其他如Symfony、Laravel、Yii等流行的PHP...

    Zend Framework 手册中文CHM版--11月4日更新

    尽管 Zend Framework 默认不绑定任何特定模板引擎,但可以轻松集成如 `Twig` 或 `Phly.Mustache` 等第三方模板库,实现灵活的视图渲染。 **9. 服务导向架构(SOA)** Zend Framework 支持 SOA 架构,可以与 `ZF2 ...

    zend 中文手册 php高手 phper

    4. **ZF2 和 ZF3 版本**:Zend Framework 发展至今,经历了 ZF1、ZF2 和 ZF3 三个主要版本,每个版本都引入了新的特性和改进,如 ZF2 引入了命名空间和 PSR 标准,ZF3 更加强调组件的独立性。 5. **强大的数据库...

    基于ZendFramework2的PHP电子商务系统.zip

    【标题】"基于Zend Framework 2的PHP电子商务系统"是一个使用PHP编程语言和 Zend Framework 2 框架开发的Web应用程序,专为电子商务场景设计。这个系统包含了完整的前后端功能,可以支持在线购物、订单处理、用户...

    PHP框架应用开发:THINKPHPPPT课件.ppt

    2. 了解THINKPHP框架的基本概念和使用流程,例如创建第一个"Hello World"应用,以及如何设置URL路径和控制器的关系。 3. 掌握THINKPHP中的模板替换和系统常量的使用,如何在模板中动态地插入数据和使用预定义的常量...

    phpGuidetoProgrammingwithZendFramework.rar

    2. **Zend Framework概述**:Zend Framework是一个开源的、基于组件的PHP框架,它提供了一套标准的开发模式,用于快速开发企业级Web应用。书里将解释其设计哲学和主要特性,如模块化、服务定位器、依赖注入容器等。 ...

    system_framework:一个基于 Zend 的 php 框架

    - `library/`:包含自定义类库和第三方库,如Zend Framework组件。 - `public/`:Web服务器的入口点,通常放置静态资源和索引文件。 - `tests/`:单元测试和集成测试的代码。 - `config/`:配置文件,用于设置框架和...

    大道PHP:LAMP+Zend+开源框架整合开发与实战(随书光盘源码).rar

    2. **Zend框架**:Zend Framework是一款企业级的PHP开发框架,它采用组件化设计,提供了丰富的工具和类库,便于开发高质量的Web应用。了解并掌握Zend框架的基本结构、MVC模式、控制器、模型、视图、以及服务和依赖...

Global site tag (gtag.js) - Google Analytics