Openbiz 2.0 中文手册(一)

这份文件是openbiz2.0手册. Openbiz1.x的手册在manual11.html

其他链接:openbizeclipse插件设计师手册, openbiz最佳做法

Openbiz 2.0概况

Openbiz 安装

构建openbiz应用

Openbiz 配置指南

  • 层次管理Metadata
  • 使用对象数据继承
  • 简单的表达语言
    • 使用表达式
    • 字符
    • 操作符
    • 变量
    • 函数
    • 实例
  • 配置Bizdataobj
    • 映射Bizdataobj到数据表格
    • Bizdataobj的查询语言
    • Bizfields的数据类型和格式
    • 数据验证
  • 对象关系(O/R)的映射
    • 映射一个表格到一个Bizdataobj
    • 主键(ID)的生成
    • 复合主键的支持
    • 映射多个表格到一个Bizdataobj
    • BizDataObjs中多对一的关系
    • BizDataObjs中一对多的关系
    • BizDataObjs中多对多的关系
  • 配置BizView 和 BizForm
    • BizView - the HTML 网页容器
    • BizForm的基本布局:数据,工具栏及导航栏
    • 映射Bizdataobj到Bizform
    • 以各种不同类型的html元素来表现数据
    • BizForm的事件处理
    • BizForm键盘处理功能
    • BizForm中html元素的互相依赖
    • 配置drilldown连接到另一视图
    • 从组合或列表选择Field数据
    • 控制页面导航
    • 从BizForm导入和导出数据
    • 从BizForm上传文件

Openbiz 开发指南 (另文档)

附录一:第三方库

附录二:Metadata的文档类型定义DTD


Openbiz 2.0概况

Openbiz 2.0是一个metadata驱动的框架. 所有openbiz对象都有自己的metadata文档. Openbiz2.0建筑架构遵循模型-视图-控制器(MVC)的设计模式,它也实现了对象/关系映射.

Openbiz 2.0 架构

Metadata驱动框架

Openbiz的目标是使设计,开发和维护应用软件容易. Openbiz是xml数据驱动框架,即openbiz对象建基于描述他们的数据档案. 建立一个应用意味着设计和开发数metadata文档. 由于自我阐释性标示语言, 应用易于维护. 与此同时由于XML的可扩展性, openbiz是一个可扩展的框架.

下面的图表显示了基于metadata 对象的openbiz框架. 这些对象涵盖大部分功能需求的Web应用开发.

Openbiz对MVC的实施

Openbiz其中一个关键的优势是,它是一个遵循模型-视图-控制器(MVC)的设计模式的框架. This makes Openbiz applications much more manageable because the presentation code (View) is cleanly separated from the application data and logic (Model).这使得Openbiz应用更为可控,因为表现编码(视图)与应用和数据逻辑(模型)分离得十分干净. 所有使用者介面与应用处理都由一个前端控制器控制.

比较Openbiz MVC设计与市场上现有的MVC框架, 如JSF和Struts, Openbiz是比较接近JSF, 因为两者都是基于组件的架构. Openbiz的表述层由bizview, bizform和bizform内部的元件组成. 下表中列出Openbiz实施六大优点(参见相对于Struts, 十大喜欢JSF的理由).

JSF相对于Struts的优势 Openbiz 的实现
Components(部件) BizView 和 BizForm 作为持久的界面对象
Render Kits(渲染包) 连接不同模板到界面对象
Renderers(渲染) 客户类实施Render()方法
Value Binding(值绑定) 支持静态和动态值绑定
Event Model(事件模型) 连接客户端事件到服务器功能
Extensibility(延展性) 开发商可以把自己的类连接到openbiz对象
其他四个.... 不适用

Openbiz实现持久对象和ORM

类似流行的Hibernate的做法, openbiz利用会话(session)来保持对象的持久性. 不像j2ee的web容器有对象池内存, php每个请求对象兴建和释放(这称为不共享架构). 要保持对象的持久性, openbiz持久对象(bizdataobj,bizform...)将对象状态存入session, 然后重建对象. Also to avoid multiple object instances of same class in the same session, openbiz use ObjectFactory to ensure object singleton. 为防止同一类的对象实例在同一session中出现, openbiz使用ObjectFactory以确保对象的单独性.

Openbiz实现了必要的对象/关系映射(ORM)的功能, 允许Bizdataobj代表数据库表和数据库表间的关系. 下表列出Openbiz ORM的特点

灵活的映射 每表有一个对象, 或多表一个对象
多对一, 一对多, 多对多, 一对一
查询设施 象SQL一样的l查询语言, 支持SQL函数和操作符, 支持SQL总计功能,和group by, having and order by
Metadata 设施 XML metadata 描述映射

Openbiz 安全模式

Openbiz支持三种网络安全 - 用户认证, 视图控制和数据访问控制. Openbiz主要用途插件服务以控制安全. 这种方案允许用户插入自己的逻辑来服务. 详情将讨论在开发指南-实施认证,视图和数据存取控制.

用户认证流程:

视图准入控制流程:

安全 openbiz执行插件服务
用户认证 Openbiz利用认证服务(bin/service/authservice.php)认证的用户名和密码
 基于角色的视图出入管制 Openbiz用Profile服务(bin/service/profileservice.php)取得用户信息, 其中包括"角色".
然后用access服务(bin/service/accessservice.php)去查询该角色, 以确定用户的视图权限
基于属性数据存取控制 Openbiz用Profile服务(bin/service/profileservice.php),以取得用户的概况,包括属性.
然后,基于这些属性,以确定对数据记录浏览/更新/删除的许可. 数据访问权限控制在Bizdataobj.

Openbiz 2.0 的结构组织

Openbiz提供一个PHP框架助你建立复杂的网络应用.

OpenBiz设计作为一个多层结构如下图下文.

通常商业应用可分为3层 - 数据层, 商业逻辑层和表现层. 在openbiz结构中, 其中3层映射到3个软件包. 表现层是执行bizview软件包, GUI层是执行jbform的javascript的软件包. 商业逻辑层是执行Bizdataobj软件包. 数据库处理层是通过第三方的包来实现. 插件服务功能,提供服务组件,可援引双方陈述和数据层对象.

Package (包) Class (类)
BizSystem BizSystem
- 提供一个全局变量
- 提供get方法为 ObjectFactory, SessionContext, TypeManager, ClientProxy 和 Configuration类
- 提供静态方法访问xml数据,日志和错误报告.
    
SessionContext
- Session管理类提供更多方法从session中保存/获得metadata驱动对象的状态, 通过其GetsessionVars|SetsessionVars接口
TypeManager
- 格式式管理类提供帮助方法格式化数据到用户界面以及解悉界面的输入数据
ClientProxy
- 它是当作双向代理客户的类. 通过这个类, 其他人可以得到客户输入, 重画客户端或执行客户端的javascript功能.
Configuration
- 这个类提供方法来从config.xml获取数据
BizDataObj BizDataObj
- 它是所有数据对象类的基类. 在openbiz1.2之前它被称为BizObj. 因为bizobj指商务对象,但它作为业务数据单元,所以将它改变为BizDataObj.
BizRecord
- BizRecord类实现对记录的基本功能
BizField
- BizField类是映射到表格column的逻辑单元
BizDataSql
- BizObjSql类为Bizdataobj构建sql语句
ObjRefernces
- ObjReferences包含一组与本BizDataObj相关的其他Bizdataobj
TableJoins
- TableJoins包含一组与本对象连接(join)表格
BizView BizView
- BizView是表单的容器类. 它可被视作html网页.
BizForm
- BizForm是表单的基类. 它是一个html表单, 即包含在一个bizview中.
RecordRow
- RecordRow是FieldControl的容器类
ToolBar
- ToolBar工具条类. 它包含htmlcontrols
NavBar
- NavBar是导航条类. 它包含按钮
HTMLControl
- HTMLControl是html元素的基类
FieldControl
- FieldControl是与bizfield相关的html元素的基类
DisplayMode
- DisplayMode包含bizform显示模式信息
jbForm jbForm (javascript bizForm)
- 客户端处理AJAX的函数调用和回调的基类
ZEND_DB 这是一个抽象的数据库连接方案,可以连接到不同的供应商的所有主要数据库. 它包含于Zend Framework包内.

类图的多层结构

序列图的一个典型AJAX的调用

Openbiz客户端浏览器与服务器通过AJAX调用.


安装Openbiz

运行环境

Openbiz(2.0或更新版本)是基于php5脚本. 我们推荐平台

  • Apache HTTP Server 1.3.x or 2.x + PHP 5.x
  • Internet Information Server (IIS) 5.x + PHP 5.x

安装目录是openbiz,或者你可以配置apache使用别名.

支持浏览器 - IE5.x (或更新版本), Netscape 7.x and Mozillar/FireFox 1.x (或更新版本)

安装openbiz

下载zip文件并解压缩到一个目录下 (under web root).

