DWZ与EaglePHP结合的三级联动

之前没考虑到一个细节,同一个项目不同批次的拥有的项目类别不一样。这是在周五辅导员要求我们部门办“大学生创新创业训练计划”2012年的结题答辩和2013年的中期检查时候发现的,2012年的“大创”拥有国家级、省级、校级三个项目类型,而2013年的“大创”改为了重点、一般、指导和校级。这就让我为难了,之前有考虑到万一哪个项目需要增加一个项目类型的情况,所以没有把项目类型在代码里给写死,只要在数据库中对应的项目里加上一个项目类型就行了。可现在没那么简单,如果全部改为重点、一般、指导和校级,那之前年份的就搜索不到了。经过一番思想斗争,决定还是从数据库入手。

  • 方案一:在数据库表明项目代号的数据表中增加一列“当前年份”和一列“项目批次”,这样不同批次的项目可以拥有不同的项目类型,通过判断当前的年份确定项目的批次,然后通过该批次获得对应的项目类型。

  • 方案二:在上述数据表中增加一列“项目批次”,这样不同批次的可以拥有不同的项目类型,但不会自动判断当前的项目批次。

第一种方案看似数据库冗余点,但用户不需要选择批次。第二种方案用户操作多一个选择项目批次的必要,但这也可以解决万一年份与批次不是一一对应关系的问题,比如有的项目不是每年都举行或者有的项目一年举行多次等等。

最终还是决定采用第二种方案了,这就不是之前的“二级联动,根据项目大类确定项目拥有的类型,而是“三级联动”,根据项目大类确定项目批次,再根据前两者确定项目拥有的类型。

在DWZ中有个三级联动的事例,即w_combox.html文件,

1
2
3
4
5
6
7
8
9
10
11
<select class="combox" name="province" ref="w_combox_city" refUrl="demo/combox/city_{value}.html">
<option value="all">所有省市</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
</select>
<select class="combox" name="city" id="w_combox_city" ref="w_combox_area" refUrl="demo/combox/area_{value}.html">
<option value="all">所有城市</option>
</select>
<select class="combox" name="area" id="w_combox_area">
<option value="all">所有区县</option>
</select>

<select></select>中ref为DWZ新增的属性,指向的是当前combox值改变引起联动的下一级combox,ref用下一级combox的id属性来赋值,refUrl为变动时指向的链接。与EaglePHP框架结合的过程中,需要将refUrl改为对应的控制器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<dl>
<dt>项目大类:</dt>
<dd>
<select name="PID" class="combox required" ref = "TIME" refUrl = "{{$smarty.const.__URL__&a=getprojecttime&project_name={value}|url}}">
<option value="">--请选择--</option>
{{html_options options=$project_name selected=$smarty.post.PID}}
</select>
</dd>
</dl>
<dl>
<dt>项目批次:</dt>
<dd>
<select name="TIME" id = "TIME" class="combox required" ref = "type" refUrl = "{{$smarty.const.__URL__&a=getprojecttype&project_name_TIME={value}|url}}">
<option value="">--请选择--</option>
</select>
</dd>
</dl>
<dl>
<dt>申报类型:</dt>
<dd>
<select name="type" id = "type" class="combox">
<option value="">--请选择--</option>
</select>
</dd>
</dl>

在选择第一个“项目大类”时,直接选择传递的项目大类名称,当项目大类的名称选定后,通过refUrl请求获取下个“项目批次”的下拉json数据,选定“项目批次”后同样的级联“项目类型”。但这边出现了一个问题:项目批次选定后只能传递当前下拉框的批次数值,前面的项目大类数值不能返回controller中了。也就是说当前<select></select>中通过refUrl传递参数只是当前select的值,上一个<select><select/>的值无法传出去。这也就让我为难了,百般苦想之后想到通过项目批次+项目大类的形式,也就是选择项目批次的时候传递的是“项目大类+项目批次”的字符串,这样级联项目类型的时候通过解析字符串就能获得项目大类和项目批次了,从而确定该批次的项目拥有的项目类型。

最终的成果如下图所示
图片

当我选定“大学生创新创业训练计划”的项目大类后,通过级联,给出的项目批次有2012年和2013年。
图片

当我选定2013年后,通过级联,给出的申报类型为“一般项目“、“指导项目”、“校级项目”和“重点项目”。
图片

这样,写入数据库的信息在搜索时就会根据这些信息来区别了。

Just a beginner.<br /><a href='https://github.com/yaoshanliang/about' target='_blank'>profile</a>