2016-05-12 20:13:37 +00:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace manager\module;
|
|
|
|
|
use \manager\Database;
|
|
|
|
|
use \manager\ResourceDispatcher;
|
|
|
|
|
use \manager\sessionManager;
|
|
|
|
|
use \manager\ModuleRequest;
|
|
|
|
|
use \manager\ManagerError;
|
|
|
|
|
use \manager\Repo;
|
|
|
|
|
|
|
|
|
|
class download{
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* CONSTRUIT UN CONTENU CSV A PARTIR DES DONNEES @DATA ET DU DICTIONNAIRE @DICT
|
|
|
|
|
*
|
|
|
|
|
* @data<Array> Tableau contenant les valeurs
|
|
|
|
|
* @dict<Array> Tableau contenant le dictionnaire des valeurs
|
|
|
|
|
*
|
|
|
|
|
* @return csvContent<String> Retourne le contenu CSV associé
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
private static function parseCSV($data, $dict){
|
|
|
|
|
$output = ''; // Contiendra le résultat
|
|
|
|
|
$dictKeys = array_keys($dict); // Contient les clés de @dict
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [0] On récupère toutes les colonnes
|
|
|
|
|
=========================================================*/
|
|
|
|
|
$columns = array(); // Contiendra les colonnes
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (1) Pour chaque set de @data */
|
|
|
|
|
foreach($data as $dataset){
|
|
|
|
|
$keys = array();
|
2016-05-13 09:14:41 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (2) Pour chaque champ de chaque set de @data, on ajoute les clés */
|
|
|
|
|
foreach($dataset as $key=>$value){
|
2016-05-13 09:14:41 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
// {1} Si c'est un tableau -> on ajoute les sous-clés //
|
|
|
|
|
if( is_array($value) )
|
|
|
|
|
foreach($value as $subIndex=>$subValue)
|
|
|
|
|
array_push( $keys, "${key}_$subIndex" );
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
// {2} Si c'est une valeur simple -> on ajoute la clé //
|
|
|
|
|
else
|
|
|
|
|
array_push( $keys, $key );
|
2016-05-13 09:14:41 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
}
|
2016-05-13 09:14:41 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (3) On ajoute à chaque fois les clés du set à la liste des colonnes */
|
|
|
|
|
$columns = array_unique( array_merge( $columns, $keys ) );
|
|
|
|
|
}
|
2016-05-13 09:14:41 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
// var_dump($columns);
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [1] On ajoute les colonnes à la sortie
|
|
|
|
|
=========================================================*/
|
|
|
|
|
foreach($columns as $i=>$column)
|
|
|
|
|
$output .= ($i < count($columns)-1) ? "$column," : "$column\n\r";
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [2] On récupère les valeurs et on les ajoute à la sortie
|
|
|
|
|
=========================================================*/
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (1) Pour chaque set de @data */
|
|
|
|
|
foreach($data as $dataset){
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (2) Pour chaque colonne */
|
|
|
|
|
foreach($columns as $c=>$column){
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (3) On décompose la colonne (ne change que si elle l'est) */
|
|
|
|
|
$col = explode('_', $column);
|
|
|
|
|
$composed = true;
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
// Si il n'existe pas une 2me partie numérique, on annule la décomposition
|
|
|
|
|
if( !isset($col[1]) || !is_numeric($col[1]) ){
|
|
|
|
|
$col = array( $column );
|
|
|
|
|
$composed = false;
|
|
|
|
|
}
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* (4) Si la colonne existe dans le set actuel */
|
|
|
|
|
if( isset($dataset[$col[0]]) ){
|
|
|
|
|
|
|
|
|
|
/* (5) Si c'est une valeur composée, on récupère la valeur */
|
|
|
|
|
if( $composed && isset($dataset[$col[0]][$col[1]]) )
|
|
|
|
|
|
|
|
|
|
// {1} Si valeur dans le dictionnaire, on fait modulo le nombre de choix possibles //
|
|
|
|
|
if( isset($dict[$col[0]]) )
|
|
|
|
|
$output .= "\"".( $dataset[$col[0]][$col[1]] % count($dict[$col[0]]) )."\"";
|
|
|
|
|
// {2} Si pas dans le dictionnaire, on laisse la valeur //
|
|
|
|
|
else
|
|
|
|
|
$output .= "\"".$dataset[$col[0]][$col[1]]."\"";
|
|
|
|
|
|
|
|
|
|
/* (6) Si la valeur n'est pas composée, on récupère la valeur */
|
|
|
|
|
elseif( !$composed )
|
|
|
|
|
$output .= "\"".$dataset[$col[0]]."\"";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// On ajoute une virgule sauf à la dernière valeur
|
|
|
|
|
$output .= ($c < count($columns)-1) ? "," : "";
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$output .= "\r\n";
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $output;
|
|
|
|
|
}
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
public static function phone($params){
|
|
|
|
|
extract($params);
|
|
|
|
|
|
|
|
|
|
// TODO: Implémenter proprement en utilisant le système de retour + utilisant la liste de sujets dans les paramètres
|
|
|
|
|
|
|
|
|
|
$file_name = sessionManager::sha1($subjects[0]);
|
|
|
|
|
|
|
|
|
|
$phone_log = json_decode( file_get_contents(__ROOT__.'/src/upload/phone_storage/'.$file_name.'.json'), true );
|
|
|
|
|
|
|
|
|
|
// Si erreur
|
|
|
|
|
if( $phone_log == null )
|
|
|
|
|
return array( 'ModuleError' => ManagerError::ParsingFailed );
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
$dict = json_decode( file_get_contents(__ROOT__.'/src/upload/phone_storage/dictionary.json'), true );
|
|
|
|
|
|
|
|
|
|
// Si erreur
|
|
|
|
|
if( $dict == null )
|
|
|
|
|
return array( 'ModuleError' => ManagerError::ParsingFailed );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* [2] On construit le CSV
|
|
|
|
|
=========================================================*/
|
|
|
|
|
$output = array(
|
|
|
|
|
'logs' => self::parseCSV($phone_log['logs'], $dict['logs']),
|
|
|
|
|
'contacts' => self::parseCSV($phone_log['contacts'], $dict['contacts']),
|
|
|
|
|
'dict' => ''
|
|
|
|
|
);
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [3] On construit le fichier du dictionnaire
|
|
|
|
|
=========================================================*/
|
|
|
|
|
foreach($dict as $ds=>$dataset)
|
|
|
|
|
foreach($dataset as $f=>$field)
|
|
|
|
|
foreach($field as $key=>$value)
|
|
|
|
|
$output['dict'] .= "\"$ds\",\"$f\",\"$key\",\"$value\"\r\n";
|
2016-05-12 20:13:37 +00:00
|
|
|
|
|
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [4] Création de l'archive
|
2016-05-12 20:13:37 +00:00
|
|
|
|
=========================================================*/
|
|
|
|
|
$zip = new \ZipArchive();
|
|
|
|
|
$fname = '/tmp/'.time().'.zip';
|
|
|
|
|
$zip->open($fname, \ZipArchive::CREATE);
|
|
|
|
|
|
|
|
|
|
foreach($output as $name=>$content)
|
|
|
|
|
$zip->addFromString($name.'.csv', $content);
|
|
|
|
|
|
|
|
|
|
$zip->close();
|
|
|
|
|
|
2016-05-12 21:29:25 +00:00
|
|
|
|
|
2016-05-13 12:59:18 +00:00
|
|
|
|
/* [5] On lance le téléchargement
|
2016-05-12 20:13:37 +00:00
|
|
|
|
=========================================================*/
|
2016-05-12 21:29:25 +00:00
|
|
|
|
return array(
|
|
|
|
|
'ModuleError' => ManagerError::Success,
|
|
|
|
|
'headers' => array(
|
|
|
|
|
'Content-Type' => 'application/zip',
|
|
|
|
|
'Content-Disposition' => 'attachment; filename=phone_data.zip',
|
|
|
|
|
'Pragma' => 'no-cache',
|
|
|
|
|
'Expires' => '0'
|
|
|
|
|
),
|
|
|
|
|
'body' => file_get_contents($fname)
|
|
|
|
|
);
|
2016-05-12 20:13:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
?>
|