请翻阅openbiz/bin目录下的sysheader.inc, 和demoapp/bin下的 app.inc.

  • Openbiz 核心路径 " OPENBIZ_HOME " 可被设置于 syshearder.inc 和 app.inc文件中. app.inc中的值先于sysheader.inc中的值.
  • sysheader.inc定义路径第三方php软件包包括 Smarty " SMARTY_DIR ", 和 Adodb " ADODB_DIR " 等等.
  • 应用 home 路径" APP_HOME ", metadata 文件路径 " META_PATH ", 日志文件路径 " LOG_PATH ", session 文件路径 " SESSION_PATH " 和 smarty 模板文件路径 " SMARTY_TPL_PATH " 在app.inc中指明.
  • " DEBUG " 显示是否打印调试信息
  • " CHECKUSER " 检查用户是否登录
  • " TIMEOUT " 是会话超时秒

源代码树结构:

从openbiz2.0rc2中,两个主要的目录包括在软件包. 他们是openbiz核心库和应用演示.

演示应用是一个openbiz的web应用. 因为openbiz提供metadata 驱动架构, bin和metadata 目录是必须的. 其余的目录结构建议,而不是要求. 用户可能有自己的方式来安排web应用结构. 请修改demoapp/bin/app.inc改变常数定义.

正如你观察的bin及metadata结构, 每个bin的子目录下有一个匹配的metadata子目录. 这是代码/metadata匹配原则, 如果你有一个对象的 metadata 在 /metadata/aaa/, 而且对象执行代码是一个用户定义类(不是openbiz核心类), 类代码文件必须在/bin/aaa/目录.

Openbiz 核心库
openbiz_root/ openbiz_root/
---bin/         (openbiz core php source - required)
------service/      (openbiz core service library directory)
---document/     (openbiz documents - optional)
------apidoc/      (openbiz core API)
---medata/      (openbiz metadata files - required)
------service/      (service package)
---others/       (third party libraries - optional)
------adodb/       (adodb package)
------Smarty/      (smarty package)

 

演示应用
demoapp/      (demoapp web pages)
---bin/         (demoapp php source)
------demo/         (demapp demo library)
------shared/       (demoapp shared library)
------service/      (demoapp service library)
---js/           (demoapp javascript files)
---pages/        (demoapp HTML files)
---css/         (demoapp style sheets)
---images/      (demoapp images)
---log/         (demoapp logs)
---medata/      (demoapp metadata files)
------demo/        (demoapp demo package)
------shared/       (demoapp shared package)
------service/      (demoapp service package)
---session      (demoapp session files)
---templates    (demoapp smarty templates files)
------cpl          (demoapp smarty compiled templates)
--- ---cfg          (demoapp smarty configuration files)
---tmpfiles     (temporary files)

In Unix or Linux box, you need to give write permission to web users on log, metadata, session, tmpfiles and templates directories.在unix或linux里, 你需要将可写权限赋予网络用户对日志, 数据, session, tmpfiles和模板目录.

安装必要的第三方软件包

以下软件包是必要的,他们包括在openbiz软件包

我们建议你安装php优化软件包.

开始演示应用

填充演示数据库. 在openbiz根目录寻找gendb.sql, 将它应用到你的数据库.  注意gendb.sql是为mysql数据库的脚本, 请根据不同的数据库类型调整语法.

打开demoapp/clientutil.js. 改变 var binPath = "/demoapp/bin/" ; 到适当的demoapp根下的bin目录. 记得应该是绝对路径, 因此用"/".

打开demoapp/metadata/config.xml, 核实默认数据库正确的属性(如用户名和密码).

然后启动浏览器, 打开http://localhost/demoapp/demo.html

Upgrade guide升级指南

请参阅 http://phpopenbiz.org/document/manual.html#upgrade 

通过SVN获取最新的源代码

请参阅 http://phpopenbiz.org/document/manual.html#svn


构建Openbiz应用

为你的应用提出具体要求

OpenBiz是一个完美的工具来帮助你轻松和全面地开发复杂web应用. 基于其3层结构, 你的应用将有一个很清晰的逻辑模式. 它顾及到了面向数据的应用的基本和先进功能. 为了分辨openbiz是否可以帮助建立你的应用程序, 你需要问这些问题:

  • 你的应用是web基于的应用程序或可转换成基于web的应用?
  • 你的应用是否需要用数据库操纵不同类型的数据?

如果答案是的话, Openbiz就是正确的开发你的应用得的框架,!

计划你的web应用

当你安装Openbiz软件包时, 你会发现在zip文件有两个主要目录"openbiz"和"demoapp". "openbiz"目录包含了核心openbiz程序和metadata.  "demo"目录包含源演示应用(事件管理和日历演示).

上述结构不同于Openbiz RC2.0之前的版本, 在那里你会看到演示应用在openbiz目录里. 为什么openbiz进行了这一转变?

  • 它给开发人员带来了一个清晰的逻辑结构 - openbiz核心库和应用程序代码在不同的目录.
  • Openbiz核心库比openbiz应用更便携式, 它可以被多种应用分享.
  • 如果openbiz核心更新版本, 应用很容易的升级.

在你的目录开发web应用

自己的开发项目 目录
你的源代码 your_app_root/bin/
你的metadata档案 your_app_root/metadata/your_package/
你的网站模板 your_app_root/templates/
你的网页 your_app_root/, your_app_root/pages
你的style sheet文件 your_app_root/css/
你的图像文件 your_app_root/images/
你的日志文件 your_app_root/log/
你们的session档案 your_app_root/session/
你的临时文件 your_app_root/tmpfiles/

这个结构可以帮助你更有组织地开发openbiz web应用. 你的应用的特定文件都是在一个单独的目录,而不是混在openbiz核心档案. 你可以建立多个web应用基于单个openbiz核心. 你需要做一些额外的步骤, 建立了自己的应用程序目录. 我们建议下列步骤.

  1. 拷贝demoapp目录,并命名为你的应用的名字, 比如说"testapp"
  2. 打开 testapp/bin/app.inc, 恰当地改变常量. 如果你可以接受默认值, 不需要改变.
  3. 打开 testapp/bin/login.php, 改变 $application_homepage 到用户登录后显示给用户的首页.

在app.inc档案, OPENBIZ_HOME已被确定为openbiz核心库的安装路径. 你的应用程序将使用openbiz核心库以及在metadata目录的核心对象.

RC2的另一个重要变化是metadata和代码必须分别放在对应的/metadata 和 /bin 目录下. 这是代码/metadata匹配原则, 如果你有一个对象的 metadata 在 /metadata/aaa/, 而且对象执行代码是一个用户定义类(不是openbiz核心类), 类代码文件必须在/bin/aaa/目录. 举例来说, /metadata/shared/FMCalendar.xml具有特殊类"FMCalendar", 这"FMCalendar"类的代码必须位于/bin/shared/FMCalendar.php. 如果对象的执行类是openbiz核心类, 没有特别码, 因此就不用在/bin 下写代码. 这个代码/metadata匹配原则给metadata 和代码一个明确结构.

创建数据库模式

为你的业务数据与关系数据库表建模是你的整个开发的必需的基础建设.

创造一个新的数据库

  • 指定新的数据库为metadata/config.xml的默认数据库
  • 创造"ob_users"表中存储用户名和密码. Since 2.0, openbiz counts on authentication service to authentiate user and password, so the user id and password can be stored in the storage that is queried by the authentication service.自2.0openbiz用认证服务类验证用户名和密码, 所以用户名和密码,可以储存在认证服务查询的数据库里. 
  • 创造"ob_sysids"表, 其中sysid栏为各表的ID栏
  • 每个表必须有一个ID栏, 并在ob_sysids表加上一条纪录(TABLE=你的表的名字, PREFIX=ID的前缀, IDBODY=起始整数)

Use existing database使用现有数据库

  • 指定新的数据库为metadata/config.xml的默认数据库
  • 创造"ob_users"表或重用现有含有用户名和密码栏的表. Ensure that authentication service queries the user id and password on the right table (or source).确保认证服务从正确的表(或来源)查询用户名和密码.
  • 设定IdGeneration 属性为现有ID生成算法. 例如, 如果你的oracle数据库的使用顺序来创造 PK column (主键栏), IdGeneration应为"Sequence:seqname". 细节请参阅本主键栏(ID)生成的章节.

用Openbiz来进行系统设计

用Openbiz的强大功能来进行系统设计. 你的设计将有

  • 明确三层结构栈
  • XML metadata驱动应用
  • MVC (模型-视图-控制器)设计模式
  • 一套丰富的库
  • 常见的应用功能

建立新的应用

业务需求 -> 界面设计+数据建模+对象设计

用户界面:页面, 表单, 人机互动

数据模型:数据库结构设计

对象设计:

  • 界面对象 - Bizview, Bizform
  • 数据对象 - Bizdataobj与对象/关系映射
  • 功能对象-插件服务

转换现有的应用

将现有的界面转换为bizviews, bizforms

将现有的数据库表映射到Bizdataobjs

将现有的业务功能变为插件服务

样本实例 - 日历

请参阅 http://phpopenbiz.org/document/manual.html#bld_sample 


