请求协助:根据数据库查询结果禁用模态框表单字段
问题分析与代码修正
我来帮你一步步梳理并修正代码里的问题,让你想要的功能正常跑起来:
1. 模型代码修正(Prwtrabajadores_model.php)
你的模型函数现在有三个关键问题:
- 第一行直接
return查询结果,导致后面的行数判断逻辑完全不会执行 - SQL的OR条件写法错误,无法正确匹配目标状态值
$query = result();是无效语法,没有正确获取查询对象
修正后的模型代码:
function revisaCertificados($idTrabajador){ // 先获取查询对象,不要直接return $query = $this->db ->select("a.idprw_estadocertificado") ->from("prw_estadocertificado as a") // !!这里必须补充表之间的关联条件,否则会产生笛卡尔积错误!! ->join($this->schemaEmpresas."wom_trabajadores as b", "a.trabajador_id = b.idwom_trabajadores") ->where("b.idwom_trabajadores", $idTrabajador) // 用where_in替代繁琐的OR条件,更简洁高效 ->where_in("a.idprw_estadocertificado", [1,4,5]) ->get(); // 判断是否有匹配记录,直接返回布尔值 return $query->num_rows() > 0; }
2. 控制器代码修正(对应控制器文件)
当前控制器没有返回任何响应给前端,JS根本拿不到判断结果。需要修改为返回JSON格式的布尔值:
function evaluarTrabajador(){ $this->load->model("Prwtrabajadores_model"); $idTrabajador = $this->input->post('idEdit'); // 调用模型获取检查结果 $hasCertificados = $this->Prwtrabajadores_model->revisaCertificados($idTrabajador); // 返回JSON格式的响应给前端 echo json_encode(['status' => $hasCertificados]); }
3. 视图层JS代码修正
现在需要在打开模态框前,先调用检查接口,根据结果禁用指定字段。这里提供两种方案:
方案一:分步请求(先拿数据,再检查状态)
$(".editarT").on("click", function(){ var id = $(this).data("idtra"); // 第一步:获取员工基础数据并回显 $.ajax({ url : "<?php echo site_url('/contratista/ajax_edit/')?>/" + id, type: "GET", dataType: "JSON", success: function(data) { // 填充模态框字段 $('input[name="idEdit"]').val(data[0].idwom_trabajadores); $('input[name="rutEdit"]').val(data[0].rut); $('input[name="nombresEdit"]').val(data[0].nombres); $('input[name="appEdit"]').val(data[0].apellido_paterno); $('input[name="apmEdit"]').val(data[0].apellido_materno); $('input[name="cargoEdit"]').val(data[0].cargo); $('input[name="telefonoEdit"]').val(data[0].telefono); $('input[name="mutualEdit"]').val(data[0].mutual); // 第二步:调用证书检查接口 $.ajax({ url : "<?php echo site_url('/contratista/evaluarTrabajador/')?>", type: "POST", data: {idEdit: id}, dataType: "JSON", success: function(result) { // 如果结果为true,禁用指定字段 if(result.status){ // 禁用所有输入框,如需保留特定字段可添加:not([name="xxx"]) $('#form-modal-editar-trabajador input').prop('disabled', true); } // 打开模态框 $('#form-modal-editar-trabajador').modal({show:true}); }, error: function () { alert('Error al verificar certificados'); // 即使检查失败,也正常打开模态框(可选) $('#form-modal-editar-trabajador').modal({show:true}); } }); }, error: function () { alert('Error obteniendo datos del trabajador'); } }); });
方案二:合并接口(更高效,减少请求次数)
推荐修改ajax_edit接口,让它同时返回员工数据和证书检查结果:
// 控制器中的ajax_edit函数 function ajax_edit($id){ // 1. 获取员工基础数据(替换成你原本的查询逻辑) $employeeData = $this->你的员工模型->getTrabajadorById($id); // 2. 同时检查证书状态 $hasCertificados = $this->Prwtrabajadores_model->revisaCertificados($id); // 3. 返回合并后的结果 echo json_encode([ 'employee' => $employeeData, 'hasCertificados' => $hasCertificados ]); }
对应的JS代码简化为:
$(".editarT").on("click", function(){ var id = $(this).data("idtra"); $.ajax({ url : "<?php echo site_url('/contratista/ajax_edit/')?>/" + id, type: "GET", dataType: "JSON", success: function(data) { // 填充模态框字段 $('input[name="idEdit"]').val(data.employee[0].idwom_trabajadores); $('input[name="rutEdit"]').val(data.employee[0].rut); // ... 其他字段赋值 // 根据合并结果禁用字段 if(data.hasCertificados){ $('#form-modal-editar-trabajador input').prop('disabled', true); } // 打开模态框 $('#form-modal-editar-trabajador').modal({show:true}); }, error: function () { alert('Error obteniendo datos'); } }); });
内容的提问来源于stack exchange,提问作者Alvaro Vergara
相关产品推荐
相关产品推荐

