当前位置:开发者网络 >> 技术教程 >> PHP教程 >> PHP应用 >> 内容
精彩推荐
分类最新教程
分类热点教程
  
PHP开发利器-PRADO 1.6(3)
作者:未知
日期:2005-12-23
人气:
投稿:(转贴)
来源:未知
字体:
收藏:加入浏览器收藏
以下正文:

2.3  应用

  每一个 PRADO Web应用都有且只有一个的实例。它主要是负责编码解码用户请求,服务器的页面请求,和维护应用级别的参数。

  2.3.1  应用的配置

  每一个PRADO应用都应该有一个XML格式的配置文件。在"hello world"这个例子中,这个文件的文件名为 application.spec .

  应用配置文件的格式如下:

 <?xml version="1.0" encoding="UTF-8"?>
<application default-page="..." cache-path="..."
session-class="..." user-class="...">
<alias name="..." path="..." />
<alias name="..." path="..." />
<using namespace="..." />
<using namespace="..." />
<secured page="..." role="..." />
<secured page="..." role="..." />
<parameter name="...">...</parameter>
<parameter name="...">...</parameter>
<parameter file="..." />
</application>

  alias 元素定义了文件路径的别名,路径可以是绝对是绝对路径也可以是相对路径。

  using 元素定义了要增加到 PHP搜索路径 include_path 变量中的命名空间。命名空间是用"."号连接的。第一段是路径的别名,之后是子目录。比如System.Web.UI 代表了框架所在目录下的Web/UI/子目录。框架的目录的别名已经被定义成System 。在编程的时候,也可以调用using() 函数来增加一个命名空间。

  secured 标签知名了页面是否需要验证/授权,page 属性指名的是页面的名称或者是页面名称的匹配表达式。如果一个页面被标明是的,那么说明这个页面需要用户验证的。另外如果role 属性不是空的,那么要求用户是属于指定的角色的。

  parameter 元素定义了用户参数。可以通过设置parameter 元素的file 属性来导入一个参数文件。参数文件的格式如下:

 <?xml version="1.0" encoding="UTF-8"?>
<parameters>
<parameter name="...">...</parameter>
<parameter name="...">...</parameter>
</parameters>

  default-page 属性和 cache-path 属性分别知名了缺省的页面和缓存路径。如果应用需要使用session, session-class 属性也需要设置。如果应用需要使用框架的验证/授权支持,那么还应该指定user-class 属性。

  2.3.2  页面服务

  PRADO 使用 GET 变量 page 来指明要请求的页面。比如下面的这个URL:

 /examples/phonebook.php?page=AddEntryPage

  这段代码将会请求 AddEntryPage 页面。如果没有指定page 变量,那么就会调用应用配置中的缺省页面。

  你也可以使用 TApplication::constructUrl() 方法来请求一个页面。

  2.3.3  数据编码和解码

  缺省情况  TApplication 会对所有的POST和GET数据进行HTML编码。 ', ", <, >, & 会被转化为&#039;,&quote;,&lt;,&gt;和&amp;。之所以要进行编码主要是为了让这些字符能被保存到数据库中,并且能正确显示回给用户。如果有必要的话,可以调用pradoDecodeData()函数来进行解码。也可以重载TApplication::beginRequest() 函数不进行编码。


2.4  定义新组件

  有两种方法来定义新的组件类:继承和组合。

  继承是面向对象的设计概念。派生类定义它的父类的一些内容,还可以提供一些其他的功能。在PRADO框架中,组件的属性和事件都是可以继承的。派生类也可以提供更多的属性和事件。所有的组件类都应该从TComponent 或者它的派生类继承。

  所有父组件的属性和事件会被派生组件类继承。

  组合是用于基于组件的框架的。在PRADO中,主要对控件使用。一个新的控件类可以被定义为几个其他几个控件的组合。新的类负责协调这些控件之间的通信,并代表它们和外界通信。比如可以定义一个LabeledTextBox 控件类(继承TControl ),它由TLabel 一个控件和一个TLabel
控件组成。新的类负责配置这两个组成控件的属性和方法。

  一般的约定(并不强求),控件的ID和属性的首字母应该大写,比如HomePage, NavigateUrl,
LogoPict;事件以On开头,比如OnClick 。ID和属性的名字命名和变量命名一样,必须是以字母开头的,仅包括字母数字和下划线的字符串。

  要定义一个新的组件通常需要写一个组件类文件,一个规格文件和一个模板文件。有些时候后面两个文件可以不要的。

  2.4.1  定义属性


  组件的属性在组件类的规格文件中定义,规格文件的语法如下:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<property name="<property name>"
get="<getter method>"
set="<setter method>"
type="<property type>"
default="<default value>" />
......
</component>

  在这里,name 用来唯一标识属性;get 定义了一个类方法来读取属性,set 定义了一个类方法来写属性,type 定义了属性的类型(string, integer, float, boolean, array 和object),default 标识了属性的缺省值。其中name 属性是必须的。getter方法的语法如下: 

 function getterMethodName()
{
....
return $value.
}

  如果一个属性是不可读的,那么不要设置get 属性。setter方法的语法如下:

 function setterMethodName($value)
{
// set some variable with $value
}

  如果一个属性是不可写的,那么不要设置set 属性。如果这个属性的类型是string,那么也可以不指明。类型的属性用来自动转换配置在规格文件或者模板文件中的属性初始值。default