Openbiz配置指南

开发商能选择用XML编辑器编辑metadata文件。Openbiz Eclipse插间被推荐为设计和配置工具。参见Openbiz Eclipse插入设计师指南

由包裹组织metadata

在复杂的应用, 用户也许需要建立许多对象, 因此他们有很长的metadata文件名单。如果他们将这些文件放在一个metadata目录之下, 处理metadata文件是一件痛苦的事。从openbiz 1.1, metadata文件可能由包裹名字组织。记住, metadata包裹是不同的以是代码单位的(BizObj, BizView...)包裹。Metadata包裹是一个命名系统, 不同的包裹地对映于\不同的目录。它是象被使用在Java中的包裹概念。

PackageX.PackageY.metaA.xml 指在META_PATH/PackageA/PackageB目录之下的metaA.xmlMETA_PATH是metadata根目录。这个宏变量被定义在sysheader.inc 和app.inc 。

怎么配置在metadata文件的包裹?

我们解释它以演示例子。在您unzip源码之后, 找到在metadata 目录之下演示目录。用文本编辑程序打开FMRegist.xml 文件。您将看见Package="demo" 属性在BizForm 元素。这个属性将说任一类型缺省包裹openbiz 对象是在"demo" 包裹之下。这里openbiz 对象提到以下对象类型。

目标类型

提到作为属性在metadata文件

BizObj

BizForm[BizObj ]
BizObj->BizFieldList->BizField[SelectBizObj ]

BizForm

BizView->ControlList->Control[Form ]
BizView->ControlList->Control[SubCtrl ]
BizForm->BizCtrlList->BizCtrl[SelectFrom ]

BizView

 

BizPopup

BizForm->BizCtrlList->BizCtrl[SelectBizForm ]

BizFormTree

同BizForm一样

如果对象名不包含小点标志("."), 系统使用定义了在对象根元素包裹属性作为它的包裹。否则, 如果对象名有格式作为aaa.objectname, 系统认为这样的对象在包裹之下"aaa" 并会在aaa 目录之下查找这样的对象。

去回到例子, 您能发现< BizForm Name="FMRegist" Package="demo"... BizObj="BORegist"... >, < BizCtrl Name="reg_attdln"...  SelectBizForm="AttendeePopup"... > 和< BizCtrl Name="reg_fee"... SelectFrom="Selection(Fee)"... > 。他们全都个用途缺省包裹, 因此系统将设法寻找metadata 文件作为 demo/BORegist.xml demo/AttendeePopup.xml demo/Selection.xml

如果您想要提到对象在其它包裹之下, 请增加包裹名字作为对象名的前缀。通知, 有Selection.xml 在/demo 目录之下并且其它Selection.xml 在/design 目录之下, 他们属于不同的包裹。在FMRegist, 包裹是"演示", 您能使用< BizCtrl...  SelectFrom="design.Selection(Mode)" ... > 配置价值是从"design/Selection.xml 的" "方式" 元素的comboBox 。

您无法提到一个对象在另外应用。但您能提到任一个对象在openbiz 核心应用。例如, 核心应用有提到对象在metadata/shared/ 目录之下。Openbiz 设法找出对象同样应用和然后核心应用。如果对象不被发现, 它报告错误。

使用对象metadata继承

如果你有一个非常复杂的应用,你要重用现有对象,以不同的地方,但是你要表现的对象在不同的情况下回有不同,. 继承对象将解决以上问题. 由于openbiz框架的对象映射到metadata数据文件, 继承对象就成为数据文件继承.

怎么指定在metadata 文件之间继承呢?

指定对象属性, InheritFrom = "父母对象名" 。例如, 在演示应用, BOEventX 有< BizObj Name="BOEventX" Description="Event BizObj Extended BOEvent" Package="demo" Class="BizObj" InheritFrom="demo.BOEvent"... > 。这表明是BOEventX 被继承从BOEvent 。 

Metadata 文件继承类似于以类继承在编程语言, 子对象可能继承(如果没定义在子对象, 而且定义在父对象)  或覆盖(如果同样属性被定义在子对象和父对象) 父对象的属性。

能有继承的对象类型 什么可能被继承或覆盖 什么无法被继承- 必须被指定在子metadata 文件中
BizObj 对象属性: 描述, DBName, Table, SearchRule, SortRule, OtherSQLRule, CacheMode

对象BizFieldList: BizField

对象属性: Name, Package, Class, InheritFrom
BizForm 对象属性: Description, jsClass, Title, BizObj, PageSize, Width, Height, SearchRule

Object BizCtrlList: BizCtrl
Object DisplayModes: Mode
Object Toolbar: Control
Object Navbar: Control

对象属性: Name, Package, Class, InheritFrom

简单表达式语言

为了增加metadata 配置的灵活性, Openbiz 在metadata 文件接受简单表达式语言。如果声明有 {expr} 样式, expr 将被评估作为简单的表示。 基本上, 简单表达式是返回值的一个PHP 语句。如果用户需要的复杂逻辑无法被一个简单表达式表示, 他们可将特别代码写在用户定义的类里。

使用表达式

简单表达式将支持metadata 属性动态值捆绑。在metadata 文件中用户能在以下地方使用简单表示。

  • BizDataObj
    SearchRule, SortRule, OtherSQLRule, AccessRule, UpdateCondition, DeleteCondition 。这些属性是询问BizDataObj 元素相关的属性. [ field_name ] 是询问语言的语法, 它将由表格的column 名字替换。请参见 在BizDataObj查询语言 为细节。
  • BizDataObj.BizField
    Required, Validator, Value, DefaultValue 
  • BizForm
    Link, Style, Hidden, Enabled, SelectFrom
  • BizForm.EventHandler
    Function, PostAction

字符

简单表达式语言定义以下字符:

  • 布尔: true, false
  • 整数: 和PHP一样
  • 浮点: 和PHP一样
  • 串: 用单引号和双引号; "是\", ' 是\ ', 并且\ 是\ \ 
  • Null: null

操作

简单表达式语言提供以下操作符:

  • 算术: +, - (binary), *, / 和 div, % 和 mod, - (一元)
  • 逻辑: and, &&, or, ||, not, !
  • 关系: ==,! =, <, >, < =, > = 。
  • 有条件: A? B: C. 根据A 的评估的结果, 评估B 或C。 

变量

  • 简单表达式允许开发商使用openbiz metadata 对象的变量:
得到metadata 对象变量的句法 变量 实现 例子
@object_name:property_name 得到指定的对象的指定的内容 Call object->GetProperty ($propname) @BOEvent:Name
@FMEvent:Title
@object_name:*[child_name].property_name 得到指定的对象的指定的子元素的内容 Call object->GetProperty ($propname), where $propname="*[child_name]", to get the child object. 
Then call child_object->GetProperty($propname)
@BOEvent:Field[Id].Value
@FMEvent:Control[evt_id].Value
@:property_name or 
@this:property_name
得到对象指定的内容 ("本" 对象是被定义在metadata 文件中的对象) Call this->GetProperty ($propname) In BOEvent, @:Name or @this:Name means getting the "Name" property of BOEvent.
@:*[child_name].property_name or
@this:*[child_name].property_name
得到对象的指定的子元素的内容 Call this->GetProperty ($propname), where $propname="*[child_name]", to get the child object. 
Then call child_object->GetProperty($propname)
In BOEvent, @:Field[Id].Value or @this:Field[Id].Value means getting the "Id" field value of BOEvent.
[field_name] 得到BizDataObj 指定的BizField 的值 。  Call object->GetProperty ($field_name) to get the child BizField object. 
Then call field_object->GetProperty("Value")
In BOEvent, [Id] means getting the "Id" field value of BOEvent.
@object_name:param[param_name] or
@:param[param_name]
得到这个对象的指定的参数值 Call object->GetProperty ($propname), where $propname="param[param_name]" @:param[Evt_Id]
@profile:property_name  得到用户概况属性 User profile is provided with ProfileService. @profile:ROLEID

从上述的实现可看出, 如果重写 GetProperty() 方法, 开发商可能增加支持更多属性。GetProperty() 的输入可能是支持由顾客代码的"property_name" 或"* [ child_name ]" 或其他。

简单的表示语言并且允许开发商使用所有全局变量由PHP 支持。请阅读 http://us2.php.net/manual/en/reserved.variables.php 

函数

开发商可以在简单表达式中调用所有PHP 函数。如果包含函数的文件被包括了, 用户定义的函数可能被调用。例如, 如果metadata 对象A 是一个用户类, 类文件是包括A_help.inc 的A.php。在这种情况下, 您能在简单表达式中调用定义在A_help.inc函数。

例子

  • <BizDataObj SearchRule="[Start]>'date(\"Y-m-d\")'">
  • <BizDataObj AccessRule="[OwnerId]='{@profile:USERID}'">
  • <BizDataObj UpdateCondition="[OrgId]=={@profile:ORGID}">
  • <BizDataObj DeleteCondition="'admin'=={@profile:ROLEID}">
  • <BizField Name="NeedApprove" Required="{[Amount]>1500}"/>
  • <BizField Name="Fee" Validator="{[Fee]>=15}"/>
  • <BizField Name="FullName" Value="{[LastName]}, {@:Field[FirstName].Value}"/>

