From 7b253bcff51dafdb110ebdf3a0614220605d9657 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Wed, 23 Nov 2016 17:53:24 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20de=20l'export=20`download/multiple`?= =?UTF-8?q?=20suppression=20de=20param=C3=A8tres=20mais=20correction=20de?= =?UTF-8?q?=20tous=20les=20fichiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/api/module/download.php | 312 +++++--------------------- build/lightdb/storage/dictionary.json | 1 + config/modules.json | 3 - public_html/view/data.php | 9 +- public_html/view/js/data.js | 8 +- public_html/view/js/min/data.js | 5 + 6 files changed, 73 insertions(+), 265 deletions(-) create mode 100644 public_html/view/js/min/data.js diff --git a/build/api/module/download.php b/build/api/module/download.php index 7a3e5ca..d57ab6e 100644 --- a/build/api/module/download.php +++ b/build/api/module/download.php @@ -130,9 +130,6 @@ /* DOWNLOAD D'UN FICHIER CONTENANT LES DONNEES SELECTIONNEES * * @subjects Liste des identifiants des sujets à prendre en compte - * @phone Si TRUE, prend en compte les données des questionnaires cellulaires - * @facebook Si TRUE, prend en compte les données des questionnaires facebook - * @survey Si TRUE, prend en compte les données des questionnaires ResTIC * @all Si TRUE, prend en compte tous les sujets (annule @subjects) * * @return data Retourne une archive .zip contenant toutes les données sélectionnées @@ -143,9 +140,6 @@ /* (0) Gestion du formattage des paramètres */ $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; /* [0] On récupère le dictionnaire @@ -164,283 +158,101 @@ return [ 'ModuleError' => ManagerError::ParsingFailed ]; - /* [1] On construit l'arborescence des données + /* [1] Initialisation =========================================================*/ + /* (1) Fichiers de sortie */ $output = [ - 'common_' => [ - 'contacts' => '', - 'relations' => '', - 'dict' => '' - ] + 'contacts.fiche' => '', // contiendra les contacts et leurs données fiches + 'contacts.mini' => '', // contiendra les contacts et leurs données mini + 'relations' => '', // contiendra les relations + '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 = []; - $relations = []; + $subjectindexes = array_keys($subjectdb->index()); + $subjectids = []; + /* (1) On récupère tous les sujets si c'est spécifié */ + if( $all ) - /* (1) Contacts exportés de `survey_db` - ---------------------------------------------------------*/ - $db = new lightdb('survey_db'); + $subjectids = $subjectindexes; - /* (1) On selectionne les clés des sujets à extraire */ - if( $all ) - $subjectIds = array_keys( $db->index() ); + /* (2) Sinon on retire les ids incorrects */ + else - /* (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; - - } - - } - - } - - - /* (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; - - } - - } - - } + foreach($subjects as $i=>$id) + if( in_array($id, $subjectindexes) ) + $subjectids[] = intval($id); - var_dump($contacts); - exit(); + /* (3) Si aucun sujet restant -> error */ + 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 - $db = new lightdb('phone_db'); + /* (1) On récupère les données du sujet */ + $subject = $subjectdb->fetch($subid); - // Si on doit prendre tous les sujets, on les récupère - if( $all ) - $subjects = array_keys( $db->index() ); + // si pas trouvé -> suivant + if( $subject === false ) + continue; - // Pour chaque sujet - foreach($subjects as $s=>$subjectId){ + /* (2) Si aucun contact -> suivant */ + if( !isset($subject['contacts']) || !is_array($subject['contacts']) ) + continue; - /* (1) On récupère les données du sujet en cours */ - $subjectData = $db->fetch($subjectId); + /* (3) Pour chaque contact */ + foreach($subject['contacts'] as $c=>$contactid){ - // Si on ne trouve rien, on passe au suivant - if( $subjectData === false ) + // {3.1} On récupère le contact // + $contact = $contactdb->fetch($contactid); + + // si pas trouvé -> suivant + if( $contact === false ) continue; - /* (3) On complète les relations */ - if( isset($subjectData['relations']) ) - $output['common_']['relations'] .= self::parseCSV($subjectData['relations'], [], strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement + // {3.2} On ajoute le contact au fichier des FICHES // + if( array_key_exists('studies2', $contact) ) + // 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 */ - if( isset($subjectData['contacts']) ) - $output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement + // {3.3} On ajoute le contact au fichier des MINI // + if( array_key_exists('studies1', $contact) ) + // 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 - $db->close(); + /* (4) Si aucune relation -> suivant */ + 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 =========================================================*/ - $output['common_']['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n"; + $output['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n"; foreach($dict as $ds=>$dataset) foreach($dataset as $f=>$field) 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 @@ -449,12 +261,10 @@ $fname = __TMP__.'/'.time().'.zip'; $zip->open($fname, \ZipArchive::CREATE); - foreach($output as $folder=>$files){ - foreach($files as $file=>$content) - if( strlen($content) > 0 ) - $zip->addFromString($folder.$file.'.csv', $content); - } + foreach($output as $file=>$content) + if( strlen($content) > 0 ) + $zip->addFromString($file.'.csv', $content); $zip->close(); diff --git a/build/lightdb/storage/dictionary.json b/build/lightdb/storage/dictionary.json index 513f1a4..12b015d 100644 --- a/build/lightdb/storage/dictionary.json +++ b/build/lightdb/storage/dictionary.json @@ -11,6 +11,7 @@ "contacts": { + "sexe": { "0":"Homme", "1":"Femme", "2":"Indéterminé" }, "age": { ".": "NA", diff --git a/config/modules.json b/config/modules.json index bcbed59..99c3566 100755 --- a/config/modules.json +++ b/config/modules.json @@ -246,9 +246,6 @@ "options": { "download": true }, "parameters": { "subjects": { "description": "Identifiants des sujets d'enquêtes à intégrer.", "type": "array", "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 } } }, diff --git a/public_html/view/data.php b/public_html/view/data.php index c979f5f..2e9cd89 100644 --- a/public_html/view/data.php +++ b/public_html/view/data.php @@ -21,9 +21,10 @@ $pers = $request->answer();
-

Exporter les données au format .csv

+
Exporter les données au format .csv
+

- Choix des sujets + Choix des sujets




@@ -33,10 +34,10 @@ $pers = $request->answer(); -


Types de données +

diff --git a/public_html/view/js/data.js b/public_html/view/js/data.js index 5113678..29e51de 100644 --- a/public_html/view/js/data.js +++ b/public_html/view/js/data.js @@ -51,16 +51,10 @@ $('#export-form #export_export-all').addEventListener('click', function(e){ /* (4) On construit la requête */ var request = { path: 'download/multiple', - phone: deflated.phone == '1', // VRAI si on veut les données téléphoniques - facebook: deflated.facebook == '1', // VRAI si on veut les données facebook - survey: deflated.survey == '1', // VRAI si on veut les données ResTIC + subjects: subjects, 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 */ api.send(request, function(res){ diff --git a/public_html/view/js/min/data.js b/public_html/view/js/min/data.js new file mode 100644 index 0000000..4fcd952 --- /dev/null +++ b/public_html/view/js/min/data.js @@ -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