Как создать новую учетную запись пользователя Joomla из script?

Мы создаем XML-API для Joomla, который позволяет сайтам-партнерам создавать новые учетные записи для своих пользователей на нашем веб-сайте.

Мы создали автономный PHP script, который обрабатывает и проверяет запрос API, но теперь нам нужно создать новые учетные записи. Мы изначально думали о том, чтобы просто сделать вызов CURL, чтобы отправить форму регистрации, но мы поняли, что есть проблема с токеном пользователя. Есть ли еще один чистый способ создать учетную запись пользователя, не вдаваясь в мужество Joomla? Если нам действительно нужно сделать какую-то операцию, то как лучше подойти к ней?

11 ответов

Вы должны использовать внутренние классы Joomla, такие как JUser, поскольку существует много внутренней логики, такой как соляризация пароля. Создайте пользовательский script, который использует значения из запроса API и сохраняет пользователей в базе данных с помощью методов из классов пользователей Joomla.

Два способа добавления пользователей joomla с использованием вашего настраиваемого кода - замечательный учебник. Подход работает. Я использовал этот подход в некоторых проектах.

Если вам нужно открыть Joomla Framework вне Joomla, проверить этот ресурс вместо.


Основываясь на ответе от waitinforatrain, который неправильно работает для зарегистрированных пользователей (на самом деле опасно, если вы используете его в фоновом контенте), я немного изменил его и вот он, полностью работающий на меня, Обратите внимание, что это для Joomla 2.5.6, в то время как этот поток был первоначально для 1.5, поэтому ответы выше:

function addJoomlaUser($name, $username, $password, $email) {
 jimport('joomla.user.helper');
 $data = array(
 "name"=>$name,
 "username"=>$username,
 "password"=>$password,
 "password2"=>$password,
 "email"=>$email,
 "block"=>0,
 "groups"=>array("1","2")
 );
 $user = new JUser;
 //Write to database
 if(!$user->bind($data)) {
 throw new Exception("Could not bind data. Error: " . $user->getError());
 }
 if (!$user->save()) {
 throw new Exception("Could not save user. Error: " . $user->getError());
 }
 return $user->id;
 }


Просто перейдите на страницу документации: http://docs.joomla.org/JUser

Также конкурировал образец одной страницы для регистрации новых пользователей в Joomla:

<!--?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 */
 // get the ACL
 $acl =& JFactory::getACL();
 /* get the com_user params */
 jimport('joomla.application.component.helper'); // include libraries/application/component/helper.php
 $usersParams = &JComponentHelper::getParams( 'com_users' ); // load the Params
 // "generate" a new JUser Object
 $user = JFactory::getUser(0); // it important to set the "0" otherwise your admin user information will be loaded
 $data = array(); // array for all user settings
 // get the default usertype
 $usertype = $usersParams--->get( 'new_usertype' );
 if (!$usertype) {
 $usertype = 'Registered';
 }
 // set up the "main" user information
 //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
 $data['gid'] = $acl->get_group_id( '', $usertype, 'ARO' ); // generate the gid from the usertype
 /* no need to add the usertype, it will be generated automaticaly from the gid */
 $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
 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...'.'';
 register_user($email, $password);
 //echo ''.'User registration is completed'.'';
?>

Обратите внимание, что для регистрации используются только электронная почта и пароль.

Образец вызова: локальный/Joomla/тест-рег-пользователь PHP email=[removed_email]&? = ПАРОЛЬ или просто создать простую форму с соответствующими параметрами


http://joomlaportal.ru/content/view/1381/68/

INSERT INTO jos_users( `name`, `username`, `password`, `email`, `usertype`, `gid` )
VALUES( 'Иванов Иван', 'ivanov', md5('12345'), '[removed_email]', 'Registered', 18 );
INSERT INTO jos_core_acl_aro( `section_value`, `value` )
VALUES ( 'users', LAST_INSERT_ID() );
INSERT INTO jos_core_acl_groups_aro_map( `group_id`, `aro_id` )
VALUES ( 18, LAST_INSERT_ID() );


Протестировано и работает над 2.5.

function addJoomlaUser($name, $username, $password, $email) {
 $data = array(
 "name"=>$name, 
 "username"=>$username, 
 "password"=>$password,
 "password2"=>$password,
 "email"=>$email
 );
 $user = clone(JFactory::getUser());
 //Write to database
 if(!$user->bind($data)) {
 throw new Exception("Could not bind data. Error: " . $user->getError());
 }
 if (!$user->save()) {
 throw new Exception("Could not save user. Error: " . $user->getError());
 }
 return $user->id;
}

Если вы находитесь за пределами среды Joomla, вам нужно будет сделать это сначала, или если вы не пишете компонент, используйте тот, который указан в ссылке в ответе @GMonC.

<!--?php
if (! defined('_JEXEC'))
 define('_JEXEC', 1);
$DS=DIRECTORY_SEPARATOR;
define('DS', $DS);
//Get component path
preg_match("/\\{$DS}components\\{$DS}com_.*?\\{$DS}/", __FILE__, $matches, PREG_OFFSET_CAPTURE);
$component_path = substr(__FILE__, 0, strlen($matches[0][0]) + $matches[0][1]);
define('JPATH_COMPONENT', $component_path);
define('JPATH_BASE', substr(__FILE__, 0, strpos(__FILE__, DS.'components'.DS) ));
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once JPATH_BASE .DS.'includes'.DS.'framework.php';
jimport( 'joomla.environment.request' );
$mainframe =& JFactory::getApplication('site');
$mainframe--->initialise();

Я использую это для модульного тестирования моего компонента.


Другим умным способом было бы использовать фактический метод класса /component/com _users/models/registration.php, называемый регистром, поскольку он действительно позаботится обо всем.

Сначала вы добавляете эти методы в свой вспомогательный класс

/**
* Get any component model
**/
public static function getModel($name, $path = JPATH_COMPONENT_ADMINISTRATOR, $component = 'yourcomponentname')
{
 // load some joomla helpers
 JLoader::import('joomla.application.component.model'); 
 // load the model file
 JLoader::import( $name, $path . '/models' );
 // return instance
 return JModelLegacy::getInstance( $name, $component.'Model' );
} 
/**
* Random Key
*
* @returns a string
**/
public static function randomkey($size)
{
 $bag = "abcefghijknopqrstuwxyzABCDDEFGHIJKLLMMNOPQRSTUVVWXYZabcddefghijkllmmnopqrstuvvwxyzABCEFGHIJKNOPQRSTUWXYZ";
 $key = array();
 $bagsize = strlen($bag) - 1;
 for ($i = 0; $i < $size; $i++)
 {
 $get = rand(0, $bagsize);
 $key[] = $bag[$get];
 }
 return implode($key);
}

Затем вы добавляете следующий метод создания пользователя также к вашему вспомогательному классу компонентов

/**
* Greate user and update given table
*/
public static function createUser($new)
{
 // load the user component language files if there is an error
 $lang = JFactory::getLanguage();
 $extension = 'com_users';
 $base_dir = JPATH_SITE;
 $language_tag = 'en-GB';
 $reload = true;
 $lang->load($extension, $base_dir, $language_tag, $reload);
 // load the user regestration model
 $model = self::getModel('registration', JPATH_ROOT. '/components/com_users', 'Users');
 // set password
 $password = self::randomkey(8);
 // linup new user data
 $data = array(
 'username' => $new['username'],
 'name' => $new['name'],
 'email1' => $new['email'],
 'password1' => $password, // First password field
 'password2' => $password, // Confirm password field
 'block' => 0 );
 // register the new user
 $userId = $model->register($data);
 // if user is created
 if ($userId > 0)
 {
 return $userId;
 }
 return $model->getError();
}

Тогда в любом месте вашего компонента вы можете создать такого пользователя

// setup new user array
$newUser = array(
 'username' => $validData['username'], 
 'name' => $validData['name'], 
 'email' => $validData['email']
 );
$userId = yourcomponentnameHelper::createUser($newUser); 
if (!is_int($userId))
{
 $this->setMessage($userId, 'error');
}

Выполнение этого способа избавляет вас от всех проблем с обработкой электронных писем, которые необходимо отправить, поскольку автоматически использует системные значения по умолчанию. Надеюсь, это поможет кому-то:)


Обновление: о, я не вижу, что вам нужен 1.5, но вы могли бы сделать аналогичный, но вместо API 1.5.

Это часть того, что я использовал для других целей, но вам нужно будет использовать группу по умолчанию, пока проблема с использованием JUserHelper из командной строки не будет исправлена ​​или не станет веб-приложением.

<!--?php
/**
 *
 * @copyright Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */
if (!defined('_JEXEC'))
{
 // Initialize Joomla framework
 define('_JEXEC', 1);
}
@ini_set('zend.ze1_compatibility_mode', '0');
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Load system defines
if (file_exists(dirname(__DIR__) . '/defines.php'))
{
 require_once dirname(__DIR__) . '/defines.php';
}
if (!defined('JPATH_BASE'))
{
 define('JPATH_BASE', dirname(__DIR__));
}
if (!defined('_JDEFINES'))
{
 require_once JPATH_BASE . '/includes/defines.php';
}
// Get the framework.
require_once JPATH_LIBRARIES . '/import.php';
/**
 * Add user
 *
 * @package Joomla.Shell
 *
 * @since 1.0
 */
class Adduser extends JApplicationCli
{
 /**
 * Entry point for the script
 *
 * @return void
 *
 * @since 1.0
 */
 public function doExecute()
 {
 // username, name, email, groups are required values.
 // password is optional
 // Groups is the array of groups
 // Long args
 $username = $this--->input->get('username', null,'STRING');
 $name = $this->input->get('name');
 $email = $this->input->get('email', '', 'EMAIL');
 $groups = $this->input->get('groups', null, 'STRING');
 // Short args
 if (!$username)
 {
 $username = $this->input->get('u', null, 'STRING');
 }
 if (!$name)
 {
 $name = $this->input->get('n');
 }
 if (!$email)
 {
 $email = $this->input->get('e', null, 'EMAIL');
 }
 if (!$groups)
 {
 $groups = $this->input->get('g', null, 'STRING');
 }
 $user = new JUser();
 $array = array();
 $array['username'] = $username;
 $array['name'] = $name;
 $array['email'] = $email;
 $user->bind($array);
 $user->save();
 $grouparray = explode(',', $groups);
 JUserHelper::setUserGroups($user->id, $grouparray);
 foreach ($grouparray as $groupId)
 {
 JUserHelper::addUserToGroup($user->id, $groupId);
 }
 $this->out('User Created');
 $this->out();
 }
}
if (!defined('JSHELL'))
{
 JApplicationCli::getInstance('Adduser')->execute();
}


В моем случае (Joomla 3.4.3) пользователь был добавлен в сеанс, поэтому при попытке активировать учетную запись возникло ошибочное поведение.

Просто добавьте эту строку, после $user- > save():

JFactory:: getSession() → clear ( "пользователь", "по умолчанию" );

Это приведет к удалению вновь созданного пользователя из сеанса.


Я сделал ajax-вызов, а затем просто передал переменные этому script, и это сработало для меня.

define('_JEXEC', 1);
define('JPATH_BASE', __DIR__);
define('DS', DIRECTORY_SEPARATOR);
/* Required Files */
require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$app = JFactory::getApplication('site');
$app->initialise();
require_once(JPATH_BASE . DS . 'components' . DS . 'com_users' . DS . 'models' . DS . 'registration.php');
$model = new UsersModelRegistration();
jimport('joomla.mail.helper');
jimport('joomla.user.helper');
$language = JFactory::getLanguage();
$language->load('com_users', JPATH_SITE);
$type = 0;
$username = JRequest::getVar('username');
$password = JRequest::getVar('password');
$name = JRequest::getVar('name');
$mobile = JRequest::getVar('mobile');
$email = JRequest::getVar('email');
$alias = strtr($name, array(' ' => '-'));
$sendEmail = 1;
$activation = 0;
$data = array('username' => $username,
 'name' => $name,
 'email1' => $email,
 'password1' => $password, // First password field
 'password2' => $password, // Confirm password field
 'sendEmail' => $sendEmail,
 'activation' => $activation,
 'block' => "0", 
 'mobile' => $mobile,
 'groups' => array("2", "10"));
$response = $model->register($data);
echo $data['name'] . " saved!";
$model->register($data);

Только пользователь не активируется автоматически. Я пропускаю 'block' => "0" для активации пользователя, но он не работает:( Но остальная часть кода работает нормально.


Это не будет работать в joomla 1.6, поскольку ACL обрабатываются по-другому... В конце еще проще, вам необходимо добавить запись в таблицу "jos_user_usergroup_map" (далее в таблицу "jos_users" ), чтобы объявить хотя бы одну группу для каждого пользователя...


есть один модуль, называемый "модулем входа", который вы можете использовать этот модуль и отображать его в одном из меню. в котором u получит одну ссылку, например "новый пользователь?". или "создать учетную запись", просто нажмите на нее, вы получите одну страницу регистрации с проверкой. Это всего лишь трехэтапный процесс для использования страницы регистрации... может быть полезно быстрее получить результат!!.. thanx

licensed under cc by-sa 3.0 with attribution.