NxTIC/manager/module/download.php

211 lines
5.8 KiB
PHP
Raw Normal View History

<?php
namespace manager\module;
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ModuleRequest;
use \manager\ManagerError;
use \manager\Repo;
2016-05-18 08:08:34 +00:00
use \manager\lightdb;
class download{
/* 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
/* [0] On récupère toutes les colonnes
=========================================================*/
$columns = array(); // Contiendra les colonnes
/* (1) Pour chaque set de @data */
foreach($data as $dataset){
$keys = array();
/* (2) Pour chaque champ de chaque set de @data, on ajoute les clés */
foreach($dataset as $key=>$value){
// {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" );
// {2} Si c'est une valeur simple -> on ajoute la clé //
else
array_push( $keys, $key );
}
/* (3) On ajoute à chaque fois les clés du set à la liste des colonnes */
$columns = array_unique( array_merge( $columns, $keys ) );
}
/* [1] On ajoute les colonnes à la sortie
=========================================================*/
foreach($columns as $i=>$column)
$output .= ($i < count($columns)-1) ? "\"$column\";" : "\"$column\"\r\n";
/* [2] On récupère les valeurs et on les ajoute à la sortie
=========================================================*/
/* (1) Pour chaque set de @data */
foreach($data as $dataset){
/* (2) Pour chaque colonne */
foreach($columns as $c=>$column){
/* (3) On décompose la colonne (ne change que si elle l'est) */
$col = explode('_', $column);
$composed = true;
// 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;
}
/* (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-17 14:51:24 +00:00
public static function phone($params){
extract($params);
2016-05-18 08:08:34 +00:00
/* [0] On récupère le dictionnaire
=========================================================*/
$dict = ResourceDispatcher::getResource('f/json/dictionary/upload/phone_storage');
/* (2) Si une erreur pour le fichier de conf */
if( $dict === false )
return ManagerError::UnreachableResource;
/* (3) On récupère la config sous forme de tableau */
$dict = json_decode( $dict, true );
/* (4) Si erreur de PARSAGE */
if( !is_array($dict) )
return ManagerError::ParsingFailed;
2016-05-18 08:08:34 +00:00
// Contiendra les données de tous les sujets
$output = array();
2016-05-18 08:08:34 +00:00
// On ouvre une instance de la base de données
$db = new lightdb('db', __ROOT__.'/src/upload/phone_storage/');
2016-05-18 08:08:34 +00:00
/* [1] On construit les fichiers de chaque sujet
2016-05-17 14:51:24 +00:00
=========================================================*/
2016-05-18 08:08:34 +00:00
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 construit le CSV */
$output[$s] = array(
'logs' => self::parseCSV($subjectData['logs'], $dict['logs']),
'contacts' => self::parseCSV($subjectData['contacts'], $dict['contacts']),
'relations' => self::parseCSV($subjectData['relations'], array()),
'dict' => ''
);
/* (3) On construit le fichier du dictionnaire */
$output[$s]['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n";
foreach($dict as $ds=>$dataset)
foreach($dataset as $f=>$field)
foreach($field as $key=>$value)
$output[$s]['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n";
2016-05-18 08:08:34 +00:00
}
// On ferme l'instance de la base de données
$db->close();
2016-05-17 14:51:24 +00:00
/* [4] Création de l'archive
=========================================================*/
$zip = new \ZipArchive();
$fname = '/tmp/'.time().'.zip';
$zip->open($fname, \ZipArchive::CREATE);
2016-05-18 08:08:34 +00:00
foreach($output as $subjectId=>$files){
foreach($files as $file=>$content)
$zip->addFromString($subjects[$subjectId].'/'.$file.'.csv', $content);
}
2016-05-17 14:51:24 +00:00
$zip->close();
2016-05-17 14:51:24 +00:00
/* [5] On lance le téléchargement
=========================================================*/
return array(
'ModuleError' => ManagerError::Success,
'headers' => array(
'Content-Type' => 'application/zip; charset=utf-8',
'Content-Disposition' => 'attachment; filename=phone_data.zip',
'Pragma' => 'no-cache',
'Expires' => '0'
),
'body' => file_get_contents($fname)
);
2016-05-17 14:51:24 +00:00
}
}
?>