ChronoEngine.com homepage

Forums

Please write a review for the extension you are using on the Joomla extensions directory before posting a new question as we are being spammed by many negative reviews.

Thank you for your support!

Joomla Registration after adding custom field in User table

wlwan 03 Aug, 2015
Dears,
I have added one extra field "email2" as the cc field for email to client (it is a optional field). I would like to add this field to the joomla backend and a registration form which is for internal use only. Did check for the coding located below but not sure how to change it.... Any ideas?

packages\com_chronoforms5\admin\chronoforms\actions\joomla_registration\joomla_registration.php
<?php
/**
* ChronoCMS version 1.0
* Copyright (c) 2012 ChronoCMS.com, All rights reserved.
* Author: (ChronoCMS.com Team)
* license: Please read LICENSE.txt
* Visit http://www.ChronoCMS.com for regular updates and information.
**/
namespace GCore\Admin\Extensions\Chronoforms\Actions\JoomlaRegistration;
use JFactory;
use JRequest;
use JComponentHelper;
use JUserHelper;
use JError;
use JText;
use JURI;
use JRoute;
use JMail;
use JDate;
/* @copyright:ChronoEngine.com @license:GPLv2 */defined('_JEXEC') or die('Restricted access');
defined("GCORE_SITE") or die;
Class JoomlaRegistration extends \GCore\Admin\Extensions\Chronoforms\Action{
	static $title = 'Joomla Registration';
	//static $setup = array('simple' => array('title' => 'Captcha'));
	static $group = array('joomla' => 'Joomla');
	static $platforms = array('joomla');

	var $events = array('success' => 0, 'fail' => 0);

	var $defaults = array(
		'name' => '',
		'username' => '',
		'email' => '',
		'email2' => '',
		'password' => '',
		'password2' => '',
		'override_allow_user_registration' => 1,
		'new_usertype' => 'Registered',
		'useractivation' => 1,
		'activation_link' => '',
		'random_password' => 0,
		'auto_login' => 0,
		'send_joo_activation' => 0,
		'enable_cb_support' => 0,
		'user_data_path' => '',
		'display_reg_complete' => 0
	);
	var $config = null;

	function execute(&$form, $action_id){
		$config =  $form->actions_config[$action_id];
		$config = new \GCore\Libs\Parameter($config);
		$this->config = $config;
		
		//set activation link
		if(trim($this->config->get('activation_link', '')) == ''){
			$this->config->set('activation_link', 'index.php?option=com_users&task=registration.activate');
		}
		// Get required system objects
		$user 		= clone(JFactory::getUser());
		$mainframe = JFactory::getApplication();
		//$config		= JFactory::getConfig();
		$authorize	= JFactory::getACL();
		$document   = JFactory::getDocument();
		$language = JFactory::getLanguage();
        $language->load('com_users');

		// If user registration is not allowed, show 403 not authorized.
		$usersConfig = JComponentHelper::getParams( 'com_users' );
		if($usersConfig->get('allowUserRegistration') == '0' && !$config->get('override_allow_user_registration', 0)){
			JError::raiseError( 403, JText::_( 'Access Forbidden' ));
			return;
		}

		// Initialize new usertype setting
		$userConfig = JComponentHelper::getParams('com_users');
		// Default to Registered.
		$defaultUserGroup = $config->get('new_usertype', '');
		if(empty($defaultUserGroup)){
			$defaultUserGroup = $userConfig->get('new_usertype', array(2));
		}else{
			$_groups = $defaultUserGroup;//explode(",", trim($defaultUserGroup));
			$defaultUserGroup = array();
			foreach($_groups as $_group){
				$defaultUserGroup[] = (int)$_group;
			}
		}
		
		//set the post fields values
		$form->data['name'] = $form->data($config->get('name', ''), '');
		$form->data['username'] = $form->data($config->get('username', ''), '');
		$form->data['email'] = $form->data($config->get('email', ''), '');
		$form->data['email2'] = $form->data($config->get('email2', ''), '');
		$form->data['password'] = $form->data($config->get('password', ''), '');
		$form->data['password2'] = $form->data($config->get('password2', ''), '');
		
		//generate the random pass if enabled
		if((int)$config->get('random_password', 0) == 1){
			jimport('joomla.user.helper');
			$random_pass = JUserHelper::genRandomPassword();
			$form->data['password'] = $random_pass;
			$form->data['password2'] = $random_pass;
		}
		//check empty fields
		$checks = array('name', 'username', 'email','email2', 'password');
		foreach($checks as $check){
			if(!trim($form->data[$check])){
				$this->events['fail'] = 1;
				$form->errors[$config->get($check)] = 'You must provide your '.$check.'.';
				//return false;
			}
		}
		if($this->events['fail'] == 1){
			return false;
		}
		//check the 2 passwords
		if($form->data['password'] != $form->data['password2']){
			$this->events['fail'] = 1;
			$form->errors[$config->get('password2')] = 'Passwords do NOT match.';
			$form->debug[] = "Couldn't create new user, Passwords do NOT match.";
			return false;
		}
		// Bind the post array to the user object
		$post_data = $form->data;
		if(!$user->bind($post_data, 'usertype')){
			//JError::raiseError( 500, $user->getError());
			$this->events['fail'] = 1;
			$form->errors[] = $user->getError();
			$form->debug[] = "Couldn't bind new user, Joomla returned this error : ".$user->getError();
			return false;
		}

		// Set some initial user values
		$user->set('id', 0);
		$user->set('usertype', 'deprecated');
		$user->set('groups', $defaultUserGroup);

		$date = JFactory::getDate();
		$user->set('registerDate', date('Y-m-d H:i:s', time()));

		// If user activation is turned on, we need to set the activation information
		$useractivation = $config->get('useractivation', $usersConfig->get('useractivation'));
		if (($useractivation == 1) || ($useractivation == 2)) {
			jimport('joomla.user.helper');
			$user->set('activation', md5(JUserHelper::genRandomPassword()));
			$user->set('block', '1');
		}

		// If there was an error with registration, set the message and display form
		if(!$user->save()){
			/*JError::raiseWarning('', JText::_( $user->getError()));
			$this->register();*/
			$this->events['fail'] = 1;
			$form->errors[] = $user->getError();
			$form->debug[] = "Couldn't save new user, Joomla returned this error : ".$user->getError();
			return false;
		}else{
			$this->events['success'] = 1;
		}
		//store user data
		$user_data = (array)$user;
		$removes = array('params', '_params', 'guest', '_errorMsg', '_errors');
		foreach($removes as $remove){
			unset($user_data[$remove]);
		}
		$form->data['_PLUGINS_']['joomla_registration'] = $user_data;
		//inject user data under the correct data path
		if(strlen(trim($config->get('user_data_path', ''))) > 0){
			$form->data = $form->set_array_value($form->data, explode('.', trim($config->get('user_data_path', ''))), $user_data);
		}
		
		//CB support
		if((bool)$config->get('enable_cb_support', 0) === true){
			/********************CB part*************************/
			$database = JFactory::getDBO();
			$database->setQuery( "SELECT * FROM #__comprofiler_fields WHERE `table`='#__comprofiler' AND name <>'NA' AND registration = '1'" );
			$fields = $database->loadObjectList();
			$default_fields_names = array('id', 'user_id');
			$default_fields_values = array('id' => $user_data['id'], 'user_id' => $user_data['id']);
			foreach($fields as $field){
				$default_fields_names[] = $field->name;
				$fieldname = $field->name;
				$default_fields_values[$fieldname] = $form->data($fieldname, '');
			}
			/*$database->setQuery( "INSERT INTO #__comprofiler (".implode(",", $default_fields_names).") VALUES  ('".implode("','", $form->escapeVar($default_fields_values))."');" );
			if (!$database->query()) {
				JError::raiseWarning(100, $database->getErrorMsg());
			}*/
			
			\GCore\Libs\GModel::generateModel('Profiler', array(
				'tablename' => '#__comprofiler',
			));
			\GCore\Models\Profiler::getInstance()->save($default_fields_values);
			/**********************************************/
		}
		// Send registration confirmation mail
		$password = $form->data['password'];//JRequest::getString('password', '', 'post', JREQUEST_ALLOWRAW);
		$password = preg_replace('/[\x00-\x1F\x7F]/', '', $password); //Disallow control chars in the email
		if((int)$config->get('send_joo_activation', 0) == 1){
			$this->_sendMail($user, $password, $config);
		}
		// Everything went fine, set relevant message depending upon user activation state and display message
		if((int)$useractivation == 2){
			$message  = JText::_('COM_USERS_REGISTRATION_COMPLETE_VERIFY');
		}else if((int)$useractivation == 1){
			$message  = JText::_('COM_USERS_REGISTRATION_COMPLETE_ACTIVATE');
		}else{
			$message = JText::_('COM_USERS_REGISTRATION_SAVE_SUCCESS');
		}
		
		if($config->get('display_reg_complete', 0) == 1){
			echo $message;
		}
		
		if((int)$config->get('auto_login', 0) == 1){
			$credentials = array();
			$credentials['username'] = $form->data['username'];
			$credentials['password'] = $form->data['password'];
			$mainframe->login($credentials);
		}
	}
	
	function _sendMail(&$user, $password, $config)
	{
		$mainframe = JFactory::getApplication();

		$db		= JFactory::getDBO();

		$name 		= $user->get('name');
		$email 		= $user->get('email');
		$email2 	= $user->get('email2');
		$username 	= $user->get('username');

		$usersConfig 	= JComponentHelper::getParams( 'com_users' );
		$sitename 		= $mainframe->getCfg( 'sitename' );
		//$useractivation = $usersConfig->get( 'useractivation' );
		$useractivation = $config->get('useractivation', $usersConfig->get('useractivation'));
		$sendpassword	= $usersConfig->get('sendpassword', 1);
		$mailfrom 		= $mainframe->getCfg( 'mailfrom' );
		$fromname 		= $mainframe->getCfg( 'fromname' );
		$siteURL		= JURI::base();
		
		$jconfig = JFactory::getConfig();
		// Compile the notification mail values.
		$data = $user->getProperties();
		$data['fromname']	= $jconfig->get('fromname');
		$data['mailfrom']	= $jconfig->get('mailfrom');
		$data['sitename']	= $jconfig->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::_(trim($this->config->get('activation_link', '')).'&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'].trim($this->config->get('activation_link', '')).'&token='.$data['activation'],
				$data['siteurl'],
				$data['username'],
				$data['password_clear']
			);
			*/
			if($sendpassword){
				$emailBody = JText::sprintf(
				'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY',
				$data['name'],
				$data['sitename'],
				$data['activate'],
				$data['siteurl'],
				$data['username'],
				$data['password_clear']
				);
			}else{
				$emailBody = JText::sprintf(
				'COM_USERS_EMAIL_REGISTERED_WITH_ADMIN_ACTIVATION_BODY_NOPW',
				$data['name'],
				$data['sitename'],
				$data['activate'],
				$data['siteurl'],
				$data['username']
				);
			}
		}
		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::_(trim($this->config->get('activation_link', '')).'&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'].trim($this->config->get('activation_link', '')).'&token='.$data['activation'],
				$data['siteurl'],
				$data['username'],
				$data['password_clear']
			);*/
			if($sendpassword){
				$emailBody = JText::sprintf(
				'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY',
				$data['name'],
				$data['sitename'],
				$data['activate'],
				$data['siteurl'],
				$data['username'],
				$data['password_clear']
				);
			}else{
				$emailBody = JText::sprintf(
				'COM_USERS_EMAIL_REGISTERED_WITH_ACTIVATION_BODY_NOPW',
				$data['name'],
				$data['sitename'],
				$data['activate'],
				$data['siteurl'],
				$data['username']
				);
			}
		} else {

			$emailSubject	= JText::sprintf(
				'COM_USERS_EMAIL_ACCOUNT_DETAILS',
				$data['name'],
				$data['sitename']
			);

			if($sendpassword){
				$emailBody = JText::sprintf(
					'COM_USERS_EMAIL_REGISTERED_BODY',
					$data['name'],
					$data['sitename'],
					$data['siteurl'],
					$data['username'],
					$data['password_clear']
				);
			}else{
				$emailBody = JText::sprintf(
					'COM_USERS_EMAIL_REGISTERED_BODY_NOPW',
					$data['name'],
					$data['sitename'],
					$data['siteurl']
				);
			}
		}
		//pr($emailBody);

		// Send the registration email.
		$JMail = JFactory::getMailer();
		$return = $JMail->sendMail($data['mailfrom'], $data['fromname'], $data['email'], $emailSubject, $emailBody);

		// Check for an error.
		if ($return !== true) {
			JError::raiseNotice(100, 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;
		}

		
	}

	public static function config(){
		//permissions groups
		$groups = \GCore\Admin\Models\Group::getInstance()->find('flat');
		$rules = array();
		foreach($groups as $k => $group){
			$rules[$group['Group']['id']] = $group['Group']['title'];
		}
		
		echo \GCore\Helpers\Html::formStart('action_config check_captcha_action_config', 'check_captcha_action_config_{N}');
		echo \GCore\Helpers\Html::formSecStart();
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][name]', array('type' => 'text', 'label' => l_('CF_JOOMLA_REG_NAME'), 'class' => 'M', 'sublabel' => l_('CF_JOOMLA_REG_NAME_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][username]', array('type' => 'text', 'label' => l_('CF_JOOMLA_REG_USERNAME'), 'class' => 'M', 'sublabel' => l_('CF_JOOMLA_REG_USERNAME_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][email]', array('type' => 'text', 'label' => l_('CF_JOOMLA_REG_EMAIL'), 'class' => 'M', 'sublabel' => l_('CF_JOOMLA_REG_EMAIL_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][password]', array('type' => 'text', 'label' => l_('CF_JOOMLA_REG_PASSWORD'), 'class' => 'M', 'sublabel' => l_('CF_JOOMLA_REG_PASSWORD_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][password2]', array('type' => 'text', 'label' => l_('CF_JOOMLA_REG_CONFIRM_PASSWORD'), 'class' => 'M', 'sublabel' => l_('CF_JOOMLA_REG_CONFIRM_PASSWORD_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][new_usertype][]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_USER_GROUPS'), 'multiple' => 'multiple', 'size' => 7, 'options' => $rules, 'sublabel' => l_('CF_JOOMLA_REG_USER_GROUPS_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][useractivation]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_USER_ACTIVATION'), 'options' => array(0 => l_('CF_JOOMLA_REG_AUTO'), 1 => l_('CF_JOOMLA_REG_USER'), 2 => l_('CF_JOOMLA_REG_ADMIN')), 'sublabel' => l_('CF_JOOMLA_REG_USER_ACTIVATION_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][random_password]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_RANDOM_PASS'), 'options' => array(0 => l_('NO'), 1 => l_('YES')), 'sublabel' => l_('CF_JOOMLA_REG_RANDOM_PASS_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][auto_login]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_AUTO_LOGIN'), 'options' => array(0 => l_('NO'), 1 => l_('YES')), 'sublabel' => l_('CF_JOOMLA_REG_AUTO_LOGIN_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][send_joo_activation]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_SEND_JOO_ACTIVATION'), 'options' => array(0 => l_('NO'), 1 => l_('YES')), 'sublabel' => l_('CF_JOOMLA_REG_SEND_JOO_ACTIVATION_DESC')));
		echo \GCore\Helpers\Html::formLine('Form[extras][actions_config][{N}][enable_cb_support]', array('type' => 'dropdown', 'label' => l_('CF_JOOMLA_REG_ENABLE_CB_SUPPORT'), 'options' => array(0 => l_('NO'), 1 => l_('YES')), 'sublabel' => l_('CF_JOOMLA_REG_ENABLE_CB_SUPPORT_DESC')));
		echo \GCore\Helpers\Html::formSecEnd();
		echo \GCore\Helpers\Html::formEnd();
	}
	
	public static function config_check($data = array()){
		$diags = array();
		$diags[l_('CF_DIAG_NAME_SET')] = !empty($data['name']);
		$diags[l_('CF_DIAG_USERNAME_SET')] = !empty($data['username']);
		$diags[l_('CF_DIAG_EMAIL_SET')] = !empty($data['email']);
		$diags[l_('CF_DIAG_PASSWORD_SET')] = !empty($data['password']);
		$diags[l_('CF_DIAG_PASSWORD2_SET')] = !empty($data['password2']);
		return $diags;
	}
}

It can show the form but will go to 403 - Access Forbidden after submit....
Any solutions?

Best regards,
Wing
GreyHead 04 Aug, 2015
Hi Wing,

There should be no need to change the action code. As far as I know the Joomla! Registration only takes one email address.

What exactly do you want to do with the second email address? You can use Custom Code or a DB Save to add it to a Joomla! profile table if that helps?

Bob
wlwan 05 Aug, 2015
Dear Bob,
The email2 will be used as the "cc email" field in every successful email after the form submitted.

I would like my teammate can input this field in joomla backend system(users > user manager > add new user) and I can only think of this method at this moment...

If I save this field @ profile table, how to read the field in custom code?

Best,
Wing
This topic is locked and no more replies can be posted.

2Checkout.com

2CheckOut.com Inc. (Ohio, USA) is an authorized retailer for goods and services provided by ChronoEngine.com