1

我尝试为 jsgrid 构建自定义验证器,以检查 item.Name 在插入或编辑之前是否确实存在于 DB 中以避免任何重复的行。

这个问题我读了三遍 jsgrid 的文档,但我不知道如何解决这个问题。

这项工作https://github.com/tabalinas/jsgrid-php帮助了我太多,我转变为对我的工作和 mysqli 有用。

想法:如果值存在与否,我让函数检查 DB,如果存在,则在 php 类中返回 true,否则返回 false

public function checkName($name){
    try{
        if(!empty($name)){
            $co_conn = $this->CON_conn->open_connect();
            $getsame = mysqli_query($co_conn,"select Name from category where Name = '$name'");
            if($getsame){
                $numit = mysqli_num_rows($getsame);
                if($numit > 0) return true;
                else return false;
            }
            else return true;
            $this->CON_conn->close_connect($co_conn);
        }
        else return true;
    }
    catch(Exception $er){
        return true;
    }
}

我在外部文件“CheckValue.php”中调用了这个函数

<?php require_once '////the director of the class';
$chnow = new NameOfMyClass();
$result = true;
switch($_SERVER["REQUEST_METHOD"]) {
    case "CHGO":
        parse_str(file_get_contents("php://input"), $_CHGO);
        //to ensure if it work i tested it.
        $result = $chnow->checkName($_CHGO["Name"]);
    break;
    default:
        $result = true;
    break;
}
header('Content-type: application/json');
echo json_encode($result);
?>

在基本.html

$(function() {
    $.ajax({
        type: "GET",
        url: "../bin/update.php"
    }).done(function(response) {
        response.unshift({ ID: "0", Name: "" });
        $("#jsGrid").jsGrid({
            height: "50%",
            width: "70%",
            selecting: false,
            filtering: false,
            editing: false,
            sorting: false,
            paging: true,
            autoload: true,
            pageSize: 15,
            pageButtonCount: 5,
            controller: {
                loadData: function(filter) {
                    return $.ajax({type:"GET", url: "../bin/update.php",data:filter});
                },
                updateItem: function(item) {
                    return $.ajax({type:"PUT",url: "../bin/update.php",data: item});
                },
                insertItem: function(item) {
                    /*$.ajax({type: "CHGO",url: "..bin/Checkvalue.php",data:item.Name, dataType: "json",
                    success: function(data){
                        JSON.parse(data);
                        consol.log(data);
                        //alert(data);
                        //I used many ways to find why its not work, then I commented it
                        }
                    });
                    //return $.ajax({type: "POST",url: "../bin/update.php",data: item});
                    //return data;

                            //else sweetAlert("error", "this value is exist!", "error");
                            //here I thought merge sweetalert js will give a good look of work not the normal message.
*/
                }
            },
            fields: [
                { name: "ID", type: "number",width: 50, editing:false, inserting:false },
                { name: "Name", type: "text", width: 50, validate: ["required",{
                        message: "this value is exist",
                        validator: function(value,item){
                            if(value != "")
                            {
                                $.ajax({
                                    type: "CHGO",
                                    url: "..bin/Checkvalue.php",
                                    data: item.Name,
                                    success: function(data){
                                        if(data == true) 
                                        //I assume here return the true/false to activate the error message but nothing work..sorry
                                    }
                                });
                            }
                        }
                    } ]
                },
                { type: "control", modeSwitchButton: false, deleteButton: false }
            ]
       });
    });
    $(".config-panel input[type=checkbox]").on("click", function() {
        var $cb = $(this);
        $("#jsGrid").jsGrid("option", $cb.attr("id"), $cb.is(":checked"));
    });     
});

请帮助,我尝试 2 天来解决问题。感谢开发人员编写我使用 jsgrid-1.4.1 的验证 js 文件

4

1 回答 1

2

原因是validate它只支持同步验证,而我们例子中的验证需要ajax调用,所以它是异步的。

你有两个选择:

  1. 预先将数据加载到客户端并验证客户端上的插入项(因此验证将是同步的)
  2. 验证方法中的插入insertItem。查看以下问题以了解更多详细信息https://github.com/tabalinas/jsgrid/issues/190
于 2016-03-29T17:35:06.607 回答