php - insertar - ¿Cómo puedo crear una nueva cuenta de usuario de Joomla desde un script?
formulario de registro joomla (11)
Estamos creando una API XML para Joomla que permite a los sitios asociados crear nuevas cuentas para sus usuarios en nuestro sitio web.
Hemos creado un script PHP independiente que procesa y valida la solicitud de la API, pero ahora necesitamos crear las nuevas cuentas. Originalmente, estábamos pensando en hacer una llamada CURL para enviar el formulario de registro, pero nos dimos cuenta de que hay un problema con el token de usuario. ¿Hay otra forma limpia de crear una cuenta de usuario sin entrar en las entrañas de Joomla? Si tenemos que hacer alguna cirugía, ¿cuál es la mejor manera de abordarlo?
Actualización: oh, no creo que quisieras 1.5, pero podrías hacer lo mismo pero con la API 1.5 en su lugar.
Esto es parte de algo que estaba utilizando para otro propósito, pero tendría que usar el grupo predeterminado en su lugar hasta que se solucione un problema con el uso de JUserHelper desde la línea de comandos o lo convierta en una aplicación 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();
}
Basándome en la respuesta de waitinforatrain, que no funciona correctamente para los usuarios que han iniciado sesión (en realidad es peligroso si lo está utilizando en el back-end), lo he modificado un poco y aquí está, funcionando completamente para mí. Tenga en cuenta que esto es para Joomla 2.5.6, mientras que este hilo fue originalmente para 1.5, de ahí las respuestas anteriores:
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;
}
Deberías usar clases internas de Joomla, como JUser, ya que hay mucha lógica interna, como la creación de contraseñas. Cree un script personalizado que utilice los valores de la solicitud de API y guarde a los usuarios en la base de datos utilizando métodos de las Clases de Usuarios de Joomla.
Dos maneras de agregar usuarios de joomla usando su código personalizado es un maravilloso tutorial. El enfoque funciona . He usado este enfoque en algunos proyectos.
Si tiene que acceder a Joomla Framework fuera de Joomla, marque este recurso en su lugar .
En mi caso (Joomla 3.4.3), el usuario se agregó a la sesión, por lo que hubo un comportamiento defectuoso al intentar activar la cuenta.
Solo agregue esta línea, después de $ user-> save ():
JFactory :: getSession () -> clear (''usuario'', "predeterminado");
Esto eliminará al usuario recién creado de la sesión.
Esto no funcionará en joomla 1.6 ya que las ACL se manejan de otra manera ... Al final, es aún más simple, es necesario agregar una entrada en la tabla "jos_user_usergroup_map" (más allá de la tabla "jos_users") para declarar menos un grupo para cada usuario ...
Hice una llamada ajax y luego simplemente pasé las variables a este script y funcionó para mí.
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);
Sólo el usuario no se activa automáticamente. Estoy pasando ''block'' => "0"
para activar el usuario, pero no funciona :( Pero el resto del código funciona bien.
Otra forma inteligente sería utilizar el método de clase real /component/com_users/models/registration.php llamado register, ya que se encargará de todo realmente.
Primero agregas estos métodos a tu clase de ayudante
/**
* 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);
}
Luego agrega el siguiente método de creación de usuario también a su clase auxiliar de 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();
}
Entonces, en cualquier parte de tu componente puedes crear un usuario como este.
// 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'');
}
Hacerlo de esta manera le ahorra todos los problemas de manejo de los correos electrónicos que deben enviarse, ya que automáticamente utilizará los valores predeterminados del sistema. Espero que esto ayude a alguien :)
Probado y trabajando en 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;
}
Si está fuera del entorno de Joomla, deberá hacerlo primero, o si no está escribiendo un componente, utilice el que se encuentra en el enlace de la respuesta de @GMonCon.
<?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();
Uso esto para la prueba unitaria de mi componente.
Simplemente vaya a la página de documentación: http://docs.joomla.org/JUser
También compitió muestra de una sola página para registrar nuevos usuarios en 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/>'';
?>
Tenga en cuenta que para el registro se utiliza solo el correo electrónico y contraseña.
La muestra de la llamada: localhost/joomla/[email protected]&password=pass o simplemente crea un formulario simple con los parámetros apropiados
hay un módulo llamado "módulo de inicio de sesión". Puede usar ese módulo y mostrarlo en uno de los menús. En el que obtendrá un enlace como "¿Nuevo usuario?" o "crear una cuenta" simplemente haga clic en ella y obtendrá una página de registro con validación ... este es un proceso de solo 3 pasos para usar la página de registro ... ¡puede ser útil obtener resultados más rápido! .. gracias
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() );