属性一般用来作为引用的目的,也是可选的。如果一个属性是可读的而且之前没有被设置,那么getter方法应该返回一个缺省值。

  可以用下面的语法定义组件的组件属性:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<component type="component type" ID="component ID">
<property name="property name" value="property value"/>
....
<event name="event name" handler="function name"/>
....
</component>
......
</component>

  这里type 属性指明了组件类的名称,IDID 属性指明了属性名称。property 元素和event 元素指明了对应的初值。

  当组件被创建的时候,它的组件类型属性会自动被实例化。

  2.4.2  定义事件

  组件事件在规格文件中定义,而其内在的实现机制在类文件中定义。在规格文件中定义事件的语法如下:

 <?xml version="1.0" encoding="UTF-8"?>
<component>
......
<event name="..." />
......
</component>

  事件的name应该是一个合法的变量名。

  在类文件中,通常会实现这么一个对应的方法(假定事件的名称叫 OnClick):

 function onClick($param)
{
$this->raiseEvent('OnClick',$this,$param);
}

  当这个事件实际发生的时候,这个 onClick 方法应该确实被调用了(参考框架的TButton.php
文件)。raiseEvent 方法在TComponent 类中实现,它调用了所有对应OnClick 的事件响应函数,并把参数$param 传递给它们。

  2.4.3  编写模板文件

  在这一节里,会讲一些关于如何编写模板文件。模板是用于控件的,当时也不是所有的控件都需要模板。比如TTextBox, TButton 这些控件因为没有内容,因此就不需要模板。模板文件一般用于页面或者基于组合定义的控件。

  模板中的注释,比如 <!-- ... --> 被作为静态文本处理。

  可以在组件标签之外通过属性标签<prop:...>来配置组件的属性。比如可以用以下的代码配置模板中TTextBox 控件的Text 属性。

 ...
<com:TTextBox ID="profile">
<prop:Text>
...
</prop:Text>
</com:TTextBox>
...

  在一对属性标签中间的内容作为对应的组件属性的值。如果一些属性的值需要很大的数据,这样就很方便。

  在模板文件中可以使用3种特殊的标签:

  • <%include ... %> - 框架会在解析模板前在这个位置包含一个外部文件。比如,你可以用它在页面模板中包含一个公共头文件<%include header.tpl %> 。外部文件的路径应该是这个模板文件的相对路径。
  • <%= ... %> -会直接在这个位置上输出一个PHP表达式的值,比如<%= date('Y-M-d',time())
    %>。注意,表达式后面不需要输入分号。这个表达式的上下文环境是这个模板对应的组件,可以使用$this 变量来在表达式中使用组件。表达式的值在组件的绘制状态时计算。
  • <% ... %> - 代表了一系列PHP的语句。如果它们当中有echo或者print,那么其结果会显示在标签对应的位置。注意,这里PHP语句需要使用分号隔开,和标准的PHP语法是一样的。同样,这里的上下文环境依然是拥有此模板文件的组件。(译者注:很多地方都提到了上下文环境,这个词在有些面向对象的书籍中是这么翻译的,而有时候也被翻译成其他文字。它所指的是当前代码中代表的$this是哪一个组件。因为一个组件中可能包含了其他组件,比如页面中就经常包含了很多组件,那么如果这个模板是这个页面类的,那么我们此时的上下文环境是这个页面。有些时候,比如我们给页面中的某一个组件进行数据绑定的时候,上下文环境就改变成了这个组件,这时候,$this代表了此组件,而不再是页面)。在模板文件中,除了在组件标签范围内,在其他以外的地方可以自由使用其他各种标签。

2.5  总结

  这一节我们来总结一下如何基于PRADO来开发一个Web应用。

  首先需要创建两个文件:应用的入口文件和应用的配置文件。这一部分请参考本手册前面的"Hellow,world!"这个例子。

  对于一个完整的Web应用而言,你还需要创建一个或者多个页面。每一个页面都需要有一个页面类文件,另外可能还需要一个模板文件或者规格文件。在模板文件中,你可以把组件和其他静态文本根据最终需要显示给用户看的样子组织在一起。在规格文件中,可以定义页面的属性,事件和子控件,这些定义可以在模板文件和代码中使用。这两个中都可以设置组件的初始值和指定事件的响应函数。在页面类文件中编写事件响应函数和其他函数。

  有些时候,为了重用代码,你可以定义新的组件。比如你可以定一个SideBar组件来显示用户能看到的菜单,这样在各个页面中就都可以直接使用这个SideBar 组件来显示菜单了。

  PRADO引入了PHP5新的例外处理机制,能够显示堆栈中的错误信息。这样在调试的时候你可以精确的找到什么方法发生了什么错误。

  发布 PRADO 应用则非常简单。框架建议使用相对路径,因此如果你是这么做的话,只需要把包含你的应用的代码拷贝到你想放置的目录中就可以了。

相关文章: