完全表单化的学生科研项目管理平台在填写项目信息的时候需要将成员的一些基本信息添加进去,而每个项目的项目成员不是固定的,这就涉及到动态添加一个成员的问题。在DWZ中给出一个关于动态添加的事例,但其下拉框是通过enumUrl指向的一个静态html文件,当我试图把它改成action时是没有用的。
这也就意味着如果采用这种动态的下拉框,学院的那些下拉选择必须写死,这明显是不可行的,万一需要添加一个学院或者学院改名之类的,岂不是需要改动后台代码。于是还是坚持“不要写死”的原则,继续寻找解决的办法。
看到学长之前的fpp中有动态修改文本框的数量的,那是通过php文件echo出不同数量的text来实现的,但问题是,我的view页面全是html。而且即使添加了text,在添加学院下拉的select时还会出现问题,因为之前的select都是通过smarty里的
实现的。
在各种尝试以及网上发帖之后,决定放弃动态的enum,而是改用lookup查找带回。
DWZ中的lookup是可以新打开一个窗口的,这也就意味着我根据action来控制这个窗口的格式。果不其然,lookupUrl属性可以写成action,然后改action再请求显示学院的窗口,这样查找就可以带回学院的名称了。具体的过程如下
添加项目信息的页面中动态添加一行的添加lookup部分
它的lookupUrl指向的是selectcollege方法,该方法传递学院的编号及名称
新窗口的页面代码中值得注意的是href中的$.bringBack,它指明了查找带回的是什么,与动态添加lookup类型的name值是对应的。如该例,当我带回某个学院时,学院的名称通过orgName传递,动态添加的那个页面就会根据name来获得从而显示。
动态添加的效果如上,原本DWZ中的动态添加的按钮后面是有一个文本框的,可以输入需要添加的行数,但是担心的是恶作剧输入个10000行,虽然影响不大,但一直在那请求处理势有些影响。所以,我的想法就是深入DWZ的后台代码,去掉那个文本框,让每次点击按钮添加一个成员。
在DWZ的dwz.database.js页面里找到动态生成一行的代码,第278行可以看到那个可以输入添加多少行的文本框实际上就是一个,我把它改成type = “hidden”,这样那个文本框就影藏了,每次添加的数量就是hidden里的value。
还有一个DWZ中不好的地方是,通过查找带回获取到的数据填充到文本框中,而这个文本框是可以修改的,也就意味着如果有用户直接填写文本框,而不是通过查找带回的话也是可行的,明显有违选择而不是填写的本意理论。所以,找到后台的dwz.database.js的第349行,添加文本框的"readonly" = "readonly"
接下来就是怎么处理动态添加的值了,因为动态添加的行数是不确定的,而且不止学院一个框框。如下代码所示,每个成员的信息用“*”进行分割,同一行中的学号,姓名等用“|”进行分割,处理好后合并成member_str字符串
可能注意到里面的check()函数了,这个函数的目的是为了防止用户也输入一个我用于区分的“|”和“*”,如果不加过滤的话字符串凭借出来的结果就不是实际上的了。到这一步就能整合字符串写入数据库了。
那怎样处理读取到的字符串?这就涉及到explore函数的处理了
处理完后通过smarty在html页面里显示出项目的基本信息就可以了。