0

我在 html 中创建了一个简单的“创建帐户”表单,该表单与一些 java 交互以实现双重选择加入方法。我还希望此表单在 Joomla 中创建用户并在单击创建帐户按钮后登录。

双重选择工作正常,但 joomla 2.5 的新用户脚本不起作用,没有错误,但它只是没有注册用户。我尝试将在 stackoverflow 上找到的 php 脚本(见下文)放置到生成新用户,但它不起作用。

是否可以在一个表单上同时运行这两种类型的脚本?如果是这样,我哪里错了?谢谢!

 require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();

//Check for request forgeries, we comment this out since tokens are not generated in the html page
//JRequest::checkToken() or jexit( 'Invalid Token' );

//Get required system objects

$user         = clone(JFactory::getUser());
$pathway          = & $mainframe->getPathway();
$config       = & JFactory::getConfig();
$authorize        = & JFactory::getACL();
$document       = & JFactory::getDocument();

//If user registration is not allowed, show 403 not authorized(Not needed)

$usersConfig = &JComponentHelper::getParams( 'com_users' );
if ($usersConfig->get('allowUserRegistration') == '0')
    {
        JError::raiseError( 403, JText::_( 'Access Forbidden' ));
        return;
    }

//Initialize new usertype setting

$newUsertype = $usersConfig->get( 'new_usertype' );
if (!$newUsertype)
    {
        $newUsertype = 'Registered';
    }

//Bind the post array to the user object
if (!$user->bind( JRequest::get('post'), 'usertype' ))
    {
        JError::raiseError( 500, $user->getError());
    }

//Set some initial user values

$user->set('id', 0);
$user->set('usertype', '');
$user->set('gid', $authorize->get_group_id( '', $newUsertype, 'ARO' ));

$date =& JFactory::getDate();
$user->set('registerDate', $date->toMySQL());

//If user activation is turned on, we need to set the activation information(Not needed)

$useractivation = $usersConfig->get( 'useractivation' );
if ($useractivation == '1')
    {
        jimport('joomla.user.helper');
        $user->set('activation', md5( JUserHelper::genRandomPassword()) );
        $user->set('block', '1');
    }

//Save the details of the user

$user->save();
4

1 回答 1

2

我认为您正在尝试创建一个 API 来从不同的环境在 Joomla 中注册用户。您的代码可以在 Joomla 1.5/1.6 上正常工作,但不适用于 1.7 及更高版本......下面的代码片段对我有用,稍作修改。

<?php
/*
 * Created on 13-Apr-12
 *
 * To change the template for this generated file go to
 * Window - Preferences - PHPeclipse - PHP - Code Templates
 */
 /*
  * loading Joomla environment
  */
define( '_JEXEC', 1 );
$JUnit_home = $_SERVER['SCRIPT_FILENAME'];
//define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root


define( 'DS', DIRECTORY_SEPARATOR );

require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );

function register_user ($email, $password){

$firstname = $email; // generate $firstname
$lastname = ''; // generate $lastname
$username = $email; // username is the same as email


/*
I handle this code as if it is a snippet of a method or function!!

First set up some variables/objects     */


//$acl =& JFactory::getACL(); Acl will work only in Joomla1.5/1.6       

/* get the com_user params */
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();

$usersParams = &JComponentHelper::getParams( 'com_users' ); // load the Params

// "generate" a new JUser Object
$user = JFactory::getUser(0); // it's important to set the "0" otherwise your admin user information will be loaded

$data = array(); // array for all user settings


//original logic of name creation
//$data['name'] = $firstname.' '.$lastname; // add first- and lastname
$data['name'] = $firstname.$lastname; // add first- and lastname

$data['username'] = $username; // add username
$data['email'] = $email; // add email
//there's no gid field in #__users table from Joomla_1.7/2.5

$usertype = 'Registered';//this is not necessary!!!
jimport('joomla.application.component.helper');
/* this part of the snippet from here: /plugins/user/joomla/joomla.php*/
$config = JComponentHelper::getParams('com_users');
    // Default to Registered.
$defaultUserGroup = $config->get('new_usertype', 2);
//default to defaultUserGroup i.e.,Registered
$data['groups']=array($defaultUserGroup);
$data['password'] = $password; // set the password
$data['password2'] = $password; // confirm the password
$data['sendEmail'] = 1; // should the user receive system mails?

/* Now we can decide, if the user will need an activation */

 $useractivation = $usersParams->get( 'useractivation' ); // in this example, we load the config-setting
 //echo $useractivation;exit();
 if ($useractivation == 1) { // yeah we want an activation

 jimport('joomla.user.helper'); // include libraries/user/helper.php
 $data['block'] = 1; // block the User
 $data['activation'] =JUtility::getHash( JUserHelper::genRandomPassword() ); // set activation hash (don't forget to send an activation email)

}
else { // no we need no activation

 $data['block'] = 1; // don't block the user

}

if (!$user->bind($data)) { // now bind the data to the JUser Object, if it not works....
 JError::raiseWarning('', JText::_( $user->getError())); // ...raise an Warning
    return false; // if you're in a method/function return false

}

if (!$user->save()) { // if the user is NOT saved...
 JError::raiseWarning('', JText::_( $user->getError())); // ...raise an Warning

 return false; // if you're in a method/function return false

}

return $user; // else return the new JUser object

}

$email = JRequest::getVar('email');
$password = JRequest::getVar('password');

//echo 'User registration...'.'<br/>';
if(!register_user($email, $password))
{
$data['status']="failure";
echo json_encode($data);
}
else
{
$data['status']="success";
echo json_encode($data);
}
 //echo '<br/>'.'User registration is completed'.'<br/>';
?>

PS请检查#_用户(用户详细信息),# _book_user_usergroup_map(映射组ID和用户ID),#__usergroups表包含注册后受影响的组键表

于 2012-04-16T12:01:00.050 回答