*
* Login is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* Login is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* Login; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*
* @package login
*/
/**
* Handles updating the profile of the active user
*
* @package login
* @subpackage controllers
*/
class LoginUpdateProfileController extends LoginController {
/** @var boolean $hasPosted */
public $hasPosted = false;
/** @var modUser $user */
public $user;
/** @var modUserProfile $profile */
public $profile;
/**
* Load default properties for this controller
* @return void
*/
public function initialize() {
$this->modx->lexicon->load('login:updateprofile');
$this->modx->lexicon->load('login:register');
$this->setDefaultProperties(array(
'allowedExtendedFields' => '',
'emailField' => 'email',
'errTpl' => '[[+error]]',
'excludeExtended' => '',
'placeholderPrefix' => '',
'postHooks' => '',
'preHooks' => '',
'redirectToLogin' => true,
'reloadOnSuccess' => true,
'submitVar' => 'login-updprof-btn',
'successKey' => 'updpsuccess',
'successMsg' => $this->modx->lexicon('login.profile_updated'),
'successMsgPlaceholder' => 'error.message',
'syncUsername' => false,
'useExtended' => true,
'user' => '',
'validate' => '',
'errorDelimited' => '
'
));
}
/**
* Handle the UpdateProfile snippet business logic
* @return string
*/
public function process() {
if (!$this->verifyAuthentication()) return '';
if (!$this->getUser()) return '';
if (!$this->getProfile()) return '';
$this->checkForSuccessMessage();
$validate = true;
if ($this->hasPost()) {
$this->loadDictionary();
if ($this->validate()) {
if ($this->runPreHooks()) {
/* update the profile */
$result = $this->runProcessor('UpdateProfile');
if ($result !== true) {
$this->modx->toPlaceholder('message',$result,'error');
} else if ($this->getProperty('reloadOnSuccess',true,'isset')) {
$url = $this->modx->makeUrl($this->modx->resource->get('id'),'',array(
$this->getProperty('successKey','updpsuccess') => 1,
),'full');
$this->modx->sendRedirect($url);
} else {
$this->modx->setPlaceholder('login.update_success',true);
}
} else {
$validate = false;
}
} else {
$validate = false;
}
}
$this->setFieldPlaceholders();
if ($validate === false) {
$placeholderPrefix = rtrim($this->getProperty('placeholderPrefix'), '.');
$fields = $this->dictionary->toArray();
$fields = $this->escapePlaceholders($fields);
$this->modx->toPlaceholders($fields, $placeholderPrefix);
}
return '';
}
/**
* Verify the user is logged in; otherwise redirect or return false
* @return boolean
*/
public function verifyAuthentication() {
$authenticated = true;
if (!$this->modx->user->hasSessionContext($this->modx->context->get('key'))) {
$authenticated = false;
if ($this->getProperty('redirectToLogin',true,'isset')) {
$this->modx->sendUnauthorizedPage();
}
}
return $authenticated;
}
/**
* Get the specified or active user
* @return modUser
*/
public function getUser() {
$user = $this->getProperty('user',false);
if (!empty($user)) {
$c = intval($user) == 0 ? array('username' => $user) : intval($user);
$this->user = $this->modx->getObject('modUser',$c);
} else {
$this->user =& $this->modx->user;
}
if (empty($this->user)) {
$this->modx->log(modX::LOG_LEVEL_ERROR,'Could not find user: '.$user);
}
return $this->user;
}
/**
* Get the Profile of the active user
* @return modUserProfile
*/
public function getProfile() {
$this->profile = $this->user->getOne('Profile');
if (empty($this->profile)) {
$this->modx->log(modX::LOG_LEVEL_ERROR,'Could not find profile for user: '.$this->user->get('username'));
}
return $this->profile;
}
/**
* Set the user data as placeholders
* @return void
*/
public function setFieldPlaceholders() {
$placeholders = $this->profile->toArray();
$placeholderPrefix = rtrim($this->getProperty('placeholderPrefix'), '.');
/* add extended fields to placeholders */
if ($this->getProperty('useExtended', true)) {
$extended = $this->profile->get('extended');
if (!empty($extended) && is_array($extended)) {
$placeholders = array_merge($extended, $placeholders);
}
}
$this->modx->toPlaceholders($placeholders, $placeholderPrefix);
foreach ($placeholders as $k => $v) {
if (is_array($v)) {
$this->modx->toPlaceholder($k, json_encode($v), $placeholderPrefix);
}
}
}
/**
* Look for a success message by the previous updating
* @return void
*/
public function checkForSuccessMessage() {
if (!empty($_REQUEST[$this->getProperty('successKey','updpsuccess')])) {
$this->modx->setPlaceholder('login.update_success',true);
}
}
/**
* See if the form has been submitted
* @return boolean
*/
public function hasPost() {
$submitVar = $this->getProperty('submitVar');
return (!empty($_POST) && (empty($submitVar) || !empty($_POST[$submitVar])));
}
/**
* Validate the form submission
*
* @return boolean
*/
public function validate() {
$validated = false;
$this->loadValidator();
$fields = $this->validator->validateFields($this->dictionary,$this->getProperty('validate',''));
foreach ($fields as $k => $v) {
$fields[$k] = str_replace(array('[',']'),array('[',']'),$v);
}
$this->dictionary->fromArray($fields);
$this->removeSubmitVar();
$this->preventDuplicateEmails();
if ($this->validator->hasErrors()) {
$placeholders = $this->dictionary->toArray();
$placeholderPrefix = rtrim($this->getProperty('placeholderPrefix'), '.');
$errorPrefix = ($placeholderPrefix) ? $placeholderPrefix . '.error' : 'error';
$this->modx->toPlaceholders($this->validator->getErrors(), $errorPrefix);
$this->modx->toPlaceholders($placeholders, $placeholderPrefix);
foreach ($placeholders as $k => $v) {
if (is_array($v)) {
$this->modx->toPlaceholder($k, json_encode($v), $placeholderPrefix);
}
}
$errors = array();
$es = $this->validator->getErrors();
foreach ($es as $key => $error) {
$errors['message'] .= $error . $this->getProperty('errorDelimited');
}
$this->modx->toPlaceholder('message', $errors['message'], $errorPrefix);
} else {
$validated = true;
}
return $validated;
}
/**
* Remove the submitVar from the field list
* @return void
*/
public function removeSubmitVar() {
$submitVar = $this->getProperty('submitVar');
if (!empty($submitVar)) {
$this->dictionary->remove($submitVar);
}
}
/**
* If allow_multiple_emails setting is false, prevent duplicate emails
* @return void
*/
public function preventDuplicateEmails() {
$emailField = $this->getProperty('emailField','email');
$email = $this->dictionary->get($emailField);
if (!empty($email) && !$this->modx->getOption('allow_multiple_emails',null,false)) {
$emailTaken = $this->modx->getObject('modUserProfile',array(
'email' => $email,
'internalKey:!=' => $this->user->get('id'),
));
if ($emailTaken) {
$this->validator->addError($emailField,$this->modx->lexicon('login.email_taken',array('email' => $email)));
}
}
}
/**
* Run any preHooks for this snippet, that allow it to stop the form as submitted
* @return boolean
*/
public function runPreHooks() {
$validated = true;
$preHooks = $this->getProperty('preHooks','');
if (!empty($preHooks)) {
$this->loadHooks('preHooks');
$this->preHooks->loadMultiple($preHooks,$this->dictionary->toArray(),array(
'submitVar' => $this->getProperty('submitVar'),
'redirectToLogin' => $this->getProperty('redirectToLogin',true,'isset'),
'reloadOnSuccess' => $this->getProperty('reloadOnSuccess',true,'isset'),
));
$values = $this->preHooks->getValues();
if (!empty($values)) {
$this->dictionary->fromArray($values);
}
if ($this->preHooks->hasErrors()) {
$errors = array();
$es = $this->preHooks->getErrors();
$errTpl = $this->getProperty('errTpl');
foreach ($es as $key => $error) {
$errors[$key] = str_replace('[[+error]]',$error,$errTpl);
}
$this->modx->toPlaceholders($errors,'error');
$errorMsg = $this->preHooks->getErrorMessage();
$this->modx->toPlaceholder('message',$errorMsg,'error');
$validated = false;
}
}
return $validated;
}
}
return 'LoginUpdateProfileController';