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\"\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 = json_decode( file_get_contents( __ROOT__.'/src/upload/phone_storage/dictionary.json'), true ); // Si erreur de lecture if( is_null($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_storage/db'); /* [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) $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) ); } } ?>