Valider 69222037 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

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
parent 9b1c0f23
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+26 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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);