Gestion de l'export `download/multiple` suppression de paramètres mais correction de tous les fichiers
This commit is contained in:
parent
3633d9f344
commit
7b253bcff5
|
@ -130,9 +130,6 @@
|
|||
/* DOWNLOAD D'UN FICHIER CONTENANT LES DONNEES SELECTIONNEES
|
||||
*
|
||||
* @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)
|
||||
*
|
||||
* @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 */
|
||||
$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) Contacts exportés de `survey_db`
|
||||
---------------------------------------------------------*/
|
||||
$db = new lightdb('survey_db');
|
||||
|
||||
/* (1) On selectionne les clés des sujets à extraire */
|
||||
/* (1) On récupère tous les sujets si c'est spécifié */
|
||||
if( $all )
|
||||
$subjectIds = array_keys( $db->index() );
|
||||
|
||||
/* (2) Pour chaque sujet */
|
||||
foreach($subjectIds as $s=>$subjectId){
|
||||
$subjectids = $subjectindexes;
|
||||
|
||||
/* (3) On récupère les données du sujet */
|
||||
$subjectData = $db->fetch($subjectId);
|
||||
/* (2) Sinon on retire les ids incorrects */
|
||||
else
|
||||
|
||||
// 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() );
|
||||
|
||||
// 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 )
|
||||
// si pas trouvé -> suivant
|
||||
if( $subject === 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
|
||||
|
||||
/* (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
|
||||
|
||||
}
|
||||
|
||||
// On ferme l'instance de la base de données
|
||||
$db->close();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* [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 )
|
||||
/* (2) Si aucun contact -> suivant */
|
||||
if( !isset($subject['contacts']) || !is_array($subject['contacts']) )
|
||||
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) Pour chaque contact */
|
||||
foreach($subject['contacts'] as $c=>$contactid){
|
||||
|
||||
/* (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
|
||||
// {3.1} On récupère le contact //
|
||||
$contact = $contactdb->fetch($contactid);
|
||||
|
||||
}
|
||||
|
||||
// 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 )
|
||||
// si pas trouvé -> suivant
|
||||
if( $contact === 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.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 );
|
||||
|
||||
/* (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
|
||||
// {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 );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* [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)
|
||||
foreach($output as $file=>$content)
|
||||
if( strlen($content) > 0 )
|
||||
$zip->addFromString($folder.$file.'.csv', $content);
|
||||
}
|
||||
$zip->addFromString($file.'.csv', $content);
|
||||
|
||||
$zip->close();
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
|
||||
"contacts": {
|
||||
|
||||
"sexe": { "0":"Homme", "1":"Femme", "2":"Indéterminé" },
|
||||
"age": {
|
||||
".": "NA",
|
||||
|
|
|
@ -246,9 +246,6 @@
|
|||
"options": { "download": true },
|
||||
"parameters": {
|
||||
"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 }
|
||||
}
|
||||
},
|
||||
|
|
|
@ -21,9 +21,10 @@ $pers = $request->answer();
|
|||
<section data-sublink='export'>
|
||||
|
||||
<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_1' value='sel' ><label for='export_group_1'>Les sujets selectionnés uniquement</label>
|
||||
<br><br>
|
||||
|
@ -33,10 +34,10 @@ $pers = $request->answer();
|
|||
</article>
|
||||
<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='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'>
|
||||
</section>
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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);
|
Loading…
Reference in New Issue