#13; Modification des paramètres et du fonctionnement de 'download/multiple' qui prends la liste des sujets (leurs identifiants) puis 4 booleans (3: 1 pour chaque type de données) + 1 pour dire qu'on veut tous les sujets + Correction de 'ModuleRequest' lors du décodage du json

This commit is contained in:
xdrm-brackets 2016-05-21 18:27:10 +02:00
parent 5d1fea3ba5
commit 1a3169f484
11 changed files with 159 additions and 94 deletions

View File

@ -89,18 +89,20 @@
/* [4] Test download via AJAX /* [4] Test download via AJAX
=========================================================*/ =========================================================*/
// $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; // $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
$db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); $req = new ModuleRequest('download/multiple', array(
var_dump( array_keys($db->index()) ); 'phone' => true,
$db->close(); 'all' => false
));
$res = $req->download();
$db = new lightdb('facebook_db', __ROOT__.'/src/dynamic/'); if( $res->error != ManagerError::Success )
var_dump( array_keys($db->index()) ); var_dump( ManagerError::explicit($res->error) );
$db->close();
var_dump($res);
// $start = microtime(true); // $start = microtime(true);

View File

@ -254,9 +254,11 @@
"permissions": ["admin"], "permissions": ["admin"],
"options": { "download": true }, "options": { "download": true },
"parameters": { "parameters": {
"phone": { "description": "Identifiants des sujets d'enquêtes téléphoniques à intégrer.", "type": "array<id>", "optional": true }, "subjects": { "description": "Identifiants des sujets d'enquêtes à intégrer.", "type": "array<id>", "optional": true },
"facebook": { "description": "Identifiants des sujets d'enquêtes téléphoniques à intégrer.", "type": "array<id>", "optional": true }, "phone": { "description": "Si vaut TRUE, renvoie les sujets cellulaires.", "type": "boolean", "optional": true },
"survey": { "description": "Identifiants des sujets d'enquêtes téléphoniques à intégrer.", "type": "array<id>", "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 }
} }
} }
} }

View File