BizDataObj 的配置

BizDataObj xml 的DTD 文件被列出在附录A.1

BizDataObj 对表格映射

Openbiz 映射数据库表格到BizDataObj 对象。这个章节介绍BizDataObj与表格映射的概念, 下个章节"ORM" 有映射的配置的全面详细。BizDataObj 必须有表格名字和表格column 和 BizDataObj fields的映射。

  • 指定基本表格: 

<BizDataObj Name="BizDataObjName" Table="TableName" ...>

  • 映射 Column 到 BizField: 

    <BizField Name="FieldName" Column="ColumnName"....>. BizFields 必须有命名作为"Id" 。这必需"Id" 通常映射到表的主键.

  • 映射 SQL Function 到 BizField: 

    用户能将由数据库引擎提供的SQL function设给BizField。句法是< BizField Name="FieldName" Column= "" SQLExpr="FUNC([FieldName1]... [FieldName2 ]...)"> 。要保证Column属性是空的。例如: < BizField Name="FullName" Column= "" SQLExpr="CONCAT([FirstName ], ' ', [LastName ])"... > 。请注意SQLExpr 是询问相关的属性。[ FieldName ] 是询问语言的句法。

  • 指定BizField 的缺省值:

    <BizField Name="FieldName" Column="ColumnName" DefaultValue="default_value">. 使用DefaultValue 属性, 当dataobject 创造一个新纪录时, 会将缺省值设给BizField。

BizDataObj的查询语言

Openbiz 用户不用担心组成的复杂的SQL 声明。BizDataObj 支持在对象水平更加直观的查询语言。基本的句法是"[FieldName] opr 'Value' AND/OR [fieldName] opr 'Value'...". 这里"opr" 是SQL 操作符。在运行时, openbiz 将[ FieldName ] 改变为column名字而产生SQL 声明。Openbiz 并可以将表格关系放入SQL中。

  • 在SearchRule中指定缺省询问
    例子: <BizObj Name="BOCalendar" Description="Calendar BizObj" Package="shared" Class="MyClass" Table="calevts" SearchRule="[Start]>'1999-10-20'" ...>

  • 在SortRule中指定缺省排序
    例子: <BizObj Name="BOCalendar" Description="Calendar BizObj" Package="shared" Class="MyClass" Table="calevts" SortRule="[Start] ASC" ...>

  • 在OtherSQLRule中指定另外的SQL 声明
    例子: <BizObj Name="BOCalendar" Description="Calendar BizObj" Package="shared" Class="MyClass" Table="calevts" OtherSQLRule = "GROUP BY [EvtId] HAVING [Fee]>10" ...>

BizFields 的数据类型和格式

BizField 支持以下的数据类型和格式。

类型 格式 句法 格式例子
文本 文本是默认类型  
数字 格式由printf 支持 < BizField... Type="Number" Format="%..."... > %5.2f 打印浮点数字
  "Int" - 整数格式(与地点相关) < BizField... Type="Number" Format="Int"... > 如果locale=enu, 12345.678 被显示作为12,346
  "Float" - 浮点格式(与地点相关) < BizField... Type="Number" Format="Float"... > 如果locale=enu, 12345.678 被显示作为12,345.68
