Tableau contenant les valeurs * @dict Tableau contenant le dictionnaire des valeurs * @displayColumns VRAI s'il faut afficher les colonnes * * @return csvContent 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 multiple($params){ extract($params); /* (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; /* [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 ); /* [1] On construit l'arborescence des données =========================================================*/ $output = array( 'common_' => array( 'contacts' => '', 'relations' => '', 'dict' => '' ), 'logs/' => array() // Contiendra les journaux d'appels ); // On ouvre une instance de la base de données $db = new lightdb('phone_db', __ROOT__.'/src/dynamic/'); /* [2] On construit les fichiers de chaque sujet DE TELEPHONE =========================================================*/ foreach($phone_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 log s'il existe */ $output['logs/'][$subjectId] = self::parseCSV($subjectData['logs'], $dict['logs']); /* (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 } // 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('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 =========================================================*/ $output['common_']['dict'] .= "\"sheet\";\"field\";\"key\";\"value\"\r\n"; foreach($dict as $ds=>$dataset) foreach($dataset as $f=>$field) foreach($field as $key=>$value) $output['common_']['dict'] .= "\"$ds\";\"$f\";\"$key\";\"$value\"\r\n"; /* [6] Création de l'archive =========================================================*/ $zip = new \ZipArchive(); $fname = '/tmp/'.time().'.zip'; $zip->open($fname, \ZipArchive::CREATE); foreach($output as $folder=>$files){ foreach($files as $file=>$content) if( strlen($content) > 0 ) $zip->addFromString($folder.$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=export'.date('_d_m_Y_', time()).'.zip', 'Pragma' => 'no-cache', 'Expires' => '0' ), 'body' => file_get_contents($fname) ); } } ?>