it-swarm.com.de

Wie kann ich aus einem Skript heraus ein neues Joomla-Benutzerkonto erstellen?

Wir erstellen eine XML-API für Joomla, mit der Partner-Websites neue Konten für ihre Benutzer auf unserer Website erstellen können.

Wir haben ein eigenständiges PHP Skript erstellt, das die API-Anforderung verarbeitet und validiert. Jetzt müssen wir jedoch die neuen Konten erstellen. Ursprünglich dachten wir darüber nach, nur einen CURL-Aufruf zum Übermitteln des Anmeldeformulars durchzuführen, aber wir stellten fest, dass ein Problem mit dem Benutzertoken vorliegt. Gibt es eine andere saubere Möglichkeit, ein Benutzerkonto zu erstellen, ohne in den Mut von Joomla zu geraten? Wenn wir operiert werden müssen, wie können wir uns dem am besten nähern?

19
user77413

Sie sollten Joomla-interne Klassen wie JUser verwenden, da es eine Menge interner Logik wie das Passwort-Salting gibt. Erstellen Sie ein benutzerdefiniertes Skript, das die Werte aus der API-Anforderung verwendet und die Benutzer mithilfe von Methoden aus Joomla-Benutzerklassen in der Datenbank speichert.

Zwei Möglichkeiten zum Hinzufügen von Joomla-Benutzern mit Ihrem benutzerdefinierten Code ist ein wunderbares Tutorial. Der Ansatz funktioniert . Ich habe diesen Ansatz in einigen Projekten verwendet. 

Wenn Sie auf Joomla Framework zugreifen müssen outside Joomla, überprüfen Sie stattdessen diese Ressource .

16
GmonC

Basierend auf der Antwort von waitinforatrain, die für angemeldete Benutzer nicht richtig funktioniert (eigentlich gefährlich, wenn Sie sie im Back-End verwenden), habe ich sie ein wenig geändert und hier ist es für mich voll funktionsfähig. Bitte beachten Sie, dass dies für Joomla 2.5.6 gilt, während dieser Thread ursprünglich für 1.5 war, daher die obigen Antworten:

 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;
 }
10

Gehen Sie einfach zur Dokumentationsseite: http://docs.joomla.org/JUser

Auch konkurrierte Probe einer einzelnen Seite, um neue Benutzer in Joomla zu registrieren:

<?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/>';
?>

Bitte beachten Sie, dass für die Registrierung nur E-Mail und Passwort verwendet werden.

Das Anrufbeispiel: Localhost/joomla/[email protected]&password=pass Oder erstellen Sie einfach ein einfaches Formular mit den entsprechenden Parametern

7
molo

Getestet und arbeiten an 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;
}

Wenn Sie sich außerhalb der Joomla-Umgebung befinden, müssen Sie dies zuerst tun, oder wenn Sie keine Komponente schreiben, verwenden Sie die im Link in der Antwort von @ 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();

Ich benutze dies zum Komponententest meiner Komponente.

2
bcoughlan

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

INSERT INTO jos_users( `name`, `username`, `password`, `email`, `usertype`, `gid` )
VALUES( 'Иванов Иван', 'ivanov', md5('12345'), '[email protected]', '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
faleev

In meinem Fall (Joomla 3.4.3) wurde der Benutzer zur Sitzung hinzugefügt. Es gab daher ein fehlerhaftes Verhalten beim Versuch, das Konto zu aktivieren.

Fügen Sie einfach diese Zeile nach $ user-> save () hinzu:

JFactory :: getSession () -> clear ('user', "default");

Dadurch wird der neu erstellte Benutzer aus der Sitzung entfernt.

1
Rob

Update: Oh, ich habe nicht gesehen, dass Sie 1,5 wollten, aber Sie könnten dies auch mit der 1.5-API tun.

Dies ist ein Teil von etwas, das ich zu einem anderen Zweck verwendet habe, aber Sie müssten stattdessen die Standardgruppe verwenden, bis ein Problem mit der Verwendung von JUserHelper über die Befehlszeile behoben wurde oder eine Webanwendung erstellt wurde.

<?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();
}
1
Elin

Ein weiterer intelligenter Weg wäre die Verwendung der eigentlichen /component/com_users/models/registration.php-Klassenmethode namens register, da sie sich wirklich um alles kümmert.

Zuerst fügen Sie diese Methoden Ihrer Hilfsklasse hinzu

/**
*   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);
}  

Dann fügen Sie die folgende Benutzererstellungsmethode auch zu Ihrer Komponentenhilfeklasse hinzu

/**
* 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();
}

Dann können Sie irgendwo in Ihrer Komponente einen Benutzer erstellen

// 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');
}

Wenn Sie dies auf diese Weise tun, ersparen Sie sich die Mühe, die zu sendenden E-Mails zu bearbeiten, da die Systemstandardeinstellungen automatisch verwendet werden. Hoffe das hilft jemandem :)

1
Llewellyn

Ich habe einen Ajax-Aufruf gemacht und dann einfach die Variablen an dieses Skript übergeben und es hat für mich funktioniert. 

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);

Nur der Benutzer wird nicht automatisch aktiviert. Ich übergebe 'block' => "0" für die Aktivierung des Benutzers, aber es funktioniert nicht: () Der Rest des Codes funktioniert jedoch einwandfrei.

0
Joomler

Dies funktioniert nicht in Joomla 1.6, da ACLs auf andere Weise gehandhabt werden ... Am Ende ist es noch einfacher, Sie müssen einen Eintrag in der Tabelle "jos_user_usergroup_map" hinzufügen (weiter die "jos_users"). Tabelle), um mindestens eine Gruppe für jeden Benutzer zu deklarieren ...

0
luciomonter

es gibt ein Modul mit dem Namen "Login-Modul", in dem Sie dieses Modul verwenden und in einem der Menüs anzeigen können. in dem Sie einen Link wie "Neuer Benutzer" erhalten. oder "Erstellen eines Kontos" Klicken Sie einfach darauf. Sie erhalten eine Registrierungsseite mit Validierung. Dies ist nur ein 3-Schritt-Vorgang, um die Registrierungsseite zu verwenden ... es kann hilfreich sein, das Ergebnis schneller zu erhalten

0
Denish