日期 在缺省只读方式下, 日期可能根据 数据格式被格式化。 < BizField... Type="Date" Format="date format"... > 6/21/2003 可能被格式化
%A, %b %d %Y - 星期六, 2003 年6月21 日如果系统地点是enu
Datetime 在缺省只读方式下, 日期可能根据 数据格式被格式化。 < BizField... Type="Datetime" Format="datetime format"... > 6/22/2003 9:30am 可能被格式化
%m/%d/%Y %H:%M:%S - 06/22/2003 09:30:00 如果系统地点是enu
货币 格式化(与地点相关) < BizField... Type="Currency" Format="Currency"... > 1456.89 被格式化作为$1,456.89 (enu)
1456.89 被格式化作为F1 456,89 (fra)
电话 格式化(根据指定的mask #) < BizField... Type="Phone" Format="mask string"... > 1234567890 被格式化 
mask=(###) ###-####, 
phone=(123) 456-7890
mask=###-###-####, phone=123-456-7890
  如果一个电话号码从开始"*", 它代表国际电话号码, 它不会被格式化   * 123 4567890 是国际数字
Blob/Clob < BizField... Type="Blob"... >
< BizField... Type="Clob"... >
 

数据检验

检验类型 例子
Required - 表明领域无法是空的 < BizField Name="Name" Required="Y" Column="NAME"/>
Validator - 简单表达式  < BizField Name="Fee" Type="Currency" Format="Currency" Validator="{[Fee]>=15}" Column="FEE" >

对象关系(O/R) 映射

为支持O/R 映射, TableJoin 和ObjectReference 被引入到BizDataObj metadata 文件。

用下面的例子来了解O/R 映射:

attendee:regist = 1:M (一对多), regist:attendee = M:1 (多对一)

events:regist = 1:M (一对多), regist:events = M:1 (多对一)

attendee:events = M:M (多对多)

映射一个表格到BizDataObj

映射表格到BizDataObj, 用户只需要在metadata配置BizFieldList。例如:

<BizDataObj Name="BOEvent" Description="Event BizDataObj" Package="demo" Class="BizDataObj" Table="events" ...>
<BizFieldList>
  <BizField Name="Id" Column="SYSID"/>
  <BizField Name="Name" Column="NAME"/>
</BizFieldList>
</BizDataObj>

主键(Id)的生成

从Openbiz 2.1RC, BizDataObj 支持多种id 生成算法。增加一个BizDataObj 属性
IdGeneration="Openbiz|Identity|Sequence:seqname|GUID|UUID|Other...".

IdGeneration 主键(Primary Key column) 生成方法 支持的数据库类型
Openbiz (default) 用"ob_sysids"表来生成Id. "ob_sysids"存储表格的 PK column. 适用于所有数据库类型
Identity 主关键字专栏由数据库引擎生成。
在SQL 服务器里, Id 叫做"Identity" column, 或在MySQL 叫做"自增" 专栏。
MySQL, SQL Server, Sybase, DB2
Sequence:seqname 主关键字栏由数据库序列生成。"seqname" 是序列名字被使用生成PK 。 Oracle, PostgreSQL, DB2
GUID GUID主关键字栏是数据库生成的GUID MySQL, SQL Server, Oracle
UUID 主关键字栏以php uuid()生成 适用于所有数据库类型
Other Developers can write customer specific Id generation algorithm by modifying function GetNewID(...) in genIdService class under openbiz/bin/service/genIdService.php

开发商能写客户具体Id 生成算法 - 修改在genIdService 组在openbiz/bin/service/genIdService.php 之下的 GetNewID(...) 

由客户决定 

组合关键字支持

In Openbiz 2.1, BizDataObj supports composite key. This feature would be useful when working with legacy database tables who does not have single primary key column. The syntax of BizDataObj whose Id field maps >2 primary key columns is:

在Openbiz 2.1, BizDataObj 支持组合关键字。这个特点会用在老式的没有唯一主关键字栏的数据库系统。BizDataObj 的Id 域映射到>2个主关键字栏. 句法是:

<BizDataObj Name="" Package="" Class="" ... IdGeneration="None">
<BizField Name="fpk1" Column="PK1"/>
<BizField Name="fpk2" Column="PK2"/>
<BizField Name="Id" Column="PK1,PK2" />
...

映射多表到BizdataObj

用户能通过Join映射多表到BizDataObj。这就是说基本表中的外键 (Foreign Key) column指到被Join的表一个column中. 例如, 

<BizObj Name="BORegist" Package="demo" Class="BizObj" Table="regist" ...>
<BizFieldList>
  <BizField Name="Id" Column="SYSID"/>
  <BizField Name="EvtId" Column="EVENT_ID"/>
  <BizField Name="AttendeeId" Column="ATTENDEE_ID"/>
  <BizField Name="AttdLName" Join="attendee" Column="LASTNAME"/>
  <BizField Name="AttdFName" Join="attendee" Column="FIRSTNAME"/>
</BizFieldList>
<TableJoins>
  <Join Name="attendee" Table="attendee" Column="SYSID" ColumnRef="ATTENDEE_ID" JoinType="INNER JOIN"/>
</TableJoins>

Join 属性 描述
Name join 的名字.
Table joined 表名
Column joined column 名字
JoinRef 如果JoinRef 是空的, 被joined表连到基本表。用户能指定JoinRef 在2 级 join。
ColumnRef ColumnRef 指到基本表的column (或 JoinRef 表). 
JoinType INNER JOIN, LEFT JOIN, RIGHT JOIN, or FULL OUTER JOIN.

询问SQL类似于 "SELECT ... FROM BaseTable INNER JOIN JoinedTable ON BaseTable.ColumnRef=JoinedTable.JoinedColumn ...". 在上述例子, SQL 是 

SELECT T0.SYSID, T0.EVENT_ID, T0.ATTENDEE_ID, T1.LASTNAME, T1.FIRSTNAME 
FROM regist as T0
         INNER JOIN attendee as T1 ON T0.ATTENDEE_ID = T1.SYSID

- 关于JoinRef更多解释

JoinRef 支持 cascade-join. 例如, 表 A join B, 表 B join C. 表 A 和 C 通过 B join在一起. User 可能使用以下的方式连接C 和A 。

<TableJoins>
<Join Name="join_b" Table="B" Column="B_PK" ColumnRef="A_FK_B" JoinType="LEFT OUTER JOIN"/>
<Join Name="join_c" Table="C" JoinRef="join_b" Column="C_PK" ColumnRef="B_FK_C" JoinType="LEFT OUTER JOIN"/>
</TableJoins>

在BizDataObjs 之间多对一关系

在二个表之间多对一关系意味着表1 包含一个column 指向表2 的 key/unique column。映射在二个BizDataObjs 之间这样的关系, 要用在ObjectReference 部分定义的一个对象。例如, 

<BizObj Name="BORegist" Package="demo" Class="BizObj" Table="regist" ...>
<BizFieldList>
  <BizField Name="Id" Column="SYSID"/>
  <BizField Name="EvtId" Column="EVENT_ID"/>
  <BizField Name="AttendeeId" Column="ATTENDEE_ID"/>
  <BizField Name="AttdLName" Join="attendee" Column="LASTNAME"/>
  <BizField Name="AttdFName" Join="attendee" Column="FIRSTNAME"/>
</BizFieldList>
<TableJoins>
  <Join Name="attendee" Table="attendee" Column="SYSID" ColumnRef="ATTENDEE_ID" JoinType="INNER JOIN"/>
</TableJoins>
<ObjReferences>
  <Object Name="BOEvent" Description="" Relationship="M-1" Table="events" Column="SYSID" FieldRef="EvtId"/>
</ObjReferences>

</BizObj>

对象 属性 描述
Name 被提到的BizDataObj 的名字
Description  
Relationship dataobj 之间的关系
Table 被提到的dataobj的表
Column 被提到的dataobj的表的column 
FieldRef 基本表中映射到 foreign key column 的 field 

从父dataobj调用GetRefObject($objame) 可以得到ObjReference 中的对象. 

在BizDataObjs 之间一对多关系

在二个表之间一对多关系意味着表2 包含一个 column 指向表1 的 key/unique column。映射在二个BizDataObjs 之间这样的关系, 要用在ObjectReference 部分定义的一个对象。例如, 

<BizDataObj Name="BOEvent" Description="Event BizDataObj" Package="demo" Class="BizDataObj" Table="events" ...>
<BizFieldList>
  <BizField Name="Id" Column="SYSID"/>
  <BizField Name="Name" Column="NAME"/>
</BizFieldList>
<ObjReferences>
  <Object Name="BORegist" Description="" Relationship="1-M" Table="regist" Column="EVENT_ID" FieldRef="Id" CascadeDelete="Y"/>
</ObjReferences>

</BizDataObj>

Object Attribute Description
Name 被提到的BizDataObj 的名字
Description  
Relationship dataobj 之间的关系
Table 被提到的 dataobj的表
Column 被提到的 dataobj的表的 column. 该 column 包含指到基本表中的 foreign key
FieldRef 基本表中映射到 foreign key column 的 field 
CascadeDelete 表明是否在基本表里删除一个纪录将导致在被提到的表里所有相关纪录的删除。

从父dataobj调用GetRefObject($objame) 可以得到ObjReference 中的对象. 

- 在BizDataObjs 之间一对一关系

一对一关系是多对一关系的一种特殊情况

在BizDataObjs 之间多对多关系

在二个表之间多对多关系意味着一个 intersection 表 (又叫作 cross reference table, 或 correlation table) 包含指向表1和表2的 key/unique columns. 映射在二个BizDataObjs 之间这样的关系, 要用在ObjectReference 部分定义的一个对象。例如,

<BizDataObj Name="BOEvent" Description="Event BizDataObj" Package="demo" Class="BizDataObj" Table="events" ...>
<BizFieldList>
  <BizField Name="Id" Column="SYSID"/>
  <BizField Name="Name" Column="NAME"/>
</BizFieldList>
<ObjReferences>
  <Object Name="BOAttendee" Description="" Relationship="M-M" Table="attendee" Column="SYSID" FieldRef="Id" CascadeDelete="Y"
XTable="regist" XColumn1="EVENT_ID" XColumn2="ATTENDEE_ID"/>
</ObjReferences>

</BizDataObj>

Object Attribute Description
Name 被提到的BizDataObj 的名字
Description  
Relationship dataobj 之间的关系
Table 被提到的 dataobj的表
Column 被提到的 dataobj的表的 column. 该 column 包含指到基本表中的 foreign key
FieldRef 基本表中映射到 foreign key column 的 field 
CascadeDelete 表明是否在基本表里删除一个纪录将导致在被提到的表里所有相关纪录的删除。
XTable intersection 表名
XColumn1 指到基本表foreign key 的 intersection 表 column
XColumn2 指到被提到基本表foreign key 的 intersection 表 column
XDataObj (New in 2.1) BizDataObject - 它的基本表是 intersection table (XTable). 

从父dataobj调用GetRefObject($objame) 可以得到ObjReference 中的对象. 

BizView 和BizForm 配置

BizView metadata DTD 文件可能被发现在附录A.2 。

BizForm metadata DTD 文件可能被发现在附录A.2 。

BizView - HTML页面容器

BizView 是包含多个BizForms 和其它HTML 元素的物理网页。它的布局根据smarty 模板 。BizView 定义BizForms 布局并且关系在BizForms 之间。

- BizForms 显示BizDataObj 关系

如果超过一个BizForm 被安置在BizView 并且在BizView指定他们的父子关系, BizForms 将回显示BizDataObj 的关系。

<BizView Name="EventView" ...>
<ControlList>
  <Control Name="fm_event" Form="FMEvent" SubCtrls="FMAttendeeChild"/>
  <Control Name="fm_attd" Form="FMAttendeeChild"/>
</ControlList>
</BizView>

SubCtrls 属性句法是 SubCtrls="childform1_name;childform2_name;...".它告诉子form 其父form 的名字, 这意味子form数据根据父form 的变动而改变。

由于BOEvent 和BOAttendee 有多对多关系,  event form 和 attendee form 将是M-M 的关系。他们在用户界面显示数据关系。

- Event View 例子:

EventView (Event-Attendee as M-M)

FMEvent as BizForm
 |-- BOEvent as BizDataObj
FMAttendeeChild as BizForm
 |-- BOAttendee as BizDataObj

基本BizForm 布局: 数据、工具栏和导航条

Openbiz BizForm 可分成三部份 - 数据部分、工具栏和导航条。

  • 数据部分是显示数据的区域。它可能被显示列单, 表单, 树等等。
  • 工具栏包含了BizForm 控制, 用户能从这些控制调用命令。
  • 导航条可以控制数据navigation 譬如换页, 卷动等。

这BizForm 的样品布局:

工具栏                                     导航条

数据部分

由BizForm表现BizDataObj 

BizForm 代表数据从BizDataObj 。BizForm 定义在BizForm中的BizCtrls 和在BizDataObj中的BizFields 之间的映射。例子,

<BizForm Name="FMRegist" ... BizObj="BORegist" ...>
<BizCtrlList>
  <BizCtrl Name="reg_id" FieldName="Id" DisplayName="Registration Id"/>
  <BizCtrl Name="reg_evtid" FieldName="EvtId" DisplayName="Event Id"/>
  <BizCtrl Name="reg_attdid" FieldName="AttendeeId" DisplayName="Attendee Id"/>
  <BizCtrl Name="reg_attdfn" FieldName="AttdFName" DisplayName="First Name"/>
  <BizCtrl Name="reg_attdln" FieldName="AttdLName" DisplayName="Last Name"/>
</BizCtrlList>
</BizForm>

以各种各样的HTML 元素表现数据

HTMLControl 或BizCtrl 可以指定元素类型和属性来, 以各种各样的HTML 元素表现它的数据。HTML 元素被显示在edit/query 模式下

BizForm 中 HTMLControl 元素属性

Type Width Height HTMLAttr* Style** SeclectFrom Caption Image 评论
Text x x x
Limit the input length
x       文本输入。默认类型
Textarea x x x x       多行的文本输入
RichText x x x x       Rich text editor edit HTML source
ListBox x x x
Show ListBox or ComboBox
x x
Set list of values
    ListBox or ComboBox
CheckBox x x x x x
Set True value
    复选框
Radio x
Arrange radio list 
x x x x
Set list of values
    Radio 按钮
HTMLButton x x x x   x   标准HTML 按钮
SubmitButton x x x x   x   标准HTML Submit 按钮
ResetButton x x x x   x   标准 HTML Reset  按钮
Password x x x x       HTML password
Button x x x x   x x OpenBiz 图象按钮
Date x x x x       Textbox with date picker icon
Datetime x x x x       Textbox with datetime picker icon
HTMLBlock x x   x   x
Special Characters
   HTML block
File x x x x       文件控制上装文件

* HTMLAttr 域可包含任一个合法的HTML 元素类型的HTML 属性

** Style 域可包含所有合法的样式 (css)

Limit the input length: 

HTMLAttr="maxlength=N" 限制用户能输入在文本控制字符的最大数字

Show ListBox or ComboBox: 

由缺省展示comboBox 。如果HTMLAttr="size=N", 显示N 列listbox

Set list of values: 

SelectFrom="XmlFile(Key)" 意味控制是listbox 或radio button. 数据是在XmlFile文件中所有的"Key" 元素

Set True value: 

SelectFrom="Value" 意味这当用户检查复选框时, 复选框返回"Value"

Arrange radio list: 

By default the radion buttons are arranged horiztionally. If Width="1", you can force them arranged vertically.

缺省radio 按钮横向安排。如果Width="1", 您可能迫使他们垂直安排了

Special characters:

在 HTML block 使用"<" and ">" , 必须由"&lt;" 和 "&gt;"替换。参见 http://www.w3schools.com/html/html_entities.asp 以获得详情。

Rich text editor

Openbiz rich text editor 主要使用Kevin Roth http://www.kevinroth.com/rte/demo.htm的代码 (LGPL license) . 感谢他的优秀工作。它支持IE5.5+ 并且Firfox 1.x. 如下是screenshot 。

Date/Datetime picker

Openbiz 2.1 使用由dynarch.com 提供的开放源码DHTML calendar 1.0 (LGPL) . DHTML calendar 的文档资料在 http://www.dynarch.com/demos/jscalendar/doc/html/reference.html. 多谢 Nik Chankov 帮助集成的openbiz 与 DHTML calendar. Openbiz 使用系统样式日历

BizCtrl 另外的属性

  • FieldName - BizDataObj 的BizField 名字
  • DisplayName - BizField的标签, 可显示为表栏头
  • Link - 在READ显示方式之下, 控制的超链接. 一个例子: <BizCtrl Name="LName" FieldName="LastName" Link="a valid relative or absolute url"/>. 用户将看到 姓(即 Wilson) 链接 url.
  • DrilldownLink - 参见"配置drilldown 链接"
  • Sortable - 表明该领域是否可以排序
  • Order - BizCtrls 顺序
  • ValuePicker - 参见"配置BizCtrl 显示popup"

BizForm的事件处理 

当HTML 元素可能触发象onclick 和onblur的事件, 我们可以将事件处理函数联系各HTML 控制或BizCtrl 的事件。事件处理被定义在以下句法。

<Control Name="ControlName" Type="ControlType">
   <EventHandler Name="ehName" Event="eventName" Function="..." FunctionType="..." PostAction=""/> +
</Control>

可以联系更多的事件处理函数到一个控制上。这是一个在2.1的新特点。在Openbiz 2.0, 一控制可能有只一个事件处理函数。2.1, 函数和FunctionType 属性从控制元素被移动到控制元素的EventHandler 元素中。

- Event 是HTML 元素事件名字。参见 http://www.w3.org/TR/REC-html40/interact/scripts.html, 18.2.3 Intrinsic events。

- Function 服务器端应该有一个对应的BizForm 方法。当请求达到BizController, 它会调用正确的BizForm 方法。如果方法不存在, 错误返回。Function 的句法:

  <EventHandler ... Function="objectName.methodName(arg1, arg2...)" .../>. 

ObjectName 可能是空的, 这意味它调用当前的BizForm 方法。例如, < EventHandler... Function="SaveRecord()".../>. 用户能只调用基于metadata 文件对象的方法。这些对象包括BizForm 、BizDataObj 、BizView 和PluginService 。BizForm 方法和PluginService 方法被推荐为从客户端可调用的方法。

- FunctionType 可能是 RPC 或 Page 或 Form 或 Popup.

FunctionType 解释 例子
RPC 方法在服务器端由HTTPRequest (AJAX)调用 。RPC 是缺省值 New record button:
<Control Name="btn_new" Function="NewRecord()" FunctionType="RPC"/>
Page 方法在服务器端由页刷新调用, Form数据不传到服务器端 Export button to bring up a file save dialog in the page
<Control Name="btn_export" Function="CallService(ioService,exportXML)" FunctionType="Page"/>
Form 方法在服务器端由Form submission调用 Save button when there's file to upload in the form:
<Control Name="btn_save" Function="SaveRecord()" FunctionType="Form"/>
Popup 方法在服务器端调用, 返回的页被画在一个弹出式窗口中 Excel output button to show excel format in a popup:
<Control Name="btn_excel" Function="CallService(excelService,renderHTML)" FunctionType="Popup"/>

- ShortcutKey 将一个热键联系到函数。 "在BizForm键盘航海"会有解释 。

- PostAction 在函数调用之后, 重定向到page/view 。"控制页面航海"会有解释

BizForm的键盘导航

Openbiz 2.1RC 增加一个非常重要特点- 支持BizForm键盘导航。一旦热键被定义在BizForm, 用户能使用键盘对浏览纪录和页, create/edit/delete 纪录。

热键被定义在BizForm metadata 文件。控制的EventHandler 的ShortcutKey 属性可以将热键和函数联系在一起。句法是<Control Name="" Function="" ShortcutKey="key_combination".../> 。BizForm 只认可被定义在工具栏和Navbar 控制上的热键。

Openbiz 认可的热键包括:

输入的键 使用在ShortcutKey 属性中键的名字 
0,1,...9 0,1,...9
a,b,...z or A,B,...Z A,B,...Z
Ctrl key Ctrl
Shift key Shift
Alt key Alt
Enter key Enter 
Escape key Escape
Page up key PageUp
Page down key PageDown
Left arrow key Left
Right arrow key Right
Up arrow key Left
Down arrow key Down
Insert key Insert
Delete key Delete

开发商可能配置Ctrl 并且/或者 Shift 并且/或者 Alt 和其它键, 用"+" 连接他们。注意不要与缺省浏览器热键冲突。参见 http://www.mozilla.org/support/firefox/keyboard 为不同的浏览器的热键。

参见在demoapp/metadata/demo/FMEvent.xml 的热键例子。这个BizForm 支持以下热键:

热键 执行命令
Ctrl+Shift+Right go to next page
Ctrl+Shift+Left go to previous page
Ctrl+Shift+Down go to next record
Ctrl+Shift+Up go to previous record
Ctrl+Shift+N create a new record
Ctrl+Shift+E edit the selected record
Delete delete the selected record
Ctrl+Shift+Q switch to search record mode
Enter run search, or save record
Escape cancel search or cancel editing
Ctrl+Shift+C copy the selected record
Ctrl+Shift+R refresh form with default query

Form 控制的相互依赖

以复杂Form 中, 有通常一些控制依靠其它控制的值。当父控制变化, 它的子控制相应地变化。这是所谓的Form 控制的相互依赖。

在表示语言帮助下, 控制关系可被指定在BizForm metadata 文件中。在event handler帮助下, 在父控制变化事件将导致它的子控制的动态变动。

在demoapp/metadata/demo/FMFieldDepTest.xml 之下用一个例子

第一combobox 是主控制。根据它的值,
- 第2 控制将使能被enabled 或 disabled (BizForm 配置)
- 第3 控制将掩藏或将被显示 (BizForm 配置)
- 第4 控制将有不同的名单 (BizForm 配置)
- 第5 控制将改变价值和颜色当monuseover 第主控制时 (客户端 jbForm 的子类)

用来选择记录的popup BizForm 的配置

用户能从一个另外Form中选择纪录 (见以下例子):

  • 加/更改子纪录(父子是M-1关系) 。
  • 选择一个现有的子纪录, 加入到子Form中(父子是M-M关系) 
  • 在被joined域上, 从被joined的dataobj 中选择一个纪录。

有二种方式配置记录选择的popup BizForm 。

  • 配置HTML 控制显示popup

配置HTML 控制显示popup 形式, 用户在控制功能属性设置"showpopup($popupFormName)" 和FunctionTarget="Popup" 。这种配置可能被使用来在子Form中选择子纪录(M-1或M-M关系) 。

<Control Name="btn_new" Caption="Add" Type="Button" Function="ShowPopup(demo.FMAttendeePopup)" FunctionTarget="Popup"/>

On the popup form, add a button to call AddToParent() to add the current selected record to the parent form (the form trigger the popup). 

在popup form, 增加一个按钮来调用AddToParent(), 选择的纪录到父form 。

  • 配置BizCtrl 显示popup

配置BizCtrl 显示popup 从, 用户ValuePicker 属性

<BizCtrl Name="reg_attdln" FieldName="AttdLName" DisplayName="Last Name" ValuePicker="FMAttendeePopup"/>

在popup form, 增加一个按钮来调用JoinToParent(), 选择的纪录到父form 。

  • 为BizCtrl配置自动记录选择器

You can user ValuePicker attribute to allow users to click the icon to show the picker popup window. Users may want to type in the value in the control and system will automatically pick the right record according to the user input. Openbiz supports this feature by BizForm's AutoPickValue($ctrlname) method. To configure auto picker.

您能用ValuePicker 属性允许显示用户选择器popup 窗口。用户也许想要在控制键入值并且系统自动地根据用户输入选择正确的纪录。Openbiz 由BizForm 的autopickvalue($ctrlname) 方法支持这个特点。配置自动选择器。

<BizCtrl Name="reg_attdln" FieldName="AttdLName" DisplayName="Last Name" ValuePicker="FMAttendeePopup">
   <EventHandler Name="onchange" Event="onchange" Function="AutoPickValue(reg_attdln)" />
</BizCtrl>

根据用户输入, 行为被描述在以下表格:

用户输入 行为
not 空  以 [field] LIKE 'input_value%' 的 searchRule 来查询 valuepicker BizForm 的 DataObj. 根据询问结果:

  • 如果唯一纪录返回了, 以返回值自动填入所有相关控制中
  • 如果纪录没有返回, 显示没有searchRule的值选择器popup
  • 如果多个纪录返回了, 显示加上searchRule的值选择器popup

配置drilldown 链接对其它 view

您能配置BizCtrl 与一个链接(drilldown 链接), 这个链接指到其他的view。

在BizForm, 设置BizCtrl 的一个DillDownLink 属性。句法是

DrillDownLink="OtherView,OtherBizForm.OtherBizCtrl=MyBizCtrl".
OtherView - drilldown 链接指到其他的view的名字
OtherBizForm - 在OtherView中的一个独立BizForm, 不是其他BizForm 的子form
OtherBizCtrl -  OtherBizForm 的一个 BizCtrl
MyBizCtrl - 该BizForm 的一个 BizCtrl 

例子: <BizCtrl Name="reg_attdln" FieldName="AttdLName" DisplayName="Last Name" ValuePicker="FMAttendeePopup" DrillDownLink="AttendeeView,FMAttendee.attd_id=reg_attdid"/>.

从comboBox 或ListBox选择域数据

- 捆绑静态列表和comboBox

在您的BizForm, 您为BizCtrl设置SelectFrom="Selection(Fee)", 意味这comboBox域控制的数据是Selection.xml 文件"Fee" 元素的列表 。请在演示FMRegist.xml中参见例子 - BizCtrl reg_fee 被定义为comboBox。
<Selection>
  <Fee Value=""/>
  <Fee Value="15"/>
  <Fee Value="20"/>
</Selection>

并且, 您能给值和文本。如果只给值, openbiz 使用值作为显示文本。
<Selection>
   <ChartOption Value="AAA" Text="BarLine Chart"/>
   <ChartOption Value="BBB" Text="Pie Chart"/>
   <ChartOption Value="CCC" Text="GroupBar Chart"/>
</Selection>
您能选择的您自己的xml 文件。

-  捆绑动态列表(Table column) 和comboBox

在您的BizForm, 您为BizCtrl设 SelectFrom="BizDataObjName[BizFieldName ]" , 这意味comboBox 绑定了BizObjName 中BizFieldName 对应的 table column。避免同样的值出现在comboBox, 您需要确定BizObj 询问返回归一张独特的list。

Openbiz 也支持格式 SelectFrom="BizDataObjName[BizFieldName4Text:BizFieldName4Value ]" 。这样一来用户能在comboBox 中显示BizFieldName4Text 为文本, 而BizFieldName4Value 为值。

SearchRule 可以用在SelectFrom 中, 句法为 SelectFrom="BizDataObjName[BizFieldName4Text:BizFieldName4Value ], SearchRule_of_the_BizDataObj"。例如, <BizCtrl Name="" ... SelectFrom="BOEvent[Name], [Name] LIKE '%Soc%'"/>.

控制页面流程

Openbiz 有显示方式的一个独特的概念。BizForm 可能有超过一个显示方式。各个显示方式基本上是BizForm 的rendering 方式。Bizform 对BizDataObj 数据对用不同的显示方式显示.

- BizForm的显示方式

显示方式被指定在< BizForm metadata 文件的DisplayModes > 部分。您能将各个方式同smarty 模板联系在一起。为细节参见 创建 view 和 form web templates.。

通常BizForm 可能有READ, NEW, EDIT, QUERY 显示方式。但显示方式没有限制。例子是在/demoapp/metadata/shared/FMCalendar.xml 之下。它有显示方式"LIST", "DAY", "WEEK", "MONTH"。

在显示方式之间切换需要调用BizForm 方法setdisplaymode($mode)。代码在各个显示方式被运用时可实现特别逻辑。

各控制或BizCtrl 有DisplayMode 属性。您能设置DisplayMode = "MODE1|MODE2|... "。例如, < BizCtrl Name="LastName"... DisplayMode="EDIT|NEW"/>, 然后LastName 只被显示在EDIT 和NEW 模式。

- 在action 被执行后进行页面重定向

It's very common that users click on a button to trigger an action on server side and after the action is finished the page is redirected to another page. Page redirection can be specified as a post action in BizForm metadata file. The syntax is

用户点击按钮在服务器端触发一次action 并且在action 被执行后进行页面重定向, 这是非常普遍的。页面重定向可被指定在BizForm metadata 文件的post action中。句法是

<EventHandler Name="..." Function="..." PostAction="url|view"/> PostAction 可接受 url:url_string view:view_name.

例子在 login form demoapp/metadata/shared/FMAuth.xml

<Control Name="btn_submit" Image="" Caption="Submit" Type="HTMLButton" Function="Login()" PostAction="url:login.php?login=success"/>

- 错误页和错误信息

如果执行中有错误, 应用会返退错误页或显示错误弹出窗口到浏览器

BizForm中的输入和输出 (Import and Export)

数据输入和输出的支持对离线用户很重要。离线用户通常在他们的膝上计算机执行应用在, 然后再与服务器数据库进行同步。Openbiz 提供的输入和输出支持用以下方式:

Data export - implemented in exportXML method of ioService. The exported xml file has format as 

数据输出 - 被实施在ioService exportXML 方法。被输出文件是xml 格式 

<BizDataObj Name="demo.BOAttendeeX">
  <Record>
   <Field Name="field name" Value="field value" /> *
  </Record>
</BizDataObj>

数据输入 - 被实施在ioService importXML 方法。xml 文件输入有如上所述同样格式。

输入和输出按钮被配置在FMAttendee form 中。输入按钮直接地调用ioService 的exportXML 方法, 而输出按钮则弹出一个popup 窗口来问用户被输入的文件名。细节请参见demoapp/metadata/demo/FMAttendee.xml。

可以增加更多export/import 方法在ioService 支持以其它文件类型。

从BizForm上载文件

文件上载的支持在openbiz shared 包裹里。Metadata 文件在demoapp/metadata/shared/FMAttachment.xml, 它的类文件在demoapp/bin/shared/FMAttachment.php 。

上载文件, 用户需要配置BizCtrl 类型为"File" 。它映射对BizField 类型为"Blob" 。

下载文件, 用户需要配置BizCtrl 的Function 为download($record_id) 。下载方法被实施在FMAttachment 类。

参见FMAttachement 类和metadata 为细节。


Openbiz 开发指南

请参阅Openbiz开发指南


附录 A - 第三方库

库名 URL 描述 License
Smarty  http://smarty.php.net 模板引擎 LGPL
Adodb http://adodb.sourceforge.net  数据库抽象库 BSD
PHPMailer http://phpmailer.sourceforge.net  电子邮件 LGPL
jsval http://jsval.fantastic-bits.de  客户端数据有效性验证 LGPL
jscalendar http://www.dynarch.com/projects/calendar  DHTML 日历 LGPL
RTE http://www.kevinroth.com/rte/demo.htm  Rich Text 文本编辑 free
dompdf http://www.digitaljunkies.ca/dompdf  html 到 pdf 转f换器 free

附录 B - metadata DTD 文件

BizDataObj metadata DTD 文件

<!--OpenBiz BizObj metadata DTD-->

<!ELEMENT BizObj (BizFieldList, TableJoins, ObjRefernces, Parameters) >
<!ATTLIST BizObj Name CDATA #REQUIRED >
<!ATTLIST BizObj Description CDATA #REQUIRED >
<!ATTLIST BizObj Package CDATA #IMPLIED >
<!ATTLIST BizObj Class CDATA #REQUIRED >
<!ATTLIST BizObj InheritFrom CDATA #IMPLIED >
<!ATTLIST BizObj DBName CDATA #IMPLIED >
<!ATTLIST BizObj Table CDATA #REQUIRED >
<!ATTLIST BizObj SearchRule CDATA #IMPLIED >
<!ATTLIST BizObj SortRule CDATA #IMPLIED >
<!ATTLIST BizObj OtherSQLRule CDATA #IMPLIED >
<!ATTLIST BizObj AccessRule CDATA #IMPLIED >
<!ATTLIST BizObj UpdateCondition CDATA #IMPLIED >
<!ATTLIST BizObj DeleteCondition CDATA #IMPLIED >

<!ATTLIST BizObj CacheMode CDATA #IMPLIED >

<!ELEMENT BizFieldList (BizField+) >
<!ELEMENT BizField EMPTY >
<!ATTLIST BizField Name CDATA #REQUIRED >
<!ATTLIST BizField Class CDATA #IMPLIED >
<!ATTLIST BizField Join CDATA #IMPLIED >
<!ATTLIST BizField Column CDATA #REQUIRED >
<!ATTLIST BizField SQLExpr CDATA #IMPLIED >
<!ATTLIST BizField Type CDATA #IMPLIED >
<!ATTLIST BizField Format CDATA #IMPLIED >
<!ATTLIST BizField Required CDATA #IMPLIED >
<!ATTLIST BizField Validator CDATA #IMPLIED >
<!ATTLIST BizField DefaulValue CDATA #IMPLIED >
<!ATTLIST BizField Value CDATA #IMPLIED >
<!ATTLIST BizField OnAudit CDATA #IMPLIED >
<!ELEMENT TableJoins (Join+) >
<!ELEMENT Join EMPTY >
<!ATTLIST Join Name CDATA #REQUIRED >
<!ATTLIST Join Table CDATA #REQUIRED >
<!ATTLIST Join Column CDATA #REQUIRED >
<!ATTLIST Join JoinRef CDATA #IMPLIED >
<!ATTLIST Join ColumnRef CDATA #REQUIRED >
<!ATTLIST Join JoinType CDATA #REQUIRED >

<!ELEMENT ObjReferences (Object+) >
<!ELEMENT Object EMPTY >
<!ATTLIST Object Name CDATA #REQUIRED >
<!ATTLIST Object Description CDATA #IMPLIED >
<!ATTLIST Object Relationship CDATA #REQUIRED >
<!ATTLIST Object Table CDATA #REQUIRED >
<!ATTLIST Object Column CDATA #REQUIRED >
<!ATTLIST Object FieldRef CDATA #REQUIRED >
<!ATTLIST Object CascadeDelete CDATA #IMPLIED >
<!ATTLIST Object XTable CDATA #IMPLIED >
<!ATTLIST Object XColumn1 CDATA #IMPLIED >
<!ATTLIST Object XColumn2 CDATA #IMPLIED >

<!ELEMENT Parameters (Parameter+) >
<!ELEMENT Parameter EMPTY >
<!ATTLIST Parameter Name CDATA #REQUIRED >
<!ATTLIST Parameter Value CDATA #IMPLIED >
<!ATTLIST Parameter Required CDATA #IMPLIED >
<!ATTLIST Parameter InOut CDATA #IMPLIED >

BizView metadata DTD file.

<!--OpenBiz BizView metadata DTD-->

<!ELEMENT BizView (ControlList, Parameters) >
<!ATTLIST BizView Name CDATA #REQUIRED >
<!ATTLIST BizView Description CDATA #REQUIRED >
<!ATTLIST BizView Package CDATA #IMPLIED >
<!ATTLIST BizView Class CDATA #IMPLIED >
<!ATTLIST BizView Template CDATA #IMPLIED >

<!ELEMENT ControlList (Control+) >
<!ELEMENT Control EMPTY >
<!ATTLIST Control Name CDATA #REQUIRED >
<!ATTLIST Control Form CDATA #REQUIRED >
<!ATTLIST Control SubCtrls CDATA #IMPLIED >

<!ELEMENT Parameters (Parameter+) >
<!ELEMENT Parameter EMPTY >
<!ATTLIST Parameter Name CDATA #REQUIRED >
<!ATTLIST Parameter Value CDATA #IMPLIED >
<!ATTLIST Parameter Required CDATA #IMPLIED >
<!ATTLIST Parameter InOut CDATA #IMPLIED >

BizForm metadata DTD 文件

<!--OpenBiz BizForm metadata DTD-->

<!ELEMENT BizForm (BizCtrlList, DisplayModes, Toolbar, Navbar, Parameters) >
<!ATTLIST BizForm Name CDATA #REQUIRED >
<!ATTLIST BizForm Description CDATA #REQUIRED >
<!ATTLIST BizForm Package CDATA #IMPLIED >
<!ATTLIST BizForm Class CDATA #REQUIRED >
<!ATTLIST BizForm InheritFrom CDATA #IMPLIED >
<!ATTLIST BizForm jsClass CDATA #REQUIRED >
<!ATTLIST BizForm Title CDATA #REQUIRED >
<!ATTLIST BizForm BizDataObj CDATA #REQUIRED >
<!ATTLIST BizForm PageSize CDATA #REQUIRED >
<!ATTLIST BizForm SearchRule CDATA #IMPLIED >

<!ELEMENT BizCtrlList (BizCtrl+) >
<!ELEMENT BizCtrl (EventHandler+) >
<!ATTLIST BizCtrl Name CDATA #REQUIRED >
<!ATTLIST BizCtrl Class CDATA #IMPLIED >
<!ATTLIST BizCtrl FieldName CDATA #IMPLIED >
<!ATTLIST BizCtrl DisplayName CDATA #IMPLIED
>
<!ATTLIST BizCtrl Type CDATA #IMPLIED >
<!ATTLIST BizCtrl Width CDATA #IMPLIED >
<!ATTLIST BizCtrl Height CDATA #IMPLIED >
<!ATTLIST BizCtrl HTMLAttr CDATA #IMPLIED >
<!ATTLIST BizCtrl Link CDATA #IMPLIED >
<!ATTLIST BizCtrl Image CDATA #IMPLIED >
<!ATTLIST BizCtrl Hidden CDATA #IMPLIED >
<!ATTLIST BizCtrl Enabled CDATA #IMPLIED >

<!ATTLIST BizCtrl Sortable (Y|N) "" >
<!ATTLIST BizCtrl Order CDATA #IMPLIED >
<!ATTLIST BizCtrl Style CDATA #IMPLIED >
<!ATTLIST BizCtrl ValuePicker CDATA #IMPLIED >
<!ATTLIST BizCtrl SelectFrom CDATA #IMPLIED >
<!ATTLIST BizCtrl DrillDownLink CDATA #IMPLIED >
<!ATTLIST BizCtrl DisplayMode CDATA #IMPLIED >

<!ELEMENT Toolbar (Control+) >
<!ELEMENT Navbar (Control+) >
<!ELEMENT Control (EventHandler+) >
<!ATTLIST Control Name CDATA #REQUIRED >
<!ATTLIST Control Class CDATA #IMPLIED >
<!ATTLIST Control Image CDATA #IMPLIED >
<!ATTLIST Control Caption CDATA #IMPLIED >
<!ATTLIST Control Type CDATA #IMPLIED >
<!ATTLIST Control Width CDATA #IMPLIED >
<!ATTLIST Control Height CDATA #IMPLIED >
<!ATTLIST Control HTMLAttr CDATA #IMPLIED >
<!ATTLIST Control Style CDATA #IMPLIED >
<!ATTLIST Control Hidden CDATA #IMPLIED >
<!ATTLIST Control Enabled CDATA #IMPLIED >
<!ATTLIST Control SelectFrom CDATA #IMPLIED >

<!ATTLIST Control DisplayMode CDATA #IMPLIED >

<!ELEMENT EventHandler EMPTY >
<!ATTLIST EventHandler Name CDATA #REQUIRED >
<!ATTLIST EventHandler Event CDATA #REQUIRED >
<!ATTLIST EventHandler Function CDATA #REQUIRED >
<!ATTLIST EventHandler FunctionType CDATA #IMPLIED >
<!ATTLIST EventHandler ShortcutKey CDATA #IMPLIED >
<!ATTLIST EventHandler PostAction CDATA #IMPLIED >
<!ELEMENT DisplayModes (Mode+) >
<!ELEMENT Mode EMPTY >
<!ATTLIST Mode Name CDATA #REQUIRED >
<!ATTLIST Mode TemplateFile CDATA #REQUIRED >
<!ATTLIST Mode DataFormat CDATA #REQUIRED >
<!ATTLIST Mode FormatStyle CDATA #IMPLIED >

<!ELEMENT Parameters (Parameter+) >
<!ELEMENT Parameter EMPTY >
<!ATTLIST Parameter Name CDATA #REQUIRED >
<!ATTLIST Parameter Value CDATA #IMPLIED >
<!ATTLIST Parameter Required CDATA #IMPLIED >
<!ATTLIST Parameter InOut CDATA #IMPLIED >

Plugin service metadata DTD 文件

<!--OpenBiz Plugin service metadata DTD-->

<!ELEMENT PluginService ANY >
<!ATTLIST PluginService Name CDATA #REQUIRED >
<!ATTLIST PluginService Description CDATA #IMPLIED >
<!ATTLIST PluginService Package CDATA #REQUIRED >
<!ATTLIST PluginService Class CDATA #REQUIRED >