2009-12-15 12 views
19

Stiamo creando un'API XML per Joomla che consente ai siti partner di creare nuovi account per i propri utenti sul nostro sito Web.Come posso creare un nuovo account utente Joomla all'interno di uno script?

Abbiamo creato uno script PHP autonomo che elabora e convalida la richiesta dell'API, ma ora abbiamo bisogno di creare effettivamente i nuovi account. Inizialmente pensavamo semplicemente di fare una chiamata CURL per inviare il modulo di registrazione, ma ci siamo resi conto che c'è un problema con il token dell'utente. C'è un altro modo pulito per creare un account utente senza entrare nel fegato di Joomla? Se dobbiamo fare un intervento chirurgico, qual è il modo migliore per affrontarlo?

risposta

15

È necessario utilizzare le classi interne Joomla, come JUser, poiché esiste un sacco di logica interna come la salatura della password. Crea uno script personalizzato che utilizza i valori della richiesta API e salva gli utenti nel database utilizzando i metodi delle classi utente Joomla.

Two ways to add joomla users using your custom code è un tutorial meraviglioso. L'approccio funziona. Ho usato questo approccio in alcuni progetti.

Se è necessario accedere a Joomla Framework all'esterno di Joomla, check this resource instead.

+4

collegamenti interrotti. Questo è il motivo per cui si dovrebbe sempre inserire il codice qui ... :(dati – MazarD

7

è sufficiente accedere alla pagina di documentazione: http://docs.joomla.org/JUser

gareggiato anche campione di singola pagina per registrare nuovi utenti in 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/>'; 
?> 

prega di notare che per la registrazione utilizzato solo e-mail e la password.

Il campione di chiamata: localhost/joomla/[email protected] & password = passare o semplicemente creare semplice modulo con i parametri appropriati

+1

$ [' block '] = 1; // non blocca l'utente, dovrebbe essere $ data [' block '] = 0; – Dharmang

+0

@molo è molto tardi per me commentare: invierà l'e-mail di attivazione di joomla core? obbedire a joomla plugin per l'utente come prima e dopo salvare? – Malaiselvan

0

c'è un modulo chiamato "login module" puoi usare quel modulo e visualizzarlo in uno dei menu .. in cui avrai un link come "nuovo utente?" o "crea un account" basta cliccarci sopra otterrai una pagina di registrazione con validazione..è solo una procedura in 3 passaggi per usare la pagina di registrazione ... potrebbe essere utile ottenere risultati più velocemente !! .. thanx

0

Questo non funzionerà in joomla 1.6 dato che ACL è gestito in un altro modo ... Alla fine è ancora più semplice, è necessario aggiungere una voce nella tabella "jos_user_usergroup_map" (oltre la tabella "jos_users") dichiarare almeno un gruppo per ciascun utente ...

+0

La configurazione include un gruppo di utenti predefinito per i nuovi utenti.Questo è quello che dovresti usare o sovrascrivere se vuoi qualcosa di diverso. – Elin

4

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

provato e funzionando in 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; 
} 

Se siete al di fuori dell'ambiente di Joomla, dovrete farlo prima, o se non sta scrivendo un componente, utilizzare quello nel link in @ risposta di 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(); 

Io uso questo per il test dell'unità il mio componente.

+0

Grazie, questo mi ha aiutato. = clone (JFactory :: getUser()); 'invece di solo' $ user = new JUser(); '? – Tom

+0

@Tom I non reca Perchè l'ho fatto in quel modo. '' Nuovo JUser(); 'funziona? Se così fosse sarebbe una soluzione migliore. – bcoughlan

10

Sulla base della risposta di waitinforatrain, che non funziona correttamente per gli utenti che hanno effettuato l'accesso (effettivamente pericoloso se lo si utilizza nel back-end), l'ho modificato un po 'ed eccolo, completamente funzionante me. Si prega di notare che questa è per Joomla 2.5.6, mentre questa discussione era in origine per 1,5, quindi le risposte di cui sopra:

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; 
} 
+1

Grazie per aver postato questo, ho davvero bisogno di vedere il modo migliore di fare l'archiviazione delle password crittografate ... e di essere pigro a guardare il core code di Joomla ... – Cleanshooter

+0

bello, ma sto ricevendo un errore, Αποτυχία ενημέρωσης επαφής : COM_CONTACT_WARNING_SAME_NAME, βοήθα! :), e sto verificando, l'utente non esiste prima. – themis

+1

Themi, non penso di poter rispondere in greco, a causa delle regole del sito, e prendendo in considerazione il fatto che questi commenti dovrebbero aiutare gli altri lettori. Anche se, credo che il problema che hai di fronte abbia qualcosa a che fare con le tabelle dei componenti di Contatto, e possibilmente sull'alias. Lo hai cercato su google? Forse puoi contattarmi sul mio sito, in modo che possiamo parlare meglio. (è esattamente lo stesso del mio nome utente, più un .com) – mavrosxristoforos

1

Aggiornamento: oh ddin't vedo voluto 1.5 ma si poteva fare simile, ma il wth 1.5 API invece.

Questo è parte di qualcosa che usavo per un altro scopo, ma dovresti invece utilizzare il gruppo predefinito fino a quando non viene risolto un problema relativo all'utilizzo di JUserHelper dalla riga di comando o ne diventa un'applicazione web.

<?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(); 
} 
+0

Grazie per l'utile 2.5. Il codice dei gruppi non funziona per me, ma continuerò a provare. Penso che sia perché il mio gruppo ha il nome "Foo Bar" con spazi. Continuerò a giocarci. Qualsiasi altra intuizione sarebbe utile. – Tom

+0

Oh sai cosa, ho dimenticato di avere una richiesta pull per correggere un bug con la creazione dei gruppi. – Elin

+0

E quella richiesta di pull è stata recentemente unita e sarà in 3.1. – Elin

1

Nel mio caso (Joomla 3.4.3) l'utente è stato aggiunto alla sessione, per cui v'è stato un comportamento buggy quando si cerca di attivare l'account.

Basta aggiungere questa linea, dopo aver $ user-> save():

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

Questo rimuoverà l'utente appena creato dalla sessione.

1

Un altro modo intelligente sarebbe utilizzare il metodo di classe effettivo /component/com_users/models/registration.php chiamato register poiché si prenderà cura di tutto realmente.

In primo luogo si aggiungono questi metodi per la vostra classe di supporto

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

quindi si aggiunge il seguente all'utente di creare il metodo anche a voi classe helper componente

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

Poi in qualsiasi punto della componente è possibile creare un user like this

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

Facendolo in questo modo si risparmiano tutti i trou di gestire le e-mail che devono essere inviate, poiché utilizzeranno automaticamente le impostazioni di default del sistema. Spero che questo aiuti qualcuno :)

0

Ho fatto una chiamata ajax e quindi ho passato le variabili a questo script e ha funzionato per me.

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

Solo utente non è sempre attivata automaticamente. sto passando 'block' => "0" per l'attivazione di utente, ma non sta funzionando :( Ma resto del codice funziona bene.

Problemi correlati