进入核心:深入 Window
在上一个部分中,我们对 table 的配置作了比较详细的介绍。前面我们说过,表名被看成了一个默认的 Window 来使用。是的,让我们打开 config 目录下的 window.xml 。哦,这个文件里面什么也没有。我们能看到 window.xml 定义了两个子元素。 <single> 与 <multi> 。其中 <single> 用来定义单窗口操作。 <multi> 用来定义主从关系 ( 一对一,一对多 ) 的多窗口操作。其中 Single 窗口是 Multi 的基础。我们先进入 Single 的配置。
单窗口配置
所有的单窗口配置都位于 <single> 元素之下。当我们需要定义一个新的 Window 时,需要在 <single> 元素之下添加一个 <window> 元素。
属性介绍
我们先来看 <window> 元素的属性:
Id : 窗口的唯一标识,在 window.xml 中唯一,同时不可与 table.xml 中的 ID 相同。
Table : 如果该窗口中定义的所有元素都属于同一张表,则需要定义此项。
Type: : 窗口的类型,有三个可选项:
1. popular 也就是示例中 user_demo 的默认类型。
2. grid 与 1 类似,但他无法执行编辑操作,用于使用 SQL 的窗口展示方案。
3. single 如果选择了该项,那么 window 的 CRUD 操作都可以在一个页面完成。
Function :窗口所拥有的功能。包括 ” query,add,update,delete” 。各项功能之间使用逗号分隔。对于窗口类型为 grid 的,除 query 功能以外,其它功能都即使定义了也将是无效的。
Css : 定义了该窗口要使用的样式文件。如果定义了,那么该 css 文件必须要在 cwin/css 目录下能找到。
子元素介绍
<window> 允许的子元素有以下几种:
<desc>,<fields>,<form>,<grid>,< extra>,< sql>,< limits>
下面我们来逐项介绍 window 的子元素。
desc: 描述
这一项最简单了,就是这个 Window 的描述。将直接显示在页面上。
fields: 字段列表
他包含了这个 Window 的所有字段。他的子元素与 table 配置中的 table 元素的子元素一致。包含了一系列的 <field> 元素列表。 <field> 的元素与 table.xml 中的 <field> 定义完全一致。如果 Window 定义了 table 属性, Cwin 会自动引用在 table.xml 中定义的相同 name 的元素。如果 Window 没有定义 table 属性,那么为了使 field 引用到已有的 field 定义,需要将引用将要写为: <field ref=”table.field”/> 的形式,有关元素的引用详细介绍,请参看上一章的元素引用部分。如果您的字段是一个聚合函数的结果,在 table.xml 中没有定义,那么,就需要在此为这个字段作一个定义。
form: 编辑表单配置
form 的配置比较简单,他只有两个属性:
alertErrorMsg :是否跳出错误信息?选项为 boolean 类型。如为 false 将在页面上显示错误信息。
cols :定义了编辑表单一行输出的列数。
grid :输出表格配置
grid 包括四个内置属性与六个自选属性。自选属性的意思是在 xml 中定义之后会原样输出在前台 HTML 中。比如样式,表格高度等等。
四个内置属性包括:
pageSupport :是否需要分页支持。默认为 true
containsSn :是否在输出时包括列号,默认为 true
containsCheckboxL 是否有输出时包含单行框,默认为 false
pageSize :分页时每页的记录数
六个自选属性包括:
cellspacing, cellpadding, style, class,width, height
这里需要注意的是, width 与 height 是字符串型,值可以是整数或是百分数。比如 width=”100%” ,也可以是 width=”1024px” 。当然,这些都在 css 中有默认的定义。
extra :扩展列定义
扩展列的意思就是在输出表格时多加上的列。
它可以包含一系列的 <output> 子元素, <output> 元素的定义与 <field> 的子元素 <output> 的定义方式一致。具体定义方式请查看 <field> 的子元素 <output> 的定义。
sql :查询定义
Cwin 支持根据 SQL 来展示查询表格。 sql 元素用来定义查询语句。需要注意的是:查询的字段需要在 <fields> 中定义,否则在查询列表中就看不到了。
limits :查询与输入限制
limit 子元素用来定义这个 Window 的限制。定义了这个限制,在查询时将自动将 limits 配置加为查询条件,插入数据时也将以 limits 配置为默认值。
Limits 子元素由一系列的 <limit name=”field” value=”fieldValue”> 值组成。
示例 1
现在,老板提出了一个需求:
用户列表的名字需要改为:用户管理中心
密码不要显示在表格与编辑表单,新增的密码都需要是: 123456
展示表格每页以 20 条记录显示。
要求只管理普通用户。
不允许删除操作。
加一个广告列链接到 Cwin 作者的 BOLG 。
界面的 css 需要换一套方案。
OK ,我们按照老板的需求,根据上面 Window 定义的介绍。给出了一个 window 的定义:
<window id="user_demo_1" table="user_demo" type="popular" function="query,add,update"> <desc> 用户管理中心 </desc> <fields> <field name="id"/> <field name="login_name"/> <field name="type"/> <field name="create_time"/> <field name="intro"/> </fields> <grid pageSize="20"/> <extra> <output desc="blog" dispMode="link" href="http://sunarrow.iteye.com/"/> </extra> <limits> <limit name="type" value="0"/> </limits> </window>
哦,有一个问题比较麻烦,就是密码的默认值。这个我们得修改 table.xml 的 password 字段定义。修改为:
<field name="password" desc=" 密码 " minLen="6" maxLen="20" store="md5" default=”123456”> ,好了,将我们的 window 定义加入到。
<sinlge></single> 元素之间。打开我们的浏览器,访问:
http://localhost:8080/cwin/cwin?_CWIN_ID=user_demo_1 吧!
用户可以将 window 的 type 改为 single 试试!
示例 2 : SQL Grid
由于使用单表的 SQL 查询展现 SQL Window 不太够用。请诸位读者先读完下一章节再回到这个示例。
OK ,我们现在在 user_demo 与 user_demo_ex 表里都有了数据。有一天,老板要求在一个表格中将用户基础信息与扩展信息同时展示出来,并且要求能根据登录名与真实姓名查询。嗯,这个很简单,一条 SQL 语句就能把数据查出来。写好 SQL 如下:
select u.id,u.login_name,u.email,u.type,u.intro,ex.real_name,ex.tel,ex.address,ex.postcode from user_demo u left join user_demo_ex ex on (u.id = ex.id)
那么,如何在 Cwin 中配置呢?废话不说了,直接上配置:
<window id="user_demo_and_ex" type="grid" function="query"> <desc> 用户以及他的扩展信息 (SQL 查询 )</desc> <fields> <field ref="user_demo.id" isKey="true" fullName="u.id"/> <field ref="user_demo.login_name" cond="like" fullName="u.login_name"/> <field ref="user_demo.type" order="u.type"/> <field ref="user_demo.email"/> <field ref="user_demo.intro"/> <field ref="user_demo_ex.real_name" cond="like" fullName="ex.real_name"/> <field ref="user_demo_ex.tel"/> <field ref="user_demo_ex.address"/> <field ref="user_demo_ex.postcode"/> </fields> <extra> <output desc="BLOG" title=" 请帮忙多发些评论啊 !" dispMode="link" href="http://sunarrow.iteye.com?id=[id]"/> </extra> <sql>select u.id,u.login_name,u.email,u.type,u.intro,ex.real_name,ex.tel,ex.address,ex.postcode from user_demo u left join user_demo_ex ex on (u.id = ex.id)</sql> </window>
这就是全部的配置。我们需要显示的字段都各自引用了所在表定义的元素。如: (ref=”user_demo.type”) 。另外我们可以看到登录名与真实姓名列我们定义了查询。用户类型列定义了排序。从这个配置中您也应该能理解 fullName 这个属性的含义了。因为在比较复杂的 SQL 中,排序时将需要写上全名甚至是聚合函数。 Order 属性也是如此。
动态参数与通过 URL 对页面的引用
动态参数
现在大老板又有新的需求了,他需要管理那些管理员。在 user_demo_1 中,我们把 <limits> 元素删除,这样我们可以管理所有的用户。现在我们可以通过动态参数来管理管理员。
目前:管理所有用户的 URL 是:
http://localhost:8080/cwin/cwin?_CWIN_ID= user_demo_1
那么通过动态参数,管理普通用户的 URL 是:
http://localhost:8080/cwin/cwin?_CWIN_ID= user_demo_1&user_type=0
管理管理员的 URL 是:
http://localhost:8080/cwin/cwin?_CWIN_ID= user_demo_1&user_type=1
动态参数的参数是在 Window 中定义的字段名。参数的值将作为 Window 的查询默认值与新增时的值。功能上相当于动态的定义了 <limits> 元素。但动态参数无法覆盖在 <limits> 中定义的限定。
通过 URL 对页面的引用
在前面的例子中,使用过一个这样的输出配置: <output dispMode="link" href="cwin?_CWIN_ID=user_demo&_CWIN_ACTION=show&id=[id]" target="_blank"/> 。这个输出配置表示:用来查看 Window user_demo 的展示页,显示 id 为 [id] 的用户信息,其中 [id] 是一个变量。
同样的,如果我们需要引用这个用户的编辑页面,那么 URL 可以这样写: cwin?_CWIN_ID=user_demo&_CWIN_ACTION=toEdit&id=[id] 。其中 _CWIN_ID 与 _CWIN_ACTION 是系统参数,分别表示 Window ID 和动作。 _CWIN_ACTION 的另外两个可选项是 query 和 delete 。也就是说,通过 URL 能引用 Window 的查询页也能直接删除 Window 中的数据。
多窗口配置
多窗口配置都集中在 <multi> 子元素以下。
每一个 Multi-Window 由一个 <pri-sec> 元素定义。
目前多窗口配置支持一对一与一对多模型。
实际上,一对一与一对多的配置除了属性 type 以外完全相同。
现在,我们来看看 <pri-sec> 的属性:
属性介绍
Id :这个属性就不用介绍了,要求唯一。
Type :多窗口类型,有两个可选项: oneone 、 onemany 。这很好理解,分别定义一对一与一对多。
Primary :主窗口,必须是一个 Single Window 。
Secondary :从窗口,也必须是一个 Single Window 。
Trigger :调用从窗口的方式。有两个选项: auto :自动,当选中一行主表数据时会自动调用从窗口。 opt :手动,将在主窗口的展示表格中新加一列。点击之后将调用从窗口。
子元素介绍
Multi-Window 的子元素比较简单,只有一个描述 (desc) 和一组关系 (relations) 。
desc 元素: Multi-Window 的描述。
relations 元素:可以包含不定数量的 relation 子元素。
relation 元素:它的属性有: primary ,要求是主窗口中的一个字段。 secondary :要求是从窗口中的一个字段。它俩应拥有主从窗口之间的关联关系。
一对一演示
为了我们能使用一对一的演示,我们需要新建一张 user_demo_ex 的扩展表。
CREATE TABLE `user_demo_ex` (
`id` int(11) NOT NULL auto_increment,
`real_name` varchar(30) default NULL,
`tel` varchar(20) default NULL,
`address` varchar(100) default NULL,
`postcode` varchar(10) default NULL,
`create_time` datetime default NULL,
`modify_time` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
直接上配置:
<pri-sec type="oneone" id="user_demo_ex_oo" primary="user_demo" secondary="user_demo_ex" trigger="auto"> <desc> 测试,用户--与用户扩展,一对一关系 </desc> <relations> <relation primary="id" secondary="id"/> </relations> </pri-sec>
同样的,在 URL 中使用 id 来访问这个一对一的演示。
在目前的版本中,多窗口的页面还有一些已知的 BUG ,不过并不会损坏数据。
一对多演示
暂无