
Drupal 8: Creación de usuarios mediante código
Autor: fjavimartin
Fecha de Creación: 14/03/2019
Categorías:
Utilizaremos el formulario que creamos en la última entrada de blog para ampliarlo y crear usuarios a partir de la información contenida en el fichero que subiremos al formulario.
1. Entidades
El concepto de entidad se introdujo en drupal 7 y en drupal 8 ha alcanzado su máximo explendor. Existen dos tipos de entidades básicos:
- Entidades de configuración: Son aquellas entidades que se utilizan como elementos de configuración. Se puede acceder a ellas mediante el menú de administración, no son expuestas al usuario final y algunas de ellas pueden ser los menús, vocabularios, variables de configuración, etc.
- Entidades de contenido: Son aquellas entidades utilizadas para almacenar contenidos. La diferencia con las anteriores es que pueden tener campos. El ejemplo más claro de este tipo de entidades son los nodos.
La entidad ‘user’ almacena toda la información necesaria relacionada con un usuario (login, contraseña, identificador, etc..) e implementa la interface ‘UserInterface’ de donde podremos sacar todos los métodos que podemos utilizar:
Además de implementar la interface ‘UserInterface’ la entidad ‘user’ hereda todos los métodos comunes a cualquier entidad que nos permitirán realizar las operaciones básicas como son la creación, eliminación o actualización.
2. Formulario
Para poder alcanzar el objetivo fijado utilizaremos el formulario que creamos en la última entrada de blog:
https://www.e-quipos.es/blog/drupal-8-ficheros-en-drupal
El fichero que utilicemos para importar los usuarios tendrá el siguiente formato:
usuario1;contraseña1;test@test.com
usuario2;contraseña1;test@test.com
usuario3;contraseña1;test@test.com
Cada una de las líneas contendrá login, contraseña y cuenta de correo. Estos serán los campos que utilizaremos para crear cada uno de los usuarios.
Lo primero que haremos será añadir al formulario los servicios:
- file.system: Nos dará acceso al sistema de ficheros y lo utilizaremos para acceder físicamente al fichero.
- email.validator: Será un servicio con el que validaremos la cuenta de correo que leeremos del fichero.
protected $fileUsage;
protected $current_user;
protected $entityTypeManager;
protected $fileSystem;
protected $emailValidator;
public function __construct(DatabaseFileUsageBackend $fileUsage, AccountProxyInterface $current_user,
EntityTypeManagerInterface $entityTypeManager, FileSystemInterface $fileSystem,
EmailValidatorInterface $emailValidator) {
$this->fileUsage = $fileUsage;
$this->current_user = $current_user;
$this->entityTypeManager = $entityTypeManager;
$this->fileSystem = $fileSystem;
$this->emailValidator = $emailValidator;
}
public static function create(ContainerInterface $container) {
return new static (
$container->get('file.usage'),
$container->get('current_user'),
$container->get('entity_type.manager'),
$container->get('file_system'),
$container->get('email.validator')
);
}
El siguiente paso será añadir la función que procesará el fichero:
protected function processFile(FileInterface $file) {
$user_storage = $this->entityTypeManager->getStorage('user');
$uri = $file->get('uri')->value;
$path = $this->fileSystem->realpath($uri);
$linesprocess = 0;
$lineerrors = 0;
$fp = fopen($path, 'r');
while ( !feof($fp) ) {
$line = fgetcsv($fp, null, ';');
/* Check if number of fields is ok and email is correct. */
if ( (sizeof($line) != 3) || (!$this->emailValidator->isValid($line[2])) ) {
$lineerrors++;
continue;
}
$users = $user_storage->loadByProperties(['name' => $line[0]]);
if ( !empty($users) ) {
$lineerrors++;
continue;
}
/* Mail ok, login ok -> Insert new user */
$user_values = [
'name' => $line[0],
'pass' => $line[1],
'mail' => $line[2],
'status' => 1,
];
$user = $user_storage->create($user_values);
$user->save();
drupal_set_message($this->t('New user inserted.'));
$linesprocess++;
}
drupal_set_message( $this->t('Total users inserted: ' . $linesprocess . ' Total errors line: ' . $lineerrors) );
}
Lo primero que hacemos es obtener la uri del fichero y con este dato vamos al servicio que nos da acceso al sistema de ficheros para obtener la ruta al fichero.
Utilizamos los métodos convencionales de php accedemos al fichero y lo vamos leyendo línea a línea. Antes de dar de alta un nuevo usuario verificaremos si el número de campos del fichero es el correcto, si el email que nos llega es correcto y finalmente verificamos que no hay ningún otro usuario con el mismo login.
Una vez realizadas todas las comprobaciones creamos un array con los valores que utilizaremos para crear el nuevo usuario, llamamos al método para crear una nueva entidad y la salvamos. Ponemos el status a 1 para que los usuarios recién creados estén activos.
Ya os estoy viendo venir…..y de donde has sacado el nombre de los campos para crear un usuario? Queridos, un poco de I + D además de lógica aplastante, nos vamos a la documentación de drupal 8 y comprobamos que en el método BaseFieldDefinitions encontramos los campos básicos que tendrá cada usuario (Abajo encontraréis las referencias).
El último paso será editar el método ‘submitForm’ para que llame a la función que procesa cada fichero y tendremos terminado nuestro formulario.
public function submitForm(array &$form, FormStateInterface $form_state) {
$storage = $this->entityTypeManager->getStorage('file');
foreach ($form_state->getValue('files') as $fid) {
$file = $storage->load($fid);
$this->processFile($file);
$this->fileUsage->add($file, 'drupal_miseries', 'user', $this->current_user->id(), 1);
drupal_set_message( $this->t('File uploaded: '. $file->get('filename')->value) );
}
}
Conclusiones
De una manera fácil y sencilla hemos tocada el mundo de los ficheros en drupal y además hemos visto como crear usuarios mediante código. Este mismo ejemplo puede ser extensible para crear cualquier otra entidad en drupal
Disfrutar!!!!!
Referencias
https://api.drupal.org/api/drupal/services/8.6.x
https://api.drupal.org/api/drupal/core%21core.services.yml/service/file_system/8.6.x
https://api.drupal.org/api/drupal/core%21core.services.yml/service/email.validator/8.6.x