/components/com_users/models/registration.php
PHP | 443 lines | 271 code | 61 blank | 111 comment | 34 complexity | ab7b265648e28e899e01c7fb4767e46b MD5 | raw file
- <?php
- /**
- * @version $Id: registration.php 18935 2010-09-17 14:27:40Z infograf768 $
- * @package Joomla.Site
- * @subpackage com_users
- * @copyright Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
- * @license GNU General Public License version 2 or later; see LICENSE.txt
- */
- defined('_JEXEC') or die;
- jimport('joomla.application.component.modelform');
- jimport('joomla.event.dispatcher');
- jimport('joomla.plugin.helper');
- /**
- * Registration model class for Users.
- *
- * @package Joomla.Site
- * @subpackage com_users
- * @since 1.6
- */
- class UsersModelRegistration extends JModelForm
- {
- /**
- * @var object The user registration data.
- * @since 1.6
- */
- protected $data;
- /**
- * Method to activate a user account.
- *
- * @param string The activation token.
- * @return mixed False on failure, user object on success.
- * @since 1.6
- */
- public function activate($token)
- {
- $config = JFactory::getConfig();
- $userParams = JComponentHelper::getParams('com_users');
- $db = $this->getDbo();
- // Get the user id based on the token.
- $db->setQuery(
- 'SELECT `id` FROM `#__users`' .
- ' WHERE `activation` = '.$db->Quote($token) .
- ' AND `block` = 1' .
- ' AND `lastvisitDate` = '.$db->Quote($db->getNullDate())
- );
- $userId = (int) $db->loadResult();
- // Check for a valid user id.
- if (!$userId) {
- $this->setError(JText::_('COM_USERS_ACTIVATION_TOKEN_NOT_FOUND'));
- return false;
- }
- // Load the users plugin group.
- JPluginHelper::importPlugin('users');
- // Activate the user.
- $user = JFactory::getUser($userId);
- // Admin activation is on and user is verifying their email
- if (($userParams->get('useractivation') == 2) && !$user->getParam('activate', 0))
- {
- $uri = JURI::getInstance();
- jimport('joomla.user.helper');
- // Compile the admin notification mail values.
- $data = $user->getProperties();
- $data['activation'] = JUtility::getHash(JUserHelper::genRandomPassword());
- $user->set('activation', $data['activation']);
- $data['siteurl'] = JUri::base();
- $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
- $data['activate'] = $base.JRoute::_('index.php?option=com_users&task=registration.activate&token='.$data['activation'], false);
- $data['fromname'] = $config->get('fromname');
- $data['mailfrom'] = $config->get('mailfrom');
- $data['sitename'] = $config->get('sitename');
- $user->setParam('activate', 1);
- $emailSubject = JText::sprintf(
- 'COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_SUBJECT',
- $data['name'],
- $data['sitename']
- );
- $emailBody = JText::sprintf(
- 'COM_USERS_EMAIL_ACTIVATE_WITH_ADMIN_ACTIVATION_BODY',
- $data['sitename'],
- $data['name'],
- $data['email'],
- $data['username'],
- $data['siteurl'].'index.php?option=com_users&task=registration.activate&token='.$data['activation']
- );
- // get all admin users
- $query = 'SELECT name, email, sendEmail' .
- ' FROM #__users' .
- ' WHERE sendEmail=1';
- $db->setQuery( $query );
- $rows = $db->loadObjectList();
- // Send mail to all superadministrators id
- foreach( $rows as $row )
- {
- $return = JUtility::sendMail($data['mailfrom'], $data['fromname'], $row->email, $emailSubject, $emailBody);
- // Check for an error.
- if ($return !== true) {
- $this->setError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED'));
- return false;
- }
- }
- }
- //Admin activation is on and admin is activating the account
- else if (($userParams->get('useractivation') == 2) && $user->getParam('activate', 0))
- {
- $user->set('activation', '');
- $user->set('block', '0');
- $uri = JURI::getInstance();
- jimport('joomla.user.helper');
- // Compile the user activated notification mail values.
- $data = $user->getProperties();
- $user->setParam('activate', 0);
- $data['fromname'] = $config->get('fromname');
- $data['mailfrom'] = $config->get('mailfrom');
- $data['sitename'] = $config->get('sitename');
- $data['siteurl'] = JUri::base();
- $emailSubject = JText::sprintf(
- 'COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_SUBJECT',
- $data['name'],
- $data['sitename']
- );
- $emailBody = JText::sprintf(
- 'COM_USERS_EMAIL_ACTIVATED_BY_ADMIN_ACTIVATION_BODY',
- $data['name'],
- $data['siteurl'],
- $data['username']
- );
- $return = JUtility::sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody);
- // Check for an error.
- if ($return !== true) {
- $this->setError(JText::_('COM_USERS_REGISTRATION_ACTIVATION_NOTIFY_SEND_MAIL_FAILED'));
- return false;
- }
- }
- else
- {
- $user->set('activation', '');
- $user->set('block', '0');
- }
- // Store the user object.
- if (!$user->save()) {
- $this->setError(JText::sprintf('COM_USERS_REGISTRATION_ACTIVATION_SAVE_FAILED', $user->getError()));
- return false;
- }
- return $user;
- }
- /**
- * Method to get the registration form data.
- *
- * The base form data is loaded and then an event is fired
- * for users plugins to extend the data.
- *
- * @return mixed Data object on success, false on failure.
- * @since 1.6
- */
- public function getData()
- {
- if ($this->data === null) {
- $this->data = new stdClass();
- $app = JFactory::getApplication();
- $params = JComponentHelper::getParams('com_users');
- // Override the base user data with any data in the session.
- $temp = (array)$app->getUserState('com_users.registration.data', array());
- foreach ($temp as $k => $v) {
- $this->data->$k = $v;
- }
- // Get the groups the user should be added to after registration.
- $this->data->groups = isset($this->data->groups) ? array_unique($this->data->groups) : array();
- // Get the default new user group, Registered if not specified.
- $system = $params->get('new_usertype', 2);
- $this->data->groups[$system] = null;
- // Unset the passwords.
- unset($this->data->password1);
- unset($this->data->password2);
- // Get the dispatcher and load the users plugins.
- $dispatcher = JDispatcher::getInstance();
- JPluginHelper::importPlugin('users');
- // Trigger the data preparation event.
- $results = $dispatcher->trigger('onContentPrepareData', array('com_users.registration', $this->data));
- // Check for errors encountered while preparing the data.
- if (count($results) && in_array(false, $results, true)) {
- $this->setError($dispatcher->getError());
- $this->data = false;
- }
- }
- return $this->data;
- }
- /**
- * Method to get the registration form.
- *
- * The base form is loaded from XML and then an event is fired
- * for users plugins to extend the form with extra fields.
- *
- * @param array $data An optional array of data for the form to interogate.
- * @param boolean $loadData True if the form is to load its own data (default case), false if not.
- * @return JForm A JForm object on success, false on failure
- * @since 1.6
- */
- public function getForm($data = array(), $loadData = true)
- {
- // Get the form.
- $form = $this->loadForm('com_users.registration', 'registration', array('control' => 'jform', 'load_data' => $loadData));
- if (empty($form)) {
- return false;
- }
- return $form;
- }
- /**
- * Method to get the data that should be injected in the form.
- *
- * @return mixed The data for the form.
- * @since 1.6
- */
- protected function loadFormData()
- {
- return $this->getData();
- }
- /**
- * Override preprocessForm to load the user plugin group instead of content.
- *
- * @param object A form object.
- * @param mixed The data expected for the form.
- * @throws Exception if there is an error in the form event.
- * @since 1.6
- */
- protected function preprocessForm(JForm $form, $data)
- {
- parent::preprocessForm($form, $data, 'user');
- }
- /**
- * Method to auto-populate the model state.
- *
- * Note. Calling getState in this method will result in recursion.
- *
- * @since 1.6
- */
- protected function populateState()
- {
- // Get the application object.
- $app = JFactory::getApplication();
- $params = $app->getParams('com_users');
- // Load the parameters.
- $this->setState('params', $params);
- }
- /**
- * Method to save the form data.
- *
- * @param array The form data.
- * @return mixed The user id on success, false on failure.
- * @since 1.6
- */
- public function register($temp)
- {
- $config = JFactory::getConfig();
- $params = JComponentHelper::getParams('com_users');
- // Initialise the table with JUser.
- JUser::getTable('User', 'JTable');
- $user = new JUser();
- $data = (array)$this->getData();
- // Merge in the registration data.
- foreach ($data as $k => $v) {
- $temp[$k] = $v;
- }
- $data = $temp;
- // Prepare the data for the user object.
- $data['email'] = $data['email1'];
- $data['password'] = $data['password1'];
- $useractivation = $params->get('useractivation');
- // Check if the user needs to activate their account.
- if (($useractivation == 1) || ($useractivation == 2)) {
- jimport('joomla.user.helper');
- $data['activation'] = JUtility::getHash(JUserHelper::genRandomPassword());
- $data['block'] = 1;
- }
- // Bind the data.
- if (!$user->bind($data)) {
- $this->setError(JText::sprintf('COM_USERS_REGISTRATION_BIND_FAILED', $user->getError()));
- return false;
- }
- // Load the users plugin group.
- JPluginHelper::importPlugin('users');
- // Store the data.
- if (!$user->save()) {
- $this->setError(JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $user->getError()));
- return false;
- }
- // Compile the notification mail values.
- $data = $user->getProperties();
- $data['fromname'] = $config->get('fromname');
- $data['mailfrom'] = $config->get('mailfrom');
- $data['sitename'] = $config->get('sitename');
- $data['siteurl'] = JUri::base();
- // Handle account activation/confirmation emails.
- if ($useractivation == 2)
- {
- // Set the link to confirm the user email.
- $uri = JURI::getInstance();
- $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
- $data['activate'] = $base.JRoute::_('index.php?option=com_users&task=registration.activate&token='.$data['activation'], false);
- $emailSubject = JText::sprintf(
- 'COM_USERS_EMAIL_ACCOUNT_DETAILS',
- $data['name'],
- $data['sitename']
- );
- $emailBody = JText::sprintf(
- 'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY',
- $data['name'],
- $data['sitename'],
- $data['siteurl'].'index.php?option=com_users&task=registration.activate&token='.$data['activation'],
- $data['siteurl'],
- $data['username'],
- $data['password_clear']
- );
- }
- else if ($useractivation == 1)
- {
- // Set the link to activate the user account.
- $uri = JURI::getInstance();
- $base = $uri->toString(array('scheme', 'user', 'pass', 'host', 'port'));
- $data['activate'] = $base.JRoute::_('index.php?option=com_users&task=registration.activate&token='.$data['activation'], false);
- $emailSubject = JText::sprintf(
- 'COM_USERS_EMAIL_ACCOUNT_DETAILS',
- $data['name'],
- $data['sitename']
- );
- $emailBody = JText::sprintf(
- 'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY',
- $data['name'],
- $data['sitename'],
- $data['siteurl'].'index.php?option=com_users&task=registration.activate&token='.$data['activation'],
- $data['siteurl'],
- $data['username'],
- $data['password_clear']
- );
- } else {
- $emailSubject = JText::sprintf(
- 'COM_USERS_EMAIL_ACCOUNT_DETAILS',
- $data['name'],
- $data['sitename']
- );
- $emailBody = JText::sprintf(
- 'COM_USERS_EMAIL_REGISTERED_BODY',
- $data['name'],
- $data['sitename'],
- $data['siteurl']
- );
- }
- // Send the registration email.
- $return = JUtility::sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody);
- // Check for an error.
- if ($return !== true) {
- $this->setError(JText::_('COM_USERS_REGISTRATION_SEND_MAIL_FAILED'));
-
- // Send a system message to administrators receiving system mails
- $db = JFactory::getDBO();
- $q = "SELECT id
- FROM #__users
- WHERE block = 0
- AND sendEmail = 1";
- $db->setQuery($q);
- $sendEmail = $db->loadResultArray();
- if (count($sendEmail) > 0) {
- $jdate = new JDate();
- // Build the query to add the messages
- $q = "INSERT INTO `#__messages` (`user_id_from`, `user_id_to`, `date_time`, `subject`, `message`)
- VALUES ";
- $messages = array();
- foreach ($sendEmail as $userid) {
- $messages[] = "(".$userid.", ".$userid.", '".$jdate->toMySQL()."', '".JText::_('COM_USERS_MAIL_SEND_FAILURE_SUBJECT')."', '".JText::sprintf('COM_USERS_MAIL_SEND_FAILURE_BODY', $return, $data['username'])."')";
- }
- $q .= implode(',', $messages);
- $db->setQuery($q);
- $db->query();
- }
- return false;
- }
- if ($useractivation == 1)
- return "useractivate";
- else if ($useractivation == 2)
- return "adminactivate";
- else
- return $user->id;
- }
- }