Browse Source

exporter_csv() : ajout de l'option callback qui permet d'appeler une callback sur chaque ligne

+ nouvelle fonction exporter_csv_ligne_numerotee() qui remplace exporter_csv_ligne() pour traiter chaque ligne avec un numero de ligne, 0 = entete et donnees a partir de la ligne 1, ce qui permet a une callback de savoir ou on en est
La callback est appelle avec les memes arguments que exporter_csv_ligne_numerotee() sauf le dernier qui est la callback donc
v3
Cerdic 2 years ago
parent
commit
692220378f
  1. 29
      inc/exporter_csv.php

29
inc/exporter_csv.php

@ -41,13 +41,18 @@ function exporter_csv_champ($champ) {
*
* @uses exporter_csv_champ()
*
* @param int $nb
* @param array $ligne
* @param string $delim
* @param string|null $importer_charset
* Si défini exporte dans le charset indiqué
* @param callable $callback
* @return string
*/
function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) {
function exporter_csv_ligne_numerotee($nb, $ligne, $delim = ',', $importer_charset = null, $callback=null) {
if ($callback) {
$ligne = call_user_func($callback, $nb, $ligne, $delim, $importer_charset);
}
$output = join($delim, array_map('exporter_csv_champ', $ligne)) . "\r\n";
if ($importer_charset) {
$output = str_replace('’', '\'', $output);
@ -56,6 +61,18 @@ function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) {
return $output;
}
/**
* @deprecated
*
* @param $ligne
* @param string $delim
* @param null $importer_charset
* @return string
*/
function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null){
return exporter_csv_ligne_numerotee(null, $ligne, $delim, $importer_charset);
}
/**
* Exporte une ressource sous forme de fichier CSV
*
@ -74,6 +91,7 @@ function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) {
* array $entetes : tableau d'en-tetes pour nommer les colonnes (genere la premiere ligne)
* bool $envoyer : pour envoyer le fichier exporte (permet le telechargement)
* string $charset : charset de l'export si different de celui du site
* callable callback : fonction callback a appeler sur chaque ligne pour mettre en forme/completer les donnees
* @return string
*/
function inc_exporter_csv_dist($titre, $resource, $options = []) {
@ -95,6 +113,7 @@ function inc_exporter_csv_dist($titre, $resource, $options = []) {
'entetes' => null,
'envoyer' => true,
'charset' => null,
'callback' => null,
];
$options = array_merge($default_options, $options);
@ -126,9 +145,12 @@ function inc_exporter_csv_dist($titre, $resource, $options = []) {
$filename = "$filename.$extension";
$output = '';
$nb = 0;
if (!empty($options['entetes']) and is_array($options['entetes'])) {
$output = exporter_csv_ligne($options['entetes'], $options['delim'], $importer_charset);
$output = exporter_csv_ligne_numerotee($nb, $options['entetes'], $options['delim'], $importer_charset, $options['callback']);
}
// les donnees commencent toujours a la ligne 1, qu'il y ait ou non des entetes
$nb++;
// on passe par un fichier temporaire qui permet de ne pas saturer la memoire
// avec les gros exports
@ -137,8 +159,9 @@ function inc_exporter_csv_dist($titre, $resource, $options = []) {
$length = fwrite($fp, $output);
while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) {
$output = exporter_csv_ligne($row, $options['delim'], $importer_charset);
$output = exporter_csv_ligne_numerotee($nb, $row, $options['delim'], $importer_charset, $options['callback']);
$length += fwrite($fp, $output);
$nb++;
}
fclose($fp);

Loading…
Cancel
Save