Buy Now
Sign in

Joomla Registration after adding custom field in User table

wlwan , August 03 2015
W
wlwan
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
    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
    ChronoForms technical support
    If you'd like to buy me a coffee or two, thank you very much
    W
    wlwan
    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