abbiamo rilevato un problema nel processo di importazione utenze all'interno di un gruppo, nel momento in cui nel file importato sono presenti dei duplicati; proviamo a spiegare nel miglior modo possibile.
La presenza di duplicati non viene completamente gestita e il risultato è che l'importazione sembra andare a buon fine (il form di risposta segnala l'avvenuta importazione) ma di fatto non viene scritto nulla a database in quanto la query fallisce (errore di chiave duplicata).
Come riprodurre la situazione critica:
- creare un csv/txt contenente gli userid da importare nel gruppo, avendo cura di inserire almeno un duplicato
- andare in Utenti/Gestione Gruppi, selezionare un gruppo, selezionare la funzione importa
- selezionare il file csv e procedere con l'importazione
A questo punto, se nel file abbiamo messo 4 righe (con 3 utenze uniche) il responso dell'importazione sarà: Totale 4, Inserted 4, duplicated 0, not inserted 0.
Non è così perchè tornando alla gestione gruppi il gruppo è ancora vuoto (e in ogni caso le utenze dovrebbero essere 3 e non 4).
La funzione importGroupMembers (/appCore/models/GroupmanagementAdm.php) riceve l'array $users con gli identificativi da utilizzare per l'import (duplicati compresi, se presenti nel file di origine), ricavando altri array con le informazioni utili (idst, userid completo, etc.); in questa fase viene verificata la presenza o meno nel gruppo e l'eliminazione di duplicati dagli arrays creati e gestiti all'interno della funzione.
Nel momento in cui viene preparata la parte di query per l'insert (riga 521) viene tuttavia utilizzato l'array $users ricevuto dalla funzione, che ancora contiene eventuali duplicati; ne consegue che vi siano ripetizioni nella coppie di valori predisposte per la insert (idst,idstMember) e che la query fallisca (per l'errore di chiave).
Code: Select all
foreach ($users as $key_u) // $users non è stato modificato o trattato
{
if (isset($users_idst[$key_u]))
{
$idst_u = $users_idst[$key_u];
//check if a duplicate exists
if (in_array($idst_u, $dup) !== false)
$dup_counter++;
else
{
$counter++;
$insert_values[] = "(".$id_group.", ".$idst_u.")";
}
}
}
La soluzione più immediata che abbiamo adottato è quella di rimuovere eventuali duplicati direttamente all'inizio della funzione.
Ovvero da
Code: Select all
public function importGroupMembers($users, $id_group) {
$output = array(
'total' => 0,
................
Code: Select all
public function importGroupMembers($users, $id_group) {
$users = array_unique($users);
$output = array(
'total' => 0,
................