/** * Updating user * * @param sfWebRequest $request * @return string - json * @author Sergey Startsev */ public function executeUpdate(sfWebRequest $request) { $response = afResponseHelper::create(); $sUsername = $request->getParameter('username'); $aUser = json_decode($request->getParameter('user'), true); // Will be passed if user - admin or he trying update his own profile if (!afStudioUser::getInstance()->isAdmin() && afStudioUser::getInstance()->getUsername() != $sUsername) { $this->forward404("You have no rights to execute this action"); } // Retrieve user via username $user = afStudioUser::retrieve($sUsername); $errors = array(); if (!$user) { return $this->renderJson($response->success(false)->message("This user doesn't exists")->asArray()); } $aUserCheck = afStudioUser::retrieveByEmail($aUser['email']); if ($aUserCheck && $aUserCheck['username'] != $aUser['username']) { $aErrors['email'] = "User with this `email` already exists"; } $aUpdate = array(afStudioUser::FIRST_NAME => $aUser['first_name'], afStudioUser::LAST_NAME => $aUser['last_name'], afStudioUser::EMAIL => $aUser['email']); if (isset($aUser['role'])) { $aUpdate[afStudioUser::ROLE] = $aUser['role']; } if (!empty($aUser['password'])) { $aUpdate[afStudioUser::PASSWORD] = $aUser['password']; } // Validate user data $validate = afStudioUser::validate($aUpdate); if (is_bool($validate) && $validate === true && empty($aErrors)) { // if password has been setted encoding using rule if (!empty($aUser['password'])) { $aUpdate[afStudioUser::PASSWORD] = afStudioUser::passwordRule($aUser['password']); } // Update processing afStudioUser::update($sUsername, $aUpdate); afsNotificationPeer::log('User has been successfully updated', 'afStudioUser'); // if changes applied for current user if (afStudioUser::getInstance()->getUsername() == $sUsername) { if (!empty($aUser['password'])) { afStudioUser::set($sUsername, $aUser['password'], false); } // update role of current user - with redirect processing if (afStudioUser::getInstance()->getRole() != $aUser['role']) { return $this->renderJson($response->redirect('afsAuthorize/signout')->asArray()); } } $response->success(true)->message('User has been successfully updated'); } else { if (is_array($validate)) { $aErrors = afsUserManagerHelper::mergeErrors($aErrors, $validate); } $aErrors = afsUserManagerHelper::prepareErrors($aErrors); $response->success(false)->message($aErrors); } return $this->renderJson($response->asArray()); }
/** * Create new user * * @param sfWebRequest $request * @return array * @author Sergey Startsev */ public static function createNewUser(sfWebRequest $request) { $response = afResponseHelper::create(); afStudioUser::getInstance()->authorize(); $sUsername = $request->getParameter('username'); $aUser = json_decode($request->getParameter('user'), true); $user = afStudioUser::retrieve($sUsername); $aErrors = array(); if ($user) { $aErrors['username'] = '******'; } if (afStudioUser::retrieveByEmail($aUser['email'])) { $aErrors['email'] = "User with this `email` already exists"; } if (!afStudioUser::getInstance()->isAdmin()) { if ($aUser['captcha'] != sfContext::getInstance()->getUser()->getFlash(afsCaptcha::SESSION_IDENTIFICATOR)) { $aErrors['captcha'] = "Invalid verification code"; } } // Prepare data for validating and creating $aCreate = array(afStudioUser::USERNAME => $sUsername, afStudioUser::FIRST_NAME => $aUser['first_name'], afStudioUser::LAST_NAME => $aUser['last_name'], afStudioUser::EMAIL => $aUser['email'], afStudioUser::PASSWORD => $aUser['password'], afStudioUser::ROLE => afStudioUser::getInstance()->isAdmin() ? $aUser['role'] : 'user'); // Validating user data $validate = afStudioUser::validate($aCreate); if (is_bool($validate) && $validate === true && empty($aErrors)) { // unset username - no need to creating meta-field username unset($aCreate[afStudioUser::USERNAME]); // Create new user afStudioUser::create($sUsername, $aCreate); afsNotificationPeer::log('User has been successfully created', 'afStudioUser'); // getting current domain $domain = sfConfig::get('app_domain') ? sfConfig::get('app_domain') : sfContext::getInstance()->getRequest()->getHost(); $aParameters = array('user' => $aUser, 'password' => $aUser['password']); sfProjectConfiguration::getActive()->loadHelpers(array("Url", "Tag")); $message = Swift_Message::newInstance()->setFrom("no-reply@{$domain}", 'Studio')->setTo($aUser['email'])->setSubject('Studio Account')->setBody(sfContext::getInstance()->getController()->getAction('afsUserManager', 'create')->getPartial('afsUserManager/create', $aParameters))->setContentType('text/html'); try { @sfContext::getInstance()->getController()->getAction('afsUserManager', 'create')->getMailer()->send($message); } catch (Swift_TransportException $e) { $response->console("Local server can't sent email for now. Please check mail server settings."); } } else { if (is_array($validate)) { $aErrors = self::mergeErrors($aErrors, $validate); } } $aErrors = self::prepareErrors($aErrors); if (!empty($aErrors)) { return $response->success(false)->message($aErrors)->asArray(); } return $response->success(true)->message('User has been successfully created')->asArray(); }