日期:2012-07-28  浏览次数:20600 次

  第2章 用PRADO编程

  现在让我们更深入的了解一下PRADO框架。这一章我们会介绍一些框架的基本概念和如何使用现有的PRADO组件来开发一个PRADO应用。

  2.1  组件


  根据Clemens Szyperski的说法, ``软件组件是一个具有特定接口的组合单元,可以独立存在,参与组成其它组建。''

  在PRADO中, 组件是 TComponent 或者其子类的实例。PRADO框架中已经包括了 TComponent
类,它主要实现了组件的属性和事件机制。

  • 属性可以被认为是描述组件某一特性的公共变量,比如背景颜色,字体大小等等。属性是有类型的,比如 string, integer , 等等。属性可以是只读的,也可以是可读写的。
  • 事件使代理函数可以对组件中进行的一些活动作出响应,比如鼠标的点击,输入文本的变化等。

  一个组件会继承它所有父类组件的属性和方法,因为组件本身其实就是一个类。

  一个完整的组件类定义包括两个文件:

  • 一个类文件,它定义了组件类的逻辑。这个文件主要是PHP代码。这个文件的文件名必须和类的名字一样,而且以.php 作为文件后缀。
  • 一个规格文件,它定义了组件类的属性和方法。这个文件是XML格式。如果这个组件类没有定义父类之外的新的属性和事件,那么这个文件是可以省略不要的。缺省情况下,这个文件和组件的类文件在一个目录中,而且名字是一样的,唯一不同的是它们的文件名后缀(类文件的后缀是.php ,规格文件是 .spec )。值得注意的是,PRADO也允许你用不同的文件名来命名规格文件和模板文件,但是类文件名还是必须遵循与类同名,并且后缀为.php 的规则的。这时候你需要在类的常量SPECIFICATION_FILE中指定规格文件的包含路径的文件名,可以使用绝对或者相对路径(相对类文件所在位置)。

  注意:PRADO 是区分大小写的,组件类型,属性名称,事件名称,文件名等等这些都是区分大小写的。

  2.1.1  控件


 

  控件是定义了用户界面的PRADO 组件。每一个控件都有一个父控件和一些子控件(注意,这里的父,子这些关系和面向对象中的父类子类的概念是完全不一样的。一个控件是另外一个控件的父控件只是说明了前者拥有后者,这个拥有关系可以理解为一个目录下包含了一个子目录;而绝不是后者是前者的子类、是从前者继承而来的这个概念)。页面是最高级别的控件,它没有父控件(当然你也可以认为Application是它的父控件)。一个PRADO的应用是一个页面的集合,每一个页面都代表了一个层次树状结构的控件集,控件与控件之间关系是通过父子关系联系在一起的。

  这种父子关系可以通过模板文件来建立。模板文件的格式和HTML是很像的,只不过在HTML的基础上增加了一些特殊的标签来定应控件。如果一个控件的标签被另外一个控件的标签所包括,那么前者就被认为是后者的子控件。静态文本也被认为是子控件。

  控件可以拥有一个模板文件来描述它的界面内容。缺省情况下模板文件和类文件在同一个目录下,而且文件名是相同的,模板文件的后缀则为 .tpl 。同规格文件一样,如果你需要把模板文件放在不同地方或者用鳖的文件名,可以通过设置类常量 TEMPLATE_FILE 的值来指明模板文件的位置。

  每一个控件都有一个ID,它可以在同一级别的控件中来唯一标识控件本身。ID路径则是在控件的树状结构中,从当前控件到目标控件的所有控件ID的序列,它可以用于访问一个控件。比如,在
HomePage中,有一个 Menu 控件,它拥有一个子控件 Button 。对于控件HomePage而言,可以通过ID(Menu,Button)路径来访问 Button 控件。如果用PHP代码来书写,就是 $this->Menu->Button .

  2.1.2  实例化组件

  组件有两种方式来实例化。一种方法是在一个控件的模板文件中定义它,当这个控件被创建的时候,框架会自动的去实例化这个组件。还有一种方法是在PHP代码中手动的实例化。我们先来看一下前面一种静态的创建方法,稍后再来看一下动态的创建方法。

  静态创建组件

  通常只有控件在模板文件中被静态创建。

  一个控件在模板文件组件标签来声明,其语法如下: 

 ......
<com:ComponentType ID="..." PropertyName="..." EventName="...">
    ....body contents....
</com:ComponentType>
......

  这里  ComponentType, PropertyName, 和 EventName 应该被真正的组件类名,属性名和事件名所替代。 ID 属性是可选的。如果定义了ID 属性,那么ID 的值必须在平级的控件中是唯一的。如果没有定义,那么框架会自动为这个控件分配一个唯一的ID的。当然,这要求组件的标签被正确的嵌套,每一个开放的组件标签都应该和一个闭合的组件标签组成一对,这个规则和XML的规则是一样的。(译者著:如果你对XML一点都不了解,建议你先看一下一些基本的XML概念,要求并不高,你只需要知道如何正确书写一个XML文件即可。)

  注意:控件的ID必须是一个以字母开头的,后面只包含字母,数字和下划线的字符串。

  模板文件中属性的初始值字符串会被自动转换为正确的属性类型。目前有六种属性类型: string, integer, float, boolean, array  face="Courier New">和 object. 前面三种类型的字符串格式是非常简单的。 boolean 类型只允许使用两个字符串: true  face="Courier New">和 falsearray 类型接受如 (value1,value2,key3=>value3,...) 格式一样的字符串,这和 PHP 数组的初始化是一样的。 而 object 类型就比较复杂了,它取决于属性是如何被定义的。一些属性可以允许使用字符串,并会把它转换为对象,但是有些属性就不行了。

  当组件被创建(实例化)的时候,通过规格文件定义的组件的属性和对应事件处理方法就会立刻生效了。

  动态创建组件


 

  PRADO

  允许开发者在自己的PHP代码中实例化组件。组件可以通过调用一个静态类方法Application::createComponent($type)来被实例化,该方法的参数$type 指明了要创建的组件的名称。组件也可以使用new 操作符来实例化。这两者方法的区别是:前者会使用一种缓存机制,下一次创建相同的组件时速度会快很多;而后者不会使用缓存机制,每次都要完全重复执行实例化的步骤。通常情况你应该使用TApplication::createComponent($type) 来实例化(如果你想了解更多,请参考下面的注释)。

  如果新创建的组件是一个控件,那么可以通过调用把这个控件作为其他控件的子控件。注意,如果你需要指定这个控件的ID,应该在将它添加作为其他控件的子