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 ;
2016-05-18 08:08:34 +00:00
use \manager\lightdb ;
2016-05-12 20:13:37 +00:00
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
2016-05-20 17:08:58 +00:00
* @ displayColumns < Boolean > VRAI s ' il faut afficher les colonnes
2016-05-13 12:59:18 +00:00
*
* @ return csvContent < String > Retourne le contenu CSV associé
*
*/
2016-05-20 17:08:58 +00:00
private static function parseCSV ( $data , $dict , $displayColumns = true ){
2016-05-13 12:59:18 +00:00
$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-12 20:13:37 +00:00
2016-05-13 12:59:18 +00:00
/* [ 1 ] On ajoute les colonnes à la sortie
=========================================================*/
2016-05-20 17:08:58 +00:00
if ( $displayColumns )
foreach ( $columns as $i => $column )
$output .= ( $i < count ( $columns ) - 1 ) ? " \" $column\ " ; " : " \ " $column\ " \r\n " ;
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
2016-05-13 14:06:04 +00:00
$output .= ( $c < count ( $columns ) - 1 ) ? " ; " : " " ;
2016-05-13 12:59:18 +00:00
}
$output .= " \r \n " ;
}
return $output ;
}
2016-05-12 20:13:37 +00:00
2016-05-20 17:43:37 +00:00
public static function multiple ( $params ){
2016-05-17 14:51:24 +00:00
extract ( $params );
2016-05-13 12:59:18 +00:00
2016-05-21 13:42:08 +00:00
/* (0) Gestion du formattage des paramètres */
$phone_subjects = ! is_array ( $phone ) ? array () : $phone ;
$facebook_subjects = ! is_array ( $facebook ) ? array () : $facebook ;
$survey_subjects = ! is_array ( $survey ) ? array () : $survey ;
2016-05-13 12:59:18 +00:00
2016-05-18 08:08:34 +00:00
/* [ 0 ] On récupère le dictionnaire
=========================================================*/
2016-05-18 14:21:42 +00:00
$dict = ResourceDispatcher :: getResource ( 'f/json/dictionary/dy/phone' );
2016-05-13 12:59:18 +00:00
2016-05-18 14:04:17 +00:00
/* (2) Si une erreur pour le fichier de conf */
if ( $dict === false )
2016-05-18 14:21:42 +00:00
return array ( 'ModuleError' => ManagerError :: UnreachableResource );
2016-05-18 14:04:17 +00:00
/* (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 ) )
2016-05-18 14:21:42 +00:00
return array ( 'ModuleError' => ManagerError :: ParsingFailed );
2016-05-12 20:13:37 +00:00
2016-05-13 12:59:18 +00:00
2016-05-20 17:29:18 +00:00
/* [ 1 ] On construit l ' arborescence des données
=========================================================*/
$output = array (
'common_' => array (
'contacts' => '' ,
'relations' => '' ,
'dict' => ''
),
'logs/' => array () // Contiendra les journaux d'appels
);
2016-05-13 12:59:18 +00:00
2016-05-18 08:08:34 +00:00
// On ouvre une instance de la base de données
2016-05-18 14:21:42 +00:00
$db = new lightdb ( 'phone_db' , __ROOT__ . '/src/dynamic/' );
2016-05-13 12:59:18 +00:00
2016-05-21 13:42:08 +00:00
/* [ 2 ] On construit les fichiers de chaque sujet DE TELEPHONE
2016-05-17 14:51:24 +00:00
=========================================================*/
2016-05-21 13:42:08 +00:00
foreach ( $phone_subjects as $s => $subjectId ){
2016-05-18 08:08:34 +00:00
/* (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 ;
2016-05-20 17:29:18 +00:00
/* (2) On construit le log s'il existe */
$output [ 'logs/' ][ $subjectId ] = self :: parseCSV ( $subjectData [ 'logs' ], $dict [ 'logs' ]);
2016-05-18 08:08:34 +00:00
2016-05-20 17:29:18 +00:00
/* (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
2016-05-12 20:13:37 +00:00
2016-05-18 08:08:34 +00:00
}
// On ferme l'instance de la base de données
$db -> close ();
2016-05-12 20:13:37 +00:00
2016-05-21 13:42:08 +00:00
// 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
=========================================================*/
foreach ( $facebook_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 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 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
=========================================================*/
foreach ( $facebook_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 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 ();
/* [ 5 ] On ajoute le dictionnaire
2016-05-20 17:08:58 +00:00
=========================================================*/
2016-05-20 17:29:18 +00:00
$output [ 'common_' ][ 'dict' ] .= " \" sheet \" ; \" field \" ; \" key \" ; \" value \" \r \n " ;
2016-05-20 17:08:58 +00:00
foreach ( $dict as $ds => $dataset )
foreach ( $dataset as $f => $field )
foreach ( $field as $key => $value )
2016-05-20 17:29:18 +00:00
$output [ 'common_' ][ 'dict' ] .= " \" $ds\ " ; \ " $f\ " ; \ " $key\ " ; \ " $value\ " \r\n " ;
2016-05-20 17:08:58 +00:00
2016-05-21 13:42:08 +00:00
/* [ 6 ] Création de l ' archive
2016-05-17 14:51:24 +00:00
=========================================================*/
$zip = new \ZipArchive ();
$fname = '/tmp/' . time () . '.zip' ;
$zip -> open ( $fname , \ZipArchive :: CREATE );
2016-05-12 20:13:37 +00:00
2016-05-20 17:29:18 +00:00
foreach ( $output as $folder => $files ){
2016-05-18 08:08:34 +00:00
foreach ( $files as $file => $content )
2016-05-18 14:21:42 +00:00
if ( strlen ( $content ) > 0 )
2016-05-20 17:29:18 +00:00
$zip -> addFromString ( $folder . $file . '.csv' , $content );
2016-05-18 08:08:34 +00:00
}
2016-05-12 20:13:37 +00:00
2016-05-17 14:51:24 +00:00
$zip -> close ();
2016-05-12 20:13:37 +00:00
2016-05-12 21:29:25 +00:00
2016-05-17 14:51:24 +00:00
/* [ 5 ] On lance le téléchargement
=========================================================*/
2016-05-12 21:29:25 +00:00
return array (
'ModuleError' => ManagerError :: Success ,
'headers' => array (
2016-05-13 14:06:04 +00:00
'Content-Type' => 'application/zip; charset=utf-8' ,
2016-05-20 17:43:37 +00:00
'Content-Disposition' => 'attachment; filename=export' . date ( '_d_m_Y_' , time ()) . '.zip' ,
2016-05-18 14:29:02 +00:00
'Pragma' => 'no-cache' ,
'Expires' => '0'
),
'body' => file_get_contents ( $fname )
);
}
2016-05-12 20:13:37 +00:00
}
?>