/** * Update user * * @param User $user User to be updated * @param array $data User data to be updated * @throws Exception * @return bool True if changes were made */ private function _updateUser(User $user, array $data) { Logger::debug(__METHOD__ . '::' . var_export($data, true)); #if(isset($data['email']) && '' != $data['email'] && $data['email'] != $user->getEmail()) { # $user->setEmail($data['email']); #} $profile = $user->getProfile(); $social = $profile->getSocialNetworkIdentities(); // Track changes $changes = array(PROFILE_EDIT => array(), SOCIAL_EDIT => array(), USER_EDIT => array()); foreach ($data as $key => $newValue) { Logger::debug(__METHOD__ . ":: {$key}"); if (in_array($key, array('firstName', 'lastName', 'phone'))) { Logger::debug(__METHOD__ . ':: Profile key'); $type = PROFILE_EDIT; $oldValue = $profile->{'get' . ucfirst($key)}(); } elseif (preg_match('/^social(\\d+)$/', $key, $matches)) { Logger::debug(__METHOD__ . ':: Social key: social' . $matches[1]); $type = SOCIAL_EDIT; $oldValue = $social[$matches[1] - 1]; } else { Logger::debug(__METHOD__ . ':: User key'); $type = USER_EDIT; $oldValue = $user->{'get' . ucfirst($key)}(); } Logger::debug(__METHOD__ . ":: OLD => " . (is_object($oldValue) ? get_class($oldValue) : var_export($oldValue, true))); Logger::debug(__METHOD__ . ":: NEW => " . (is_object($newValue) ? get_class($newValue) : var_export($newValue, true))); // Only update changed properties, and keep track of the changes as well if ($this->_valueChanged($oldValue, $newValue)) { Logger::debug(__METHOD__ . ":: {$key} has changed"); Logger::debug(__METHOD__ . ":: OLD => " . (is_object($oldValue) ? get_class($oldValue) : var_export($oldValue, true))); Logger::debug(__METHOD__ . ":: NEW => " . (is_object($newValue) ? get_class($newValue) : var_export($newValue, true))); $oldVal = $oldValue; $newVal = $newValue; if ($newValue instanceof Rexmac\Zyndax\Form\Element\SocialNetworkIdentity && $oldValue instanceof Rexmac\Zyndax\Entity\UserSocialNetworkIdentity) { $newVal = $newValue->getIdentityName() . '@' . SocialNetworkService::findOneById($newValue->getNetwork())->getName(); $oldVal = $oldValue->getName() . '@' . $oldValue->getSocialNetwork()->getName(); } elseif (is_object($newValue)) { if (isset($oldValue)) { $oldVal = $oldValue->getName(); } else { $oldVal = ''; } $newVal = $newValue->getName(); } elseif (is_object($oldValue)) { $oldVal = $oldValue->getName(); } $changes[$type][] = array('item' => $key, 'oldValue' => $oldVal, 'newValue' => $newVal); // Set new value if ($type === SOCIAL_EDIT) { if ('' === $newValue->getIdentityName()) { $removed = $profile->removeSocialNetworkIdentity($oldValue); Logger::debug(__METHOD__ . ':: Removed? ' . var_export($removed, true)); UserSocialNetworkIdentityService::delete($oldValue); #$profile->setSocialNetworkIdentities(UserSocialNetworkIdentityService::findBy(array('userProfile', $profile->getId()))); } else { $oldValue->setSocialNetwork(SocialNetworkService::findOneById($newValue->getNetwork())); $oldValue->setName($newValue->getIdentityName()); } } elseif ($type === PROFILE_EDIT) { $profile->{'set' . ucfirst($key)}($newValue); } else { $user->{'set' . ucfirst($key)}($newValue); } } } UserService::update(); UserProfileService::update(); UserSocialNetworkIdentityService::update(); // Any changes to record? $changed = false; foreach (array(PROFILE_EDIT, SOCIAL_EDIT, USER_EDIT) as $type) { Logger::debug(__METHOD__ . ':: Examining ' . $type . ' changes...'); if (count($changes[$type]) > 0) { Logger::debug(__METHOD__ . ':: changes[\'' . $type . '\'] = ' . var_export($changes[$type], true)); $description = ''; foreach ($changes[$type] as $change) { Logger::debug(__METHOD__ . ':: change = ' . var_export($change, true)); $description .= sprintf('%s changed from "%s" to "%s".', $change['item'], $change['oldValue'] === 0 ? '0' : $change['oldValue'], $change['newValue']) . PHP_EOL; Logger::debug(__METHOD__ . ':: description = ' . $description); } UserEditEventService::create(array('user' => $user, 'editor' => $this->_user, 'ip' => $this->getRequest()->getServer('REMOTE_ADDR'), 'date' => new DateTime(), 'description' => rtrim($description))); $changed = true; } } return $changed; }
/** * Update User entity * * @param User $user * @param array $data * @return void */ private function _updateUser(User $user, array $data) { if (isset($data['newPassword']) && '' != $data['newPassword']) { // Verify old password #if(!UserService::verifyPassword($this->_user, $data['password'])) { # throw new Exception('Current password is invalid'); #} $data['password'] = UserService::encryptPassword($data['newPassword']); } else { $data['password'] = $user->getPassword(); } unset($data['newPassword']); unset($data['newPasswordConfirm']); if (isset($data['role'])) { $data['role'] = AclRoleService::findOneById($data['role']); } if (isset($data['timeZone'])) { $data['timeZone'] = TimeZoneService::findOneById($data['timeZone']); } // Track changes $changes = array(); foreach ($data as $key => $newValue) { if ($key === 'userId') { continue; } $oldValue = $user->{'get' . ucfirst($key)}(); Logger::debug(__METHOD__ . ":: {$key}"); Logger::debug(__METHOD__ . ":: OLD => " . (is_object($oldValue) ? get_class($oldValue) : var_export($oldValue, true))); Logger::debug(__METHOD__ . ":: NEW => " . (is_object($newValue) ? get_class($newValue) : var_export($newValue, true))); // Only update changed properties, and keep track of the changes as well if ($this->_valueChanged($oldValue, $newValue)) { Logger::debug(__METHOD__ . ":: {$key} has changed"); Logger::debug(__METHOD__ . ":: OLD => " . (is_object($oldValue) ? get_class($oldValue) : var_export($oldValue, true))); Logger::debug(__METHOD__ . ":: NEW => " . (is_object($newValue) ? get_class($newValue) : var_export($newValue, true))); $oldVal = $oldValue; $newVal = $newValue; if (is_object($newValue)) { if (isset($oldValue)) { $oldVal = $oldValue->getName(); } else { $oldVal = ''; } $newVal = $newValue->getName(); } elseif (is_object($oldValue)) { $oldVal = $oldValue->getName(); } $changes[] = array('item' => $key, 'oldValue' => $oldVal, 'newValue' => $newVal); // Set new value $user->{'set' . ucfirst($key)}($newValue); } } UserService::update(); // Any changes to record? if (count($changes) > 0) { $description = ''; foreach ($changes as $change) { $description .= sprintf('%s changed from "%s" to "%s".', $change['item'], $change['oldValue'] === 0 ? '0' : $change['oldValue'], $change['newValue']) . PHP_EOL; } UserEditEventService::create(array('user' => $user, 'editor' => $this->_user, 'ip' => $this->getRequest()->getServer('REMOTE_ADDR'), 'date' => new DateTime(), 'description' => rtrim($description))); return true; } return false; }