Gestion de l'export `download/multiple` suppression de paramètres mais correction de tous les fichiers

This commit is contained in:
xdrm-brackets 2016-11-23 17:53:24 +01:00
parent 3633d9f344
commit 7b253bcff5
6 changed files with 73 additions and 265 deletions

View File

@ -130,9 +130,6 @@
/* DOWNLOAD D'UN FICHIER CONTENANT LES DONNEES SELECTIONNEES /* DOWNLOAD D'UN FICHIER CONTENANT LES DONNEES SELECTIONNEES
* *
* @subjects<Array> Liste des identifiants des sujets à prendre en compte * @subjects<Array> Liste des identifiants des sujets à prendre en compte
* @phone<Boolean> Si TRUE, prend en compte les données des questionnaires cellulaires
* @facebook<Boolean> Si TRUE, prend en compte les données des questionnaires facebook
* @survey<Boolean> Si TRUE, prend en compte les données des questionnaires ResTIC
* @all<Boolean> Si TRUE, prend en compte tous les sujets (annule @subjects) * @all<Boolean> Si TRUE, prend en compte tous les sujets (annule @subjects)
* *
* @return data<File> Retourne une archive .zip contenant toutes les données sélectionnées * @return data<File> Retourne une archive .zip contenant toutes les données sélectionnées
@ -143,9 +140,6 @@
/* (0) Gestion du formattage des paramètres */ /* (0) Gestion du formattage des paramètres */
$subjects = !is_array($subjects) ? [] : $subjects; $subjects = !is_array($subjects) ? [] : $subjects;
$phone = !is_bool($phone) ? false : $phone;
$facebook = !is_bool($facebook) ? false : $facebook;
$survey = !is_bool($survey) ? false : $survey;
$all = !is_bool($all) ? false : $all; $all = !is_bool($all) ? false : $all;
/* [0] On récupère le dictionnaire /* [0] On récupère le dictionnaire
@ -164,283 +158,101 @@
return [ 'ModuleError' => ManagerError::ParsingFailed ]; return [ 'ModuleError' => ManagerError::ParsingFailed ];
/* [1] On construit l'arborescence des données /* [1] Initialisation
=========================================================*/ =========================================================*/
/* (1) Fichiers de sortie */
$output = [ $output = [
'common_' => [ 'contacts.fiche' => '', // contiendra les contacts et leurs données fiches
'contacts' => '', 'contacts.mini' => '', // contiendra les contacts et leurs données mini
'relations' => '', 'relations' => '', // contiendra les relations
'dict' => '' 'dict' => '' // contiendra le dictionnaire de valeurs
]
]; ];
/* (2) Base de données */
$subjectdb = new lightdb('subject');
$contactdb = new lightdb('contact');
/* [2] Export contacts/relations des sujets selectionnés /* [2] On construit la liste des sujets
=========================================================*/ =========================================================*/
$contacts = []; $subjectindexes = array_keys($subjectdb->index());
$relations = []; $subjectids = [];
/* (1) On récupère tous les sujets si c'est spécifié */
if( $all )
/* (1) Contacts exportés de `survey_db` $subjectids = $subjectindexes;
---------------------------------------------------------*/
$db = new lightdb('survey_db');
/* (1) On selectionne les clés des sujets à extraire */ /* (2) Sinon on retire les ids incorrects */
if( $all ) else
$subjectIds = array_keys( $db->index() );
/* (2) Pour chaque sujet */ foreach($subjects as $i=>$id)
foreach($subjectIds as $s=>$subjectId){ if( in_array($id, $subjectindexes) )
$subjectids[] = intval($id);
/* (3) On récupère les données du sujet */
$subjectData = $db->fetch($subjectId);
// si erreur -> suivant
if( $subjectData === false ) continue;
/* (4) On complète les contacts */
if( isset($subjectData['contacts']) ){
foreach($subjectData['contacts'] as $c=>$contact){
/* (5) Si le contact à déja été saisi de manière plus compléte -> suivant */
// déja saisi
$alreadyStored = isset($contacts[ intval($contact['id']) ]);
// si mini saisie et qu'on a la fiche -> on doit compléter
$moreData = $alreadyStored && isset($contacts[ intval($contact['id']) ]['studies1']) && isset($contact['studies2']);
// si on NE doit PAS saisir/compléter
if( $alreadyStored && !$moreData )
continue;
/* (6) On saisit/complète */
$contacts[ intval($contact['id']) ] = $contact;
}
}
}
/* (2) Contacts exportés de `phone_db`
---------------------------------------------------------*/
$db = new lightdb('phone_db');
/* (1) On selectionne les clés des sujets à extraire */
if( $all )
$subjectIds = array_keys( $db->index() );
/* (2) Pour chaque sujet */
foreach($subjectIds as $s=>$subjectId){
/* (3) On récupère les données du sujet */
$subjectData = $db->fetch($subjectId);
// si erreur -> suivant
if( $subjectData === false ) continue;
/* (4) On complète les contacts */
if( isset($subjectData['contacts']) ){
foreach($subjectData['contacts'] as $c=>$contact){
/* (5) Si le contact à déja été saisi de manière plus compléte -> suivant */
// déja saisi
$alreadyStored = isset($contacts[ intval($contact['id']) ]);
// si mini saisie et qu'on a la fiche -> on doit compléter
$moreData = $alreadyStored && isset($contacts[ intval($contact['id']) ]['studies1']) && isset($contact['studies2']);
// si on NE doit PAS saisir/compléter
if( $alreadyStored && !$moreData )
continue;
/* (6) On saisit/complète */
$contacts[ intval($contact['id']) ] = $contact;
}
}
}
/* (3) Contacts exportés de `facebook_db`
---------------------------------------------------------*/
$db = new lightdb('facebook_db');
/* (1) On selectionne les clés des sujets à extraire */
if( $all )
$subjectIds = array_keys( $db->index() );
/* (2) Pour chaque sujet */
foreach($subjectIds as $s=>$subjectId){
/* (3) On récupère les données du sujet */
$subjectData = $db->fetch($subjectId);
// si erreur -> suivant
if( $subjectData === false ) continue;
/* (4) On complète les contacts */
if( isset($subjectData['contacts']) ){
foreach($subjectData['contacts'] as $c=>$contact){
/* (5) Si le contact à déja été saisi de manière plus compléte -> suivant */
// déja saisi
$alreadyStored = isset($contacts[ intval($contact['id']) ]);
// si mini saisie et qu'on a la fiche -> on doit compléter
$moreData = $alreadyStored && isset($contacts[ intval($contact['id']) ]['studies1']) && isset($contact['studies2']);
// si on NE doit PAS saisir/compléter
if( $alreadyStored && !$moreData )
continue;
/* (6) On saisit/complète */
$contacts[ intval($contact['id']) ] = $contact;
}
}
}
var_dump($contacts); /* (3) Si aucun sujet restant -> error */
exit(); if( count($subjectids) === 0 )
return ['ModuleError' => ManagerError::ParamError];
/* [2] On construit les fichiers de chaque sujet DE TELEPHONE /* [3] Export contacts/relations des sujets selectionnés
=========================================================*/ =========================================================*/
if( $phone ){ // Si @phone vaut TRUE foreach($subjectids as $subid){
// On ouvre une instance de la base de données /* (1) On récupère les données du sujet */
$db = new lightdb('phone_db'); $subject = $subjectdb->fetch($subid);
// Si on doit prendre tous les sujets, on les récupère // si pas trouvé -> suivant
if( $all ) if( $subject === false )
$subjects = array_keys( $db->index() ); continue;
// Pour chaque sujet /* (2) Si aucun contact -> suivant */
foreach($subjects as $s=>$subjectId){ if( !isset($subject['contacts']) || !is_array($subject['contacts']) )
continue;
/* (1) On récupère les données du sujet en cours */ /* (3) Pour chaque contact */
$subjectData = $db->fetch($subjectId); foreach($subject['contacts'] as $c=>$contactid){
// Si on ne trouve rien, on passe au suivant // {3.1} On récupère le contact //
if( $subjectData === false ) $contact = $contactdb->fetch($contactid);
// si pas trouvé -> suivant
if( $contact === false )
continue; continue;
/* (3) On complète les relations */ // {3.2} On ajoute le contact au fichier des FICHES //
if( isset($subjectData['relations']) ) if( array_key_exists('studies2', $contact) )
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], [], strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement // On affiche les colonnes pour le premier contact uniquement
$output['contacts.fiche'] .= self::parseCSV([$contact], $dict['contacts'], strlen($output['contacts.fiche']) == 0 );
/* (4) On ajoute les contacts à la liste */ // {3.3} On ajoute le contact au fichier des MINI //
if( isset($subjectData['contacts']) ) if( array_key_exists('studies1', $contact) )
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement // On affiche les colonnes pour le premier contact uniquement
$output['contacts.mini'] .= self::parseCSV([$contact], $dict['contacts'], strlen($output['contacts.mini']) == 0 );
} }
// On ferme l'instance de la base de données /* (4) Si aucune relation -> suivant */
$db->close(); if( !isset($subject['relations']) || !is_array($subject['relations']) )
continue;
/* (5) On ajoute les relations */
$output['relations'] .= self::parseCSV($subject['relations'], [], strlen($output['relations']) == 0 );
} }
/* [3] On construit les fichiers de chaque sujet DE FACEBOOK
=========================================================*/
if( $facebook ){ // Si @facebook vaut TRUE
// On ouvre une instance de la base de données
$db = new lightdb('facebook_db');
// Si on doit prendre tous les sujets, on les récupère
if( $all )
$subjects = array_keys( $db->index() );
// Pour chaque sujet
foreach($subjects as $s=>$subjectId){
/* (1) On récupère les données du sujet en cours */
$subjectData = $db->fetch($subjectId);
// Si on ne trouve rien, on passe au suivant
if( $subjectData === false )
continue;
/* (2) On complète les relations */
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], [], strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement
/* (3) On ajoute les contacts à la liste */
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement
}
// On ferme l'instance de la base de données
$db->close();
}
/* [4] On construit les fichiers de chaque sujet DE FORMULAIRE
=========================================================*/
if( $survey ){ // Si @survey vaut TRUE
// On ouvre une instance de la base de données
$db = new lightdb('survey_db');
// Si on doit prendre tous les sujets, on les récupère
if( $all )
$subjects = array_keys( $db->index() );
// Pour chaque sujet
foreach($subjects as $s=>$subjectId){
/* (1) On récupère les données du sujet en cours */
$subjectData = $db->fetch($subjectId);
// Si on ne trouve rien, on passe au suivant
if( $subjectData === false )
continue;
/* (2) On complète les relations */
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], [], strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement
/* (3) On ajoute les contacts à la liste */
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement
}
// On ferme l'instance de la base de données
$db->close();
}
/* [5] On ajoute le dictionnaire /* [5] On ajoute le dictionnaire
=========================================================*/ =========================================================*/
$output['common_']['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n"; $output['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n";
foreach($dict as $ds=>$dataset) foreach($dict as $ds=>$dataset)
foreach($dataset as $f=>$field) foreach($dataset as $f=>$field)
foreach($field as $key=>$value) foreach($field as $key=>$value)
$output['common_']['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n"; $output['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n";
/* [6] Création de l'archive /* [6] Création de l'archive
@ -449,12 +261,10 @@
$fname = __TMP__.'/'.time().'.zip'; $fname = __TMP__.'/'.time().'.zip';
$zip->open($fname, \ZipArchive::CREATE); $zip->open($fname, \ZipArchive::CREATE);
foreach($output as $folder=>$files){
foreach($files as $file=>$content) foreach($output as $file=>$content)
if( strlen($content) > 0 ) if( strlen($content) > 0 )
$zip->addFromString($folder.$file.'.csv', $content); $zip->addFromString($file.'.csv', $content);
}
$zip->close(); $zip->close();

View File

@ -11,6 +11,7 @@
"contacts": { "contacts": {
"sexe": { "0":"Homme", "1":"Femme", "2":"Indéterminé" }, "sexe": { "0":"Homme", "1":"Femme", "2":"Indéterminé" },
"age": { "age": {
".": "NA", ".": "NA",

View File

@ -246,9 +246,6 @@
"options": { "download": true }, "options": { "download": true },
"parameters": { "parameters": {
"subjects": { "description": "Identifiants des sujets d'enquêtes à intégrer.", "type": "array<id>", "optional": true }, "subjects": { "description": "Identifiants des sujets d'enquêtes à intégrer.", "type": "array<id>", "optional": true },
"phone": { "description": "Si vaut TRUE, renvoie les sujets cellulaires.", "type": "boolean", "optional": true },
"facebook": { "description": "Si vaut TRUE, renvoie les sujet facebook.", "type": "boolean", "optional": true },
"survey": { "description": "Si vaut TRUE, renvoie les sujets ResTIC.", "type": "boolean", "optional": true },
"all": { "description": "Si vaut TRUE, renvoie tous les sujets enregistrés.", "type": "boolean", "optional": true } "all": { "description": "Si vaut TRUE, renvoie tous les sujets enregistrés.", "type": "boolean", "optional": true }
} }
}, },

View File

@ -21,9 +21,10 @@ $pers = $request->answer();
<section data-sublink='export'> <section data-sublink='export'>
<section id='export-form'> <section id='export-form'>
<h4>Exporter les données au format .csv</h4> <h6>Exporter les données au format .csv</h6>
<br><br>
<strong>Choix des sujets</strong> <u><strong>Choix des sujets</strong></u><br>
<br><input type='radio' name='export_subject-group' data-name='group' id='export_group_0' value='all' checked><label for='export_group_0'>Tous les sujets</label> <br><input type='radio' name='export_subject-group' data-name='group' id='export_group_0' value='all' checked><label for='export_group_0'>Tous les sujets</label>
<br><input type='radio' name='export_subject-group' data-name='group' id='export_group_1' value='sel' ><label for='export_group_1'>Les sujets selectionnés uniquement</label> <br><input type='radio' name='export_subject-group' data-name='group' id='export_group_1' value='sel' ><label for='export_group_1'>Les sujets selectionnés uniquement</label>
<br><br> <br><br>
@ -33,10 +34,10 @@ $pers = $request->answer();
</article> </article>
<input type='button' id='export_add-subject' class='primary' value='+' style='padding:.2em .6em; margin: .5em 0'> <input type='button' id='export_add-subject' class='primary' value='+' style='padding:.2em .6em; margin: .5em 0'>
<br><br><br><strong>Types de données</strong> <!-- <br><br><br><strong>Types de données</strong>
<br><br><input type='checkbox' data-name='phone' value='1' id='export_phone_0' checked><label for='export_phone_0'>Données cellulaires</label> <br><br><input type='checkbox' data-name='phone' value='1' id='export_phone_0' checked><label for='export_phone_0'>Données cellulaires</label>
<br><br><input type='checkbox' data-name='facebook' value='1' id='export_facebook_0' checked><label for='export_facebook_0'>Données Facebook</label> <br><br><input type='checkbox' data-name='facebook' value='1' id='export_facebook_0' checked><label for='export_facebook_0'>Données Facebook</label>
<br><br><input type='checkbox' data-name='restic' value='1' id='export_restic_0' checked><label for='export_restic_0'>Données <i>Lab Surveys</i></label> <br><br><input type='checkbox' data-name='restic' value='1' id='export_restic_0' checked><label for='export_restic_0'>Données <i>Lab Surveys</i></label> -->
<br><br><input type='submit' class='primary hover' style='padding:.5em 2em;' value='Télécharger' id='export_export-all'> <br><br><input type='submit' class='primary hover' style='padding:.5em 2em;' value='Télécharger' id='export_export-all'>
</section> </section>

View File

@ -51,16 +51,10 @@ $('#export-form #export_export-all').addEventListener('click', function(e){
/* (4) On construit la requête */ /* (4) On construit la requête */
var request = { var request = {
path: 'download/multiple', path: 'download/multiple',
phone: deflated.phone == '1', // VRAI si on veut les données téléphoniques subjects: subjects,
facebook: deflated.facebook == '1', // VRAI si on veut les données facebook
survey: deflated.survey == '1', // VRAI si on veut les données ResTIC
all: deflated.group == 'all' // VRAI si on veut TOUS les sujets all: deflated.group == 'all' // VRAI si on veut TOUS les sujets
}; };
// On ajoute les sujets s'il y en a
if( deflated.group != 'all' && subjects.length > 0 )
request.subjects = subjects;
/* (5) On lance la requête */ /* (5) On lance la requête */
api.send(request, function(res){ api.send(request, function(res){

View File

@ -0,0 +1,5 @@
var exportSubjectList=$("#export_subject-list"),exportSubjectAdd=$("#export_add-subject"),exportDeflater=new FormDeflater(document.getElementById("export-form"),["input"],["data-name"]);exportSubjectAdd.addEventListener("click",function(b){b=document.createElement("input");b.type="number";b.dataset.name="subjects";b.placeholder="Sujet";b.style="width: 5em; display: block;";exportSubjectList.appendChild(b)},!1);
$("#export-form #export_export-all").addEventListener("click",function(b){var a=(new FormDeflater(exportSubjectList,["input"],["data-name"])).deflate().subjects;b=[];a instanceof Array||(a=[a]);for(var c=0;c<a.length;c++)0<a[c].length&&!isNaN(a[c])&&b.push(a[c]);a=exportDeflater.deflate();api.send({path:"download/multiple",subjects:b,all:"all"==a.group},function(a){if(0!=a.ModuleError)return!1;document.location=a.link;Notification.success("OK","Lancement du t\u00e9l\u00e9chargement..")})},!1);
var chartsSubjectList=$("#charts_subject-list"),chartsSubjectAdd=$("#charts_add-subject"),chartsDeflater=new FormDeflater(document.getElementById("charts-form"),["input"],["data-name"]);chartsSubjectAdd.addEventListener("click",function(b){b=document.createElement("input");b.type="number";b.dataset.name="subjects";b.placeholder="Sujet";b.style="width: 5em; display: block;";chartsSubjectList.appendChild(b)},!1);
$("#charts-form #charts_export-all").addEventListener("click",function(b){var a=(new FormDeflater(chartsSubjectList,["input"],["data-name"])).deflate().subjects;b=[];a instanceof Array||(a=[a]);for(var c=0;c<a.length;c++)0<a[c].length&&!isNaN(a[c])&&b.push(a[c]);a=chartsDeflater.deflate();c={path:"download/chart",phone:"1"==a.phone,facebook:"1"==a.facebook,survey:"1"==a.survey,all:"all"==a.group};"all"!=a.group&&0<b.length&&(c.subjects=b);api.send(c,function(a){if(0!=a.ModuleError)return!1;document.location=
a.link;Notification.success("OK","Lancement du t\u00e9l\u00e9chargement..")})},!1);