Index: branches/5.2.x/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r14726 -r14758 --- branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14726) +++ branches/5.2.x/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 14758) @@ -1,6 +1,6 @@ Array ('self' => true, 'subitem' => true), 'OnValidateMInputFields' => Array ('self' => 'view'), + 'OnValidateField' => Array ('self' => true, 'subitem' => true), ); $this->permMapping = array_merge($this->permMapping, $permissions); } @@ -1806,13 +1807,14 @@ /* @var $temp_handler kTempTablesHandler */ $temp_handler->CancelEdit(); - $this->clearSelectedIDs($event); - $event->setRedirectParams(Array ('opener' => 'u'), true); + $this->Application->RemoveVar($event->getPrefixSpecial() . '_modified'); $changes_var_name = $this->Prefix . '_changes_' . $this->Application->GetTopmostWid($this->Prefix); $this->Application->RemoveVar($changes_var_name); + + $event->SetRedirectParam('opener', 'u'); } /** @@ -3029,6 +3031,49 @@ } /** + * Validates individual object field and returns the result + * + * @param kEvent $event + */ + function OnValidateField(&$event) + { + $event->status = kEvent::erSTOP; + $field = $this->Application->GetVar('field'); + + if ( ($this->Application->GetVar('ajax') != 'yes') || !$field ) { + return; + } + + $object =& $event->getObject(Array ('skip_autoload' => true)); + /* @var $object kDBItem */ + + $items_info = $this->Application->GetVar($event->getPrefixSpecial(true)); + + if ( !$items_info ) { + return; + } + + list ($id, $field_values) = each($items_info); + $object->Load($id); + $object->SetFieldsFromHash($field_values); + $object->setID($id); + + $response = Array ('status' => 'OK',); + + $event->CallSubEvent($object->isLoaded() ? 'OnBeforeItemUpdate' : 'OnBeforeItemCreate'); + + // validate all fields, since "Password_plain" field sets error to "Password" field, which is passed here + $error_field = $object->GetFieldOption($field, 'error_field', false, $field); + + if ( !$object->Validate() && $object->GetErrorPseudo($error_field) ) { + $response['status'] = $object->GetErrorMsg($error_field); + } + + $event->status = kEvent::erSTOP; // since event's OnBefore... events can change this event status + echo json_encode($response); + } + + /** * Returns auto-complete values for ajax-dropdown * * @param kEvent $event