NxTIC/manager/module/download.php

307 lines
8.5 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace manager\module;
use \manager\Database;
use \manager\ResourceDispatcher;
use \manager\sessionManager;
use \manager\ModuleRequest;
use \manager\ManagerError;
use \manager\Repo;
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;
}
public static function phone($params){
extract($params);
/* [0] On récupère le dictionnaire
=========================================================*/
$dict = ResourceDispatcher::getResource('f/json/dictionary/dy/phone');
/* (2) Si une erreur pour le fichier de conf */
if( $dict === false )
return array( 'ModuleError' => 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 array( 'ModuleError' => ManagerError::ParsingFailed );
// Contiendra les données de tous les sujets
$output = array();
// On ouvre une instance de la base de données
$db = new lightdb('phone_db', __ROOT__.'/src/dynamic/');
/* [1] On construit les fichiers de 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 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";
}
// On ferme l'instance de la base de données
$db->close();
/* [4] Création de l'archive
=========================================================*/
$zip = new \ZipArchive();
$fname = '/tmp/'.time().'.zip';
$zip->open($fname, \ZipArchive::CREATE);
foreach($output as $subjectId=>$files){
foreach($files as $file=>$content)
if( strlen($content) > 0 )
$zip->addFromString($subjects[$subjectId].'/'.$file.'.csv', $content);
}
$zip->close();
/* [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)
);
}
public static function facebook($params){
extract($params);
/* [0] On récupère le dictionnaire
=========================================================*/
$dict = ResourceDispatcher::getResource('f/json/dictionary/dy/facebook');
/* (2) Si une erreur pour le fichier de conf */
if( $dict === false )
return array( 'ModuleError' => 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 array( 'ModuleError' => ManagerError::ParsingFailed );
// Contiendra les données de tous les sujets
$output = array();
// On ouvre une instance de la base de données
$db = new lightdb('facebook_db', __ROOT__.'/src/dynamic/');
/* [1] On construit les fichiers de 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 construit le CSV */
$output[$s] = array(
'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";
}
// On ferme l'instance de la base de données
$db->close();
/* [4] Création de l'archive
=========================================================*/
$zip = new \ZipArchive();
$fname = '/tmp/'.time().'.zip';
$zip->open($fname, \ZipArchive::CREATE);
foreach($output as $subjectId=>$files){
foreach($files as $file=>$content)
if( strlen($content) > 0 )
$zip->addFromString($subjects[$subjectId].'/'.$file.'.csv', $content);
}
$zip->close();
/* [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=facebook_data.zip',
'Pragma' => 'no-cache',
'Expires' => '0'
),
'body' => file_get_contents($fname)
);
}
}
?>