【问题标题】:How can I check the inserted/edited item in jsgrid isn't duplicate?如何检查 jsgrid 中插入/编辑的项目是否重复?
【发布时间】:2016-03-29 07:26:50
【问题描述】:

我尝试为 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);
?>

在basic.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 天来解决这个问题。 感谢开发人员编写验证 js 文件 我用的是jsgrid-1.4.1

【问题讨论】:

    标签: javascript php jsgrid


    【解决方案1】:

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

    你有两个选择:

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

    【讨论】:

    • 对不起!我试过了,但没有成功;我认为这个 $.ajax({type: "CHGO",url: "..bin/Checkvalue.php",data:item.Name, dataType: "json"}); 有问题我将其更改为 POST 但实际上什么都没有
    • 你的意思是在 ajax 函数中使用 async: false
    • 不,async: false 已弃用。我在第一个选项中的意思是做类似$.ajax({ / * request to load existing items in DB */ }).done(function(existingItems) { $("#jsGrid").jsGrid( /* config of jsGrid with validate function, which will try to find value in existingItems before insert */ ) }) 的事情。希望它更清楚。
    • 我这样做了,我使用onItemInserting: function(args){} 更改了我的工作仍然相同,....所以我从 Jquery.ajax 进行了很少的测试返回值,如下所示:............ . onItemInserting: function(args) { if(args.item.Name != "") { var dataa = function(){ var tmp = null; $.ajax({type:"CHGO",url:"../bin/Checkvalue.php",data:({Name:args.item.Name}),success: function (data) {tmp = 123;} });返回tmp;}(); if(dataa === 123){ args.cancel = true; alert("Duplicated Value");}}}, ........我得到的是(null)
    • 我想也许应该使用done() function,但没有成功
    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 2013-01-03
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多