@ -165,12 +165,12 @@
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// _ __ _ _ _ // _ __ _ _ _
// __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___ // __ _____ _ __(_)/ _(_) ___ __ _| |_(_) ___ _ __ ___
// \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __| // \ \ / / _ \ '__| | |_| |/ __/ _` | __| |/ _ \| '_ \/ __|
// \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \ // \ V / __/ | | | _| | (_| (_| | |_| | (_) | | | \__ \
// \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/ // \_/ \___|_| |_|_| |_|\___\__,_|\__|_|\___/|_| |_|___/
// //
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -207,10 +207,12 @@
/* [2] Si de type ARRAY(type_elements) /* [2] Si de type ARRAY(type_elements)
=========================================================*/ =========================================================*/
if( preg_match('/^array<(.+)>$/', $type, $match) ){ if( preg_match('/^array<(.+)>$/', $type, $match) ){
// Si c'est pas un tableau on retourne une erreur // Si c'est pas un tableau on retourne une erreur
if( !is_array($value) ) if( !is_array($value) )
return false; return false;
$elements_type = $match[1]; $elements_type = $match[1];
// On verifie le type pour chaque element // On verifie le type pour chaque element
@ -256,6 +258,11 @@
return $checker && is_array($value) && count($value) > 0; return $checker && is_array($value) && count($value) > 0;
break; break;
// Boolean
case 'boolean':
return $checker && is_bool($value);
break;
// Objet non vide // Objet non vide
case 'object': case 'object':
return $checker && is_object($value) && count((array) $value) > 0; return $checker && is_object($value) && count((array) $value) > 0;

View File

@ -201,6 +201,7 @@
$tmpfname = '/tmp/download_'.uniqid().'.php'; $tmpfname = '/tmp/download_'.uniqid().'.php';
$bodyfname = __ROOT__.'/tmp/content_'.uniqid().'.php';
/* (1) On crée le fichier temporaire */ /* (1) On crée le fichier temporaire */
$tmpfnameroot = __ROOT__.$tmpfname; $tmpfnameroot = __ROOT__.$tmpfname;
@ -214,7 +215,6 @@
/* (3) Script qui écrira le contenu */ /* (3) Script qui écrira le contenu */
// 1) On écrit le contenu dans un fichier temporaire (et oui encore) // 1) On écrit le contenu dans un fichier temporaire (et oui encore)
$bodyfname = __ROOT__.'/tmp/content_'.uniqid().'.php';
$bodyfile = fopen($bodyfname, 'w'); $bodyfile = fopen($bodyfname, 'w');
fwrite($bodyfile, $returned['body']); fwrite($bodyfile, $returned['body']);
fclose($bodyfile); fclose($bodyfile);
@ -230,7 +230,7 @@
/* (5) On ferme le fichier */ /* (5) On ferme le fichier */
fclose($tmpfile); fclose($tmpfile);
chmod($tmpfile, 0775); chmod($tmpfnameroot, 0775);
$response = new ModuleResponse(ManagerError::Success); $response = new ModuleResponse(ManagerError::Success);
$response->append('link', $tmpfname); $response->append('link', $tmpfname);
@ -319,7 +319,7 @@
foreach($params as $name=>$value){ foreach($params as $name=>$value){
$json = json_decode( $value, true ); $json = json_decode( $value, true );
// Si aucune erreur, on affecte la valeur // Si aucune erreur, on affecte la valeur
if( $json != null ) if( !is_null($json) )
$params[$name] = $json; $params[$name] = $json;
} }

View File

@ -118,14 +118,36 @@
/* 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
*
*/
public static function multiple($params){ public static function multiple($params){
extract($params); extract($params);
/* (0) Gestion du formattage des paramètres */ /* (0) Gestion du formattage des paramètres */
$phone_subjects = !is_array($phone) ? array() : $phone; $subjects = !is_array($subjects) ? array() : $subjects;
$facebook_subjects = !is_array($facebook) ? array() : $facebook; $phone = !is_bool($phone) ? false : $phone;
$survey_subjects = !is_array($survey) ? array() : $survey; $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 /* [0] On récupère le dictionnaire
=========================================================*/ =========================================================*/
@ -156,33 +178,43 @@
// On ouvre une instance de la base de données
$db = new lightdb('phone_db', __ROOT__.'/src/dynamic/');
/* [2] On construit les fichiers de chaque sujet DE TELEPHONE /* [2] On construit les fichiers de chaque sujet DE TELEPHONE
=========================================================*/ =========================================================*/
foreach($phone_subjects as $s=>$subjectId){ if( $phone ){ // Si @phone vaut TRUE
/* (1) On récupère les données du sujet en cours */ // On ouvre une instance de la base de données
$subjectData = $db->fetch($subjectId); $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/');
// Si on ne trouve rien, on passe au suivant // Si on doit prendre tous les sujets, on les récupère
if( $subjectData === false ) if( $all )
continue; $subjects = array_keys( $db->index() );
/* (2) On construit le log s'il existe */ // Pour chaque sujet
$output['logs/'][$subjectId] = self::parseCSV($subjectData['logs'], $dict['logs']); foreach($subjects as $s=>$subjectId){
/* (3) On complète les relations */ /* (1) On récupère les données du sujet en cours */
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], array(), strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement $subjectData = $db->fetch($subjectId);
/* (4) On ajoute les contacts à la liste */ // Si on ne trouve rien, on passe au suivant
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement if( $subjectData === false )
continue;
/* (2) On construit le log s'il existe */
$output['logs/'][$subjectId] = self::parseCSV($subjectData['logs'], $dict['logs']);
/* (3) On complète les relations */
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], array(), strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement
/* (4) 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();
} }
// On ferme l'instance de la base de données
$db->close();
@ -190,31 +222,40 @@
// On ouvre une instance de la base de données
$db = new lightdb('facebook_db', __ROOT__.'/src/dynamic/');
/* [3] On construit les fichiers de chaque sujet DE FACEBOOK /* [3] On construit les fichiers de chaque sujet DE FACEBOOK
=========================================================*/ =========================================================*/
foreach($facebook_subjects as $s=>$subjectId){ if( $facebook ){ // Si @facebook vaut TRUE
/* (1) On récupère les données du sujet en cours */ // On ouvre une instance de la base de données
$subjectData = $db->fetch($subjectId); $db = new lightdb('facebook_db', __ROOT__.'/src/dynamic/');
// Si on ne trouve rien, on passe au suivant // Si on doit prendre tous les sujets, on les récupère
if( $subjectData === false ) if( $all )
continue; $subjects = array_keys( $db->index() );
/* (2) On complète les relations */ // Pour chaque sujet
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], array(), strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement foreach($subjects as $s=>$subjectId){
/* (3) On ajoute les contacts à la liste */ /* (1) On récupère les données du sujet en cours */
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement $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'], array(), 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();
} }
// On ferme l'instance de la base de données
$db->close();
@ -222,32 +263,40 @@
// On ouvre une instance de la base de données
$db = new lightdb('survey_db', __ROOT__.'/src/dynamic/');
/* [4] On construit les fichiers de chaque sujet DE FORMULAIRE /* [4] On construit les fichiers de chaque sujet DE FORMULAIRE
=========================================================*/ =========================================================*/
foreach($facebook_subjects as $s=>$subjectId){ if( $survey ){ // Si @survey vaut TRUE
/* (1) On récupère les données du sujet en cours */ // On ouvre une instance de la base de données
$subjectData = $db->fetch($subjectId); $db = new lightdb('survey_db', __ROOT__.'/src/dynamic/');
// Si on ne trouve rien, on passe au suivant // Si on doit prendre tous les sujets, on les récupère
if( $subjectData === false ) if( $all )
continue; $subjects = array_keys( $db->index() );
/* (2) On complète les relations */ // Pour chaque sujet
$output['common_']['relations'] .= self::parseCSV($subjectData['relations'], array(), strlen($output['common_']['relations']) == 0 ); // On affiche les colonnes pour la première fois uniquement foreach($subjects as $s=>$subjectId){
/* (3) On ajoute les contacts à la liste */ /* (1) On récupère les données du sujet en cours */
$output['common_']['contacts'] .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($output['common_']['contacts']) == 0 ); // On affiche les colonnes pour la première fois uniquement $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'], array(), 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();
} }
// On ferme l'instance de la base de données
$db->close();

Binary file not shown.

View File

@ -0,0 +1,9 @@
<?php
header("Content-Type: application/zip; charset=utf-8");
header("Content-Disposition: attachment; filename=export_21_05_2016_.zip");
header("Pragma: no-cache");
header("Expires: 0");
readfile('/var/www/socioview/tmp/content_574082c3eb3eb.php');
unlink('/var/www/socioview/tmp/content_574082c3eb3eb.php');
unlink(__FILE__);
?>

View File

@ -1,3 +0,0 @@
/*#group_0:checked + #subject-list{
display: none;
}*/

View File

@ -24,8 +24,8 @@ $pers = $request->answer();
<h4>Exporter les données au format .csv</h4> <h4>Exporter les données au format .csv</h4>
<strong>Choix des sujets</strong> <strong>Choix des sujets</strong>
<br><input type='radio' name='subject-group' data-name='group' id='group_0' value='sel' ><label for='group_0'>Tous les sujets</label> <br><input type='radio' name='subject-group' data-name='group' id='group_0' value='all' ><label for='group_0'>Tous les sujets</label>
<br><input type='radio' name='subject-group' data-name='group' id='group_1' value='all' checked><label for='group_1'>Les sujets selectionnés uniquement</label> <br><input type='radio' name='subject-group' data-name='group' id='group_1' value='sel' checked><label for='group_1'>Les sujets selectionnés uniquement</label>
<br><br> <br><br>
<article style='display: inline;' id='subject-list'> <article style='display: inline;' id='subject-list'>

6
view/js/data-min.js vendored
View File

@ -1,3 +1,3 @@
var subjectList=$("#subject-list"),subjectAdd=$("#add-subject"),exportDeflater=new FormDeflater(document.getElementById("export-form"),["input"],["data-name"]);subjectAdd.addEventListener("click",function(a){a=document.createElement("input");a.type="number";a.dataset.name="subjects";a.placeholder="Sujet";a.style="width: 5em; display: block;";subjectList.appendChild(a)},!1); var subjectList=$("#subject-list"),subjectAdd=$("#add-subject"),exportDeflater=new FormDeflater(document.getElementById("export-form"),["input"],["data-name"]);subjectAdd.addEventListener("click",function(b){b=document.createElement("input");b.type="number";b.dataset.name="subjects";b.placeholder="Sujet";b.style="width: 5em; display: block;";subjectList.appendChild(b)},!1);
$("#export-form #export-all").addEventListener("click",function(a){var b=(new FormDeflater(subjectList,["input"],["data-name"])).deflate().subjects;a=[];b instanceof Array||(b=[b]);for(var c=0;c<b.length;c++)0<b[c].length&&!isNaN(b[c])&&a.push(b[c]);b=exportDeflater.deflate();c={path:"download/multiple"};"1"==b.phone&&(c.phone=a);"1"==b.facebook&&(c.facebook=a);"1"==b.survey&&(c.survey=a);api.send(c,function(a){if(0!=a.ModuleError)return!1;document.location=a.link;Notification.success("OK","Lancement du t\u00e9l\u00e9chargement..")})}, $("#export-form #export-all").addEventListener("click",function(b){var a=(new FormDeflater(subjectList,["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();a={path:"download/multiple",phone:"1"==a.phone,facebook:"1"==a.facebook,survey:"1"==a.survey,all:"all"==a.group};console.warn(b);0<b.length&&(a.subjects=b);api.send(a,function(a){if(0!=a.ModuleError)return!1;document.location=
!1); a.link;Notification.success("OK","Lancement du t\u00e9l\u00e9chargement..")})},!1);

View File

@ -49,24 +49,23 @@ $('#export-form #export-all').addEventListener('click', function(e){
/* (4) On construit la requête */ /* (4) On construit la requête */
var request = { path: 'download/multiple' }; 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
all: deflated.group == 'all' // VRAI si on veut TOUS les sujets
};
// Si données CELLULAIRES // On ajoute les sujets s'il y en a
if( deflated.phone == '1' ) console.warn(subjects);
request.phone = subjects; if( subjects.length > 0 )
request.subjects = subjects;
// Si données FACEBOOK
if( deflated.facebook == '1' )
request.facebook = subjects;
// Si données QUESTIONNAIRES
if( deflated.survey == '1' )
request.survey = subjects;
/* (5) On lance la requête */ /* (5) On lance la requête */
api.send(request, function(res){ api.send(request, function(res){
// Si erreur // Si erreur
if( res.ModuleError != 0 ) if( res.ModuleError != 0 )
return false; return false;