2016-06-26 10 views
4

Mit dem jQuery-Datentabelle-Editor-Plug-in funktioniert der folgende Code wie vorgesehen. Es führt bestimmte Validierungen durch (einige Felder wurden der Kürze wegen weggelassen).Validierung mit Inline-Bearbeitung in jQuery-Datatabellen nach dem Anpassen von Leerstellen

Editor::inst($db, 'file_upload') 
    ->fields(
     Field::inst('id')->validator('Validate::notEmpty'), 

     Field::inst('name')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      return $length > 30 ? 'Length must be 30 characters or less' : true; 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }), 

     Field::inst('document_title')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      return $length > 50 ? 'Length must be 50 characters or less' : true; 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }), 

     Field::inst('email_address')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      return $length > 60 ? 'Length must be 60 characters or less' : true; 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }) 
    )->where(function ($q) { 
     $q->where('file_type', "('jpg', 'jpeg', 'gif', 'png')", 'IN', false); 
    })->process($_POST) 
    ->json(); 

Aber wenn die Validierungslogik ist etwas wie das folgende geändert,

Editor::inst($db, 'file_upload') 
    ->fields(
     Field::inst('id')->validator('Validate::notEmpty'), 

     Field::inst('name')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      // The following line has been modified 
      return $length === 0 ? 'This field is required' : ($length > 30 ? 'Length must be 30 characters or less' : true); 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }), 

     Field::inst('document_title')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      // The following line has been modified 
      return $length === 0 ? 'This field is required' : ($length > 50 ? 'Length must be 50 characters or less' : true); 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }), 

     Field::inst('email_address')->validator('Validate::notEmpty') 
     ->validator(function ($val, $data, $opts) { 
      $length = strlen(trim(preg_replace('/\s+/', ' ', $val))); 
      // The following line has been modified 
      return $length === 0 ? 'This field is required' : ($length > 60 ? 'Length must be 60 characters or less' : true); 
     })->getFormatter(function ($val, $data, $opts) { 
      return htmlspecialchars($val, ENT_QUOTES, "UTF-8"); 
     })->setFormatter(function ($val, $data, $opts) { 
      return trim(preg_replace('/\s+/', ' ', $val)); 
     }) 
    )->where(function ($q) { 
     $q->where('file_type', "('jpg', 'jpeg', 'gif', 'png')", 'IN', false); 
    })->process($_POST) 
    ->json(); 

In diesem Fall Validierungen durchgeführt werden, wie sie sollten aber Werte werden nicht vorgelegt (und gleichzeitig die Datentabelle nicht aktualisiert) zur Datenbank. Das Inline-Bearbeitungsfeld bleibt geöffnet, nachdem die Eingabetaste gedrückt wurde.

Was könnte der Grund sein und wie man es beheben kann? Möglicherweise entgeht mir etwas ganz Einfaches über PHP.

Ich werde das entsprechende Client-Skript bei Bedarf veröffentlichen.


Es scheint, dass andere Validierer werden ausgelöst, wenn zusätzliche Bedingungen erzwungen werden verhindert Eingabewerte aus auf die abstrakte Ebene vorgelegt werden, Datenbank. Dies sollte nicht bei der Bearbeitung von Inline-Zellen passieren.

Was ist das Heilmittel?

Antwort

1

Wenn die einzigen Änderungen an Ihrem Code die Zeilen sind, die Sie mit Ihren Kommentaren hervorgehoben haben, würde ich vermuten, dass das Problem darin besteht, dass Sie den verschachtelten ternären Operator verwenden. Diese two separaten questions im PHP-Tag möglicherweise einige Dinge aufheben, aber im Grunde die schnelle Version ist, dass der ternären Operator PHP hat ein seltsames Verhalten, und so ist es nicht zu empfehlen, sie geschachtelt zu verwenden. Ich würde Sie versuchen, zu einem Standard-Schalt empfehlen, wenn/else-Anweisung zu sehen, ob das Ihr Problem löst, so

if($length === 0){ 
    return 'This field is required'; 
} 
else if($length > 50){ 
    return 'Length must be 50 characters or less'; 
} 
else{ 
    return true; 
} 

Während dies länger sein kann, wird es wahrscheinlich viel einfacher zu debuggen, und ich vermute, basierend auf Frage, ob das alles geändert wurde, kommt dein Problem auf die left-associative ternary operator nesting; während in fast jede andere Sprache ternäre Operatoren rechts assoziativ sind.

Hier ist one more link empfehle gegen verschachtelte ternäre Operatoren in PHP. Das Textfeld, das nach dem Drücken von submit geöffnet bleibt, ist Standard für einen DataTables-JavaScript-Formularfehler. Dies ist normal, wenn eine CRUD-Operation serverseitig den erwarteten Wert nicht an den Client zurückgibt (überprüfen Sie Ihre Browser-Entwicklerkonsole, um sicherzustellen, dass dies nicht der Fall ist) einen JS Fehler zu bekommen, empfehle ich Firebug für Firefox, wenn Sie einen wirklich robusten wollen. Wenn Sie nach dem Ändern Ihres Codes den if/else-Block anstelle der ternären Operatoren verwenden, haben Sie immer noch den Fehler. Dann würde ich in Ihren clientseitigen Code schauen, um sicherzustellen, dass sich nichts geändert hat (Sie könnten ihn in der Frage auch posten) dein Problem nicht lösen.