NxTIC/manager/module/download.php

341 lines
9.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
* @displayColumns<Boolean> VRAI s'il faut afficher les colonnes
*
* @return csvContent<String> Retourne le contenu CSV associé
*
*/
private static function parseCSV($data, $dict, $displayColumns=true){
$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
=========================================================*/
if( $displayColumns )
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/');
$contacts = '';
/* [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']),
'relations' => self::parseCSV($subjectData['relations'], array())
);
/* (3) On ajoute les contacts à la liste */
$contacts .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($contacts) == 0 ); // On affiche les colonnes pour la première fois uniquement
}
// On ferme l'instance de la base de données
$db->close();
$output['all'] = array(
'contacts' => '',
'dict' => ''
);
// Pour le nom du répertoire
$subjects['all'] = 'all';
/* [2] On assemble tous les contacts
=========================================================*/
$output['all']['contacts'] = $contacts;
/* [3] On ajoute le dictionnaire
=========================================================*/
$output['all']['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n";
foreach($dict as $ds=>$dataset)
foreach($dataset as $f=>$field)
foreach($field as $key=>$value)
$output['all']['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n";
/* [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/');
$contacts = '';
/* [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(
'relations' => self::parseCSV($subjectData['relations'], array())
);
/* (3) On ajoute les contacts à la liste */
$contacts .= self::parseCSV($subjectData['contacts'], $dict['contacts'], strlen($contacts) == 0 ); // On affiche les colonnes pour la première fois uniquement
}
// On ferme l'instance de la base de données
$db->close();
$output['all'] = array(
'contacts' => '',
'dict' => ''
);
// Pour le nom du répertoire
$subjects['all'] = 'all';
/* [2] On assemble tous les contacts
=========================================================*/
$output['all']['contacts'] = $contacts;
/* [3] On ajoute le dictionnaire
=========================================================*/
$output['all']['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n";
foreach($dict as $ds=>$dataset)
foreach($dataset as $f=>$field)
foreach($field as $key=>$value)
$output['all']['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n";
/* [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)
);
}
}
?>