# 功能描述

在编辑列表时,有时用户希望添加一些自定按钮实现一些特定的功能,这个时候可以使用自定义按钮来实现。

# 操作步骤

添加测试按钮

我们这里定义一个事件函数,这个函数是一个JS方法。

编写事件函数

我们可以在页面Js函数定义,我们编写和上一步骤同名的函数,这样我们就可以调用这个脚本了。

预览 点击按钮

打印出列表数据。

生成出的代码:

调用后端的代码 在列表中,我们可以通过按钮调用后端的代码,实现一些特定的功能,比如选中某个数据,然后进行状态更新等。

配置按钮

点击新增脚本按钮

点击配置自定处理脚本按钮

生成代码

这里生成一个 ongetAction 方法

function handButtonClick(e){
    var url=e.sender.url;
    var rows=grid.getSelecteds();
    _SubmitJson({
        url:__rootPath+url,
        data:{
            data:mini.encode(rows)
        },
        method:'POST',
        success:function(result){
            grid.load();
        }
    });
}

事件如上,这个方法是将选中行数据提交到/dev/cus/customData/custombtn/selfButtonExe/getAction.do 这个URL上面。

脚本编写方法 上面说到,我们是将数据提交到后端的一个URL上面,我们可以看到这个url的代码实现。

@RequestMapping("{boKey}/selfButtonExe/{funKey}")
    @ResponseBody
    public JsonResult selfButtonExe(HttpServletRequest request,@PathVariable("boKey")String boKey,@PathVariable("funKey")String funKey) throws Exception{
         
        SysBoList sysBoList=sysBoListManager.getBoList(boKey);
        if(sysBoList==null){
            return new JsonResult(false,"不存在标识键为:"+ boKey+"的业务对象的配置");
        }
        SysBoTopButton sysBoTopButton=sysBoList.getTopButtonMap().get(funKey);
        if(sysBoTopButton==null ||StringUtils.isEmpty(sysBoTopButton.getServerHandleScript())){
            return new JsonResult(false,"不存在标识键为:"+ funKey+"按钮的后端代码配置!");
        }
        Object result=null;
        String pScript=null;
        try{
            Map<String,Object> variables=RequestUtil.getParameterValueMap(request, true);
            //TODO,传入ov数组还是Json数值
            String data=request.getParameter("data");
            JSONArray ary=JSONArray.parseArray(data);
            variables.put("variables", variables);
            variables.put("rows", ary);
            //动态解析脚本
            pScript=freemarkEngine.parseByStringTemplate(variables, sysBoTopButton.getServerHandleScript());
            //动态执行脚本
            result=groovyEngine.executeScripts(pScript, variables);
        }catch(Exception ex){
            ex.printStackTrace();
            String errMsg=pScript+"执行有错误!错误如下:"+ex.getMessage();
            return new JsonResult(false,errMsg);
        }
         
        return new JsonResult(true,"成功执行!",result);
    }

因此我们在编写这个脚本时,上下文变量是:

variables : 这个数据是从上下文请求获取的数据,是一个map类型的数据。 rows: 是我们从客户端提交选中的数据。

执行脚本后返回的数据我们放到返回的结果中。

编写脚本如下:

import org.springframework.jdbc.core.JdbcTemplate;
import com.redxun.core.util.AppBeanUtil;
JdbcTemplate jdbcTemplate=AppBeanUtil.getBean(JdbcTemplate.class);
for(int i=0;i<rows.size();i++){
    String sql="update t_demo_1 set f_address=CONCAT(f_address,'1') where id_=?";
    jdbcTemplate.update(sql,rows[i].ID_);
}

这个代码的功能是将选中的记录的地址统一修改。