2016-03-29 7 views
1

Ich habe versucht, benutzerdefinierte Validator für Jsgrid, die das Element überprüfen zu erstellen. Name ist wirklich aus der DB oder nicht vor dem Einfügen oder Bearbeiten, um jede doppelte Zeile zu vermeiden.Wie kann ich überprüfen, ob das eingefügte/editierte Element in jsgrid nicht dupliziert ist?

das Problem Ich las dreimal die Dokumente von jsgrid, aber ich habe keine Ahnung, wie Sie das Problem beheben.

diese Arbeit https://github.com/tabalinas/jsgrid-php half mir zu viel und ich verwandelte sich, um für meine Arbeit und mysqli nützlich zu sein.

die Idee: I Funktionskontrolle DB gemacht, wenn der Wert vorhanden ist oder nicht, ist es in einer PHP-Klasse wahr sonst falsch zurück, wenn vorhanden

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; 
    } 
} 

und ich nannte diese Funktion in einer externen Datei „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); 
?> 

in 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")); 
    });  
}); 

bitte helfen, ich bin Versuch f oder 2 Tage, um das Problem zu beheben. Dank für die Entwickler zum Schreiben der Validate js Datei verwenden ich jsgrid-1.4.1

Antwort

1

Der Grund dafür ist, dass validate nur synchrone Validierung unterstützt, und die Validierung von unserem Beispiel erfordert Ajax-Aufruf, es ist also asynchron.

Sie haben zwei Möglichkeiten:

  1. Belastungsdaten an den Client vorher und Validierung auf dem Client Einfügen Punkt (so wird die Validierung synchron)
  2. Validate Einfügung in insertItem Methode. Überprüfen Sie das folgende Problem, um mehr Details zu erfahren https://github.com/tabalinas/jsgrid/issues/190
+0

Sorry !, Ich habe es versucht, aber nicht erfolgreich; Ich denke, es gibt ein Problem in diesem $ .ajax ({Typ: "CHGO", URL: "..bin/Checkvalue.php", Daten: item.Name, dataType: "json"}); Ich ändere es in POST aber wirklich nichts –

+0

meinst du async verwenden: false in Ajax-Funktion –

+0

Nein, Async: false ist veraltet. Was ich in der ersten Option meinte, ist etwas wie '$ .ajax ({/ * Anfrage zum Laden vorhandener Elemente in DB * /}). Done (function (existingItems) {$ (" # jsGrid "). JsGrid (/ * config von jsGrid mit validate Funktion, die versuchen wird Wert in existingItems vor dem Einfügen * /)}) 'zu finden. Ich hoffe es ist klarer. – tabalin