Jeecms之查询实现

编程技术  /  houtizong 发布于 3年前   83
    现有一需求如下:
    按时间段查询及留言状态(已回复,未回复,已审批)来查询留言。
    当时的想法是这样子的,首先要把查询的条件通过页面传递到后台。于是在后台管理中找看有没有类似的功能,费了半天劲还真给找了一个有条件查询的例子,那就是文章内容的查询。
<@p.text colspan="1" width="45" label="起始时间" name="queryStartDate" id="queryStartDate" readonly="readonly" size="24" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" /> <@p.text colspan="1" width="50" label="结束时间" name="queryEndDate" id="queryEndDate" readonly="readonly" size="24" onclick="WdatePicker({dateFmt:'yyyy-MM-dd'})" class="Wdate" /> 

   接手该项目时有留言状态代码,如下:
<a href="/web/admin/auxiliary/msg/Com_list.do?group_state=0_" >[未回复]</a> <a href="/web/admin/auxiliary/msg/Com_list.do?group_state=0_true" >[已回复]</a>  <a href="/web/admin/auxiliary/msg/Com_list.do?group_state=1_true" >[已审核]</a> 

   关于查询条件是怎么传递到后台,一开始是用request.getParameter();数据顺利的传递到后台。在action中将查询条件放入放入到获取数据的页面中也能够查出数据。为了美观考虑所以我建议将超链接改为了button,代码如下:
<td width="20px" align="left"><@p.button value="未回复" onclick="submit_date('0_');" /></td> <td width="20px" align="left"><@p.button value="已回复" onclick="submit_date('0_true');" />&nbsp;&nbsp;&nbsp;&nbsp; <@p.button value="已审核" onclick="submit_date('1_true');" /></td> function submit_date(group_state){ var form = document.getElementById("submitForm"); alert("form.aciton:"+form.action); form.action = form.action+"?group_state="+group_state; form.method = "post"; form.submit(); } 

    当时以为能够查出数据应该就没什么问题了。再就是当时别的需求比较急,于是将此放在了一旁。等别的任务完成后,准备将此功能修改好一起测试。刚一测就发现了问题:点击下一页时直接找不着页面。 于是赶紧在action中将查询条件参数打印到控制台。发现分页的时候页面参数根本没有传递到后台去。
    查看了前台的代码及@p.table源码后才发现查询条件是一个form,分页是另外封装好的一个form。那么点击分页的时候当然不能将查询的form中的参数一并传过去。记得当时还在网上搜怎么样一次将两个Form中的数据提交到后台,结果找了半天也没查到,结果郁闷了好半天。
自己不能搞定当然不能坐以待毙,还得请高人指点。
    先用httpwatch观察文章查询时的数据传递情况,结果发现条件查询的数据全部传递过去的。接着查看文章列表的源码发现了下面的情况:
<input type="hidden" name="id"/> <input type="hidden" name="pageNo" value="2"/> <input type="hidden" name="chnlId" value="76"/> <input type="hidden" name="queryInputAdminId" value=""/> <input type="hidden" name="queryTitle" value="公积金"/> <input type="hidden" name="queryTopLevel" value="0"/> <input type="hidden" name="queryOrder" value="0"/> <input type="hidden" name="queryContentCtgId" value="1"/> <input type="hidden" name="queryStatus" value="3"/> 

   说明数据是通过隐藏域的方式提交过来的,我进行过一些测试,发现查询条件不同时隐藏域的个数是不一样的,那么说明是通过动态的方式产生隐藏域的。 由于分页是有@p.table标签封装的,于是查看了半天的源码(table.ftl)文件。
    看了很长时间终于发现了下面的代码(如果freemarker不是很精通的话头会变大的)隐藏了细节。
<input type="hidden" name="${keyId}"/> <@p.hidden name="pageNo" /> <#list keepParams as keep> <@p.hidden name="${keep}" /> </#list> <#list Parameters?keys as pkey> <#if pkey!=keyId && pkey!=batchId && !keepParams?seq_contains(pkey) && pkey?starts_with('query')> <@p.hidden name="${pkey}" /> </#if> </#list> 

    究竟是哪一个起作用,到底该如何做。这个也是看了很久才看明白。其实动态将表单中的参数生成到分页form中的就是下面的语句:
<#list Parameters?keys as pkey> <#if pkey!=keyId && pkey!=batchId && !keepParams?seq_contains(pkey) && pkey?starts_with('query')> <@p.hidden name="${pkey}" /> </#if> </#list> 

     其中最关键的词语就是最后的条件starts_with('query'),于是赶紧查看文章列表的参数是不是query开头。 于是我也将我的留言的查询参数的name也全部改为了已小写query开头,并将三个按钮该为了一个select下拉框外加一个查询俺就。后台的参数通过setter(),getter()方法,果然数据就能通过分页传递到后台去了。暗自庆幸了一会发现问题又来了。分页是没有什么问题了,可进行不同状态留言的时候却发现后台立马报错。查看后台的打印参数才明白,原来从页面传递过来的参数分别传递了2次,也就是后台获得数据是两次查询的数据拼接的,自然就报错了。

搞了半天终于明白是@form标签中将已query开头的字段也封装成了隐藏域,代码如下:
<#if query=="true"> <@p.hidden name="pageNo" /><#rt/> <#list Parameters?keys as pkey> <#if pkey?starts_with('query')> <@p.hidden name="${pkey}" /><#t/> </#if> </#list> </#if> 

  终于搞明白缘由,于是赶紧将条件查询的freemarker标签定义的@p.form改为普通的form,但是报了个更加离谱的错误freemarker错误。没得办法,只得将条件先删掉调试,发现删掉后显示正常。确定产生异常的原因因该是时间组件报的错,于是将@p.text时间标签改造为普通的时间标签,结果发现数据显示正常了。 参数的初始化。(注:${}一定要放在""里,要不然会产生不可预料的结果,教训啊,教训!)
 function init(){ var tempDate = new Date(); var currDate = ChangeDateToString(tempDate); var startDate = document.getElementById("queryStartDate"); var endDate =document.getElementById("queryEndDate"); <#if queryStartDate??> startDate.value = "${queryStartDate}"; endDate.value = "${queryEndDate}"; <#else> startDate.value =currDate; endDate.value = currDate; </#if> <#if queryResponseStatus??> document.getElementById("queryResponseStatus").value="${queryResponseStatus}"; <#else> document.getElementById("queryResponseStatus").option[0].selected = true; </#if> } function ChangeDateToString(DateIn){ var Year = 0; var Month = 0; var Day = 0; var CurrentDate = ""; //初始化时间 Year = DateIn.getYear(); Month = DateIn.getMonth()+1; Day = DateIn.getDate(); CurrentDate = Year + "-"; if (Month >= 10 ){ CurrentDate = CurrentDate + Month + "-"; } else{ CurrentDate = CurrentDate + "0" + Month + "-"; } if (Day >= 10 ){ CurrentDate = CurrentDate + Day ; } else{ CurrentDate = CurrentDate + "0" + Day ; } return CurrentDate; } </script> 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客