Index: branches/5.2.x/core/kernel/utility/formatters/password_formatter.php =================================================================== diff -u -N -r14748 -r14758 --- branches/5.2.x/core/kernel/utility/formatters/password_formatter.php (.../password_formatter.php) (revision 14748) +++ branches/5.2.x/core/kernel/utility/formatters/password_formatter.php (.../password_formatter.php) (revision 14758) @@ -1,6 +1,6 @@ $field_name, 'formatter' => 'kPasswordFormatter'); + $options = Array ('master_field' => $field_name, /*'error_field' => $field_name,*/ 'formatter' => 'kPasswordFormatter'); $copy_options = Array ('encryption_method', 'salt', 'required', 'skip_empty'); foreach ($copy_options as $copy_option) { @@ -80,7 +80,7 @@ $fields_set = true; $password_field = $verify_field = ''; $fields = Array ('master_field', 'verify_field'); - + // 1. collect values from both Password and VerifyPassword fields while ($flip_count < 2) { if ( getArrayValue($options, $fields[0]) ) { Index: branches/5.2.x/core/units/users/users_event_handler.php =================================================================== diff -u -N -r14728 -r14758 --- branches/5.2.x/core/units/users/users_event_handler.php (.../users_event_handler.php) (revision 14728) +++ branches/5.2.x/core/units/users/users_event_handler.php (.../users_event_handler.php) (revision 14758) @@ -1,6 +1,6 @@ Application->RecallVar('user_id'); $items_info = $this->Application->GetVar($event->getPrefixSpecial(true)); - if ( $event->Name == 'OnCreate' && $user_id == USER_GUEST ) { + if ( ($event->Name == 'OnCreate' || $event->Name == 'OnRegisterAjax') && $user_id == USER_GUEST ) { // "Guest" can create new users return true; } @@ -404,6 +404,21 @@ } /** + * Processes user registration from ajax request + * + * @param kEvent $event + * @return void + * @access protected + */ + protected function OnRegisterAjax(kEvent &$event) + { + $ajax_form_helper =& $this->Application->recallObject('AjaxFormHelper'); + /* @var $ajax_form_helper AjaxFormHelper */ + + $ajax_form_helper->transitEvent($event, 'OnCreate'); + } + + /** * Returns subscribed user ID by given e-mail address * * @param string $email Index: branches/5.2.x/core/units/users/users_config.php =================================================================== diff -u -N -r14726 -r14758 --- branches/5.2.x/core/units/users/users_config.php (.../users_config.php) (revision 14726) +++ branches/5.2.x/core/units/users/users_config.php (.../users_config.php) (revision 14758) @@ -1,6 +1,6 @@ Array ('default' => ''), 'Fax' => Array ('default' => ''), 'Street' => Array ('default' => ''), - 'Street2' => Array ('default' => ''), + 'Street2' => Array ('error_field' => 'Street', 'default' => ''), 'City' => Array ('default' => ''), 'State' => Array ( 'formatter' => 'kOptionsFormatter', 'options' => Array (), @@ -435,7 +435,7 @@ 'FullUrl' => Array ('default' => ''), 'SubscribeToMailing' => Array ( - 'formatter' => 'kOptionsFormatter', 'options' => Array (0 => 'lu_No', 1 => 'lu_Yes'), 'use_phrases' => 1, + 'formatter' => 'kOptionsFormatter', 'options' => Array (1 => 'lu_Yes', 0 => 'lu_No'), 'use_phrases' => 1, 'default' => 0, ), ), 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 Index: branches/5.2.x/core/units/helpers/ajax_form_helper.php =================================================================== diff -u -N --- branches/5.2.x/core/units/helpers/ajax_form_helper.php (revision 0) +++ branches/5.2.x/core/units/helpers/ajax_form_helper.php (revision 14758) @@ -0,0 +1,72 @@ +getObject(); + /* @var $object kDBItem */ + + $error_msgs = Array (); + + $field_errors = array_keys( $object->GetFieldErrors() ); + + foreach ($field_errors as $field) { + if ( !$object->GetErrorPseudo($field) ) { + continue; + } + + if ( $object->GetFieldOption($field, 'formatter') == 'kMultiLanguage') { + $field = 'l' . $this->Application->GetVar('m_lang') . '_' . $field; + } + + $error_field = $object->GetFieldOption($field, 'error_field', false, $field); + $error_msgs[$field] = $object->GetErrorMsg($error_field); + } + + $response['status'] = 'FAILED'; + $response['field_errors'] = $error_msgs; + } + + /** + * Sends JSON-encoded responce as event result to the browser + * + * @param kEvent $event + * @param Array $response + */ + function sendResponse(&$event, $response) + { + $json_helper =& $this->Application->recallObject('JSONHelper'); + /* @var $json_helper JSONHelper */ + + echo $json_helper->encode($response); + + $event->status = kEvent::erSTOP; + } + + /** + * Calls given event and returns nice JSON output + * + * @param kEvent $event + * @param string $call_event + * @param Array $params + */ + function transitEvent(&$event, $call_event, $params = Array ()) + { + $params['status'] = 'OK'; + $event->CallSubEvent($call_event); + + if ( $event->status != kEvent::erSUCCESS ) { + $this->prepareJSONErrors($event, $params); + } + + $this->sendResponse($event, $params); + } + } \ No newline at end of file Index: branches/5.2.x/core/units/helpers/helpers_config.php =================================================================== diff -u -N -r14714 -r14758 --- branches/5.2.x/core/units/helpers/helpers_config.php (.../helpers_config.php) (revision 14714) +++ branches/5.2.x/core/units/helpers/helpers_config.php (.../helpers_config.php) (revision 14758) @@ -1,6 +1,6 @@ 'DeploymentHelper', 'class' => 'DeploymentHelper', 'file' => 'deployment_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), Array ('pseudo' => 'BackupHelper', 'class' => 'BackupHelper', 'file' => 'backup_helper.php', 'build_event' => ''), + Array ('pseudo' => 'AjaxFormHelper', 'class' => 'AjaxFormHelper', 'file' => 'ajax_form_helper.php', 'build_event' => '', 'require_classes' => 'kHelper'), ), ); \ No newline at end of file