Tableau contenant les valeurs * @dict Tableau contenant le dictionnaire des valeurs * * @return csvContent 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\""; /* [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); // 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 ); $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' => '' ); /* [3] On construit le fichier du dictionnaire =========================================================*/ $output['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n"; foreach($dict as $ds=>$dataset) foreach($dataset as $f=>$field) foreach($field as $key=>$value) $output['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 $name=>$content) $zip->addFromString($name.'.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) ); } } ?>