как я могу создать новую учетную запись пользователя joomla из скрипта?

<p>мы создаем xml api для joomla, который позволяет партнерским сайтам создавать новые учетные записи для своих пользователей на нашем веб-сайте. </p><p>мы создали отдельный php скрипт, который обрабатывает и проверяет запрос api, но теперь нам нужно создать новые учетные записи. первоначально мы думали о том, чтобы просто выполнить вызов curl для отправки формы регистрации, но мы поняли, что существует проблема с токеном пользователя. есть ли другой чистый способ создать учетную запись пользователя, не вдаваясь в кишки joomla? если нам нужно сделать какую-то операцию, как лучше всего к ней подойти? </p>

<p>вы должны использовать внутренние классы joomla, такие как juser, так как там много внутренней логики, такой как взлом паролей. создайте собственный сценарий, который использует значения из запроса api и сохраняет пользователей в базе данных, используя методы из классов пользователей joomla.</p><p> <a href="https://diadem.in/blog/two-ways-to-add-joomla-users-using-your-custom-code/">два способа добавления пользователей joomla с помощью вашего пользовательского кода</a> это замечательный учебник. подход <strong>работает</strong>. я использовал этот подход в некоторых проектах. </p><p>если вам нужен доступ к joomla framework <strong>за пределами</strong> joomla, <a href="http://www.inathought.com/blog/2009/07/accessing-the-joomla-framework-from-outside-joomla/">вместо этого проверьте этот ресурс</a> .</p>

<p>основываясь на ответе waitinforatrain, который не работает должным образом для вошедших в систему пользователей (на самом деле это опасно, если вы используете его в бэк-энде), я немного его изменил, и вот он полностью работает для меня. обратите внимание, что это для joomla 2.5.6, в то время как эта ветка изначально была для 1.5, отсюда и ответы выше:</p><pre><code> 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; } 

просто перейдите на страницу документации: <a href="http://docs.joomla.org/juser">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's 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...'.'<br/>'; register\_user($email, $password); //echo '<br/>'.'user registration is completed'.'<br/>'; ?> </code></pre><p>обратите внимание, что для регистрации используются только адрес электронной почты и пароль.</p><p>пример вызова: localhost/joomla/test-reg-user-php?email=test02@test.com&password=pass или просто создайте простую форму с соответствующими параметрами</p>

<p>проверено и работает на 2.5.</p><pre><code>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(); я использую это для модульного тестирования моего компонента.

 <a href="http://joomlaportal.ru/content/view/1381/68/">http://joomlaportal.ru/content/view/1381/68/ insert into jos_users( name, username, password, email, usertype, gid ) values( 'иванов иван', 'ivanov', md5('12345'), 'ivanov@mail.ru', '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() ); 

в моем случае (joomla 3.4.3) пользователь был добавлен в сеанс, поэтому при попытке активировать учетную запись возникло некорректное поведение.просто добавьте эту строку после $ user-> save ():</p><p>jfactory :: getsession () -> clear ('user', "default");</p><p>это удалит вновь созданного пользователя из сеанса.</p>

<p>обновление: о, я не вижу, что вы хотели 1.5, но вы могли бы сделать то же самое, но с 1.5 api вместо этого.</p><p>это часть того, что я использовал для других целей, но вам нужно будет использовать группу по умолчанию, пока проблема с использованием juserhelper из командной строки не будет устранена или пока она не станет веб-приложением.</p><pre><code><?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(); } 

другой разумный способ - использовать метод класса /component/com_users/models/registration.php, называемый register, поскольку он действительно позаботится обо всем.сначала вы добавляете эти методы в свой вспомогательный класс./  get any component's 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(); } </code></pre><p>затем в любом месте вашего компонента вы можете создать такого пользователя</p><pre><code>// 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'); } делая это таким образом, вы избавляете вас от всех проблем, связанных с обработкой электронных писем, которые должны быть отправлены, так как он автоматически использует системные настройки по умолчанию. надеюсь, это поможет кому-то :)

я сделал вызов ajax, а затем просто передал переменные этому сценарию, и он сработал для меня. 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); </code></pre><p>только пользователь не активируется автоматически. я передаю <code>'block' => "0"</code> для активации пользователя, но он не работает: ( но остальная часть кода работает нормально.</p>

<p>это не будет работать в joomla 1.6, так как acl обрабатываются по-другому .... в конце концов, это еще проще, вам обязательно нужно добавить запись в таблицу "jos\_user\_usergroup\_map" (далее, чем таблица "jos\_users") объявить хотя бы одну группу для каждого пользователя ...</p>

<p>есть один модуль под названием «модуль входа в систему», вы можете использовать этот модуль и отобразить его в одном из меню .. в котором вы получите одну ссылку типа "новый пользователь?" или "создать учетную запись", просто нажмите на нее, и вы получите одну страницу регистрации с проверкой. это всего лишь 3-шаговый процесс использования страницы регистрации ... это может быть полезно, чтобы получить результат быстрее !! .. спасибо</p>