Fichier CSV vers SPIP

Dans une récente contribution Jacques J. proposait d’intégrer un tableau issu d’un fichier csv dans un article. Pour cela, il utilisait une boucle gérant les documents joints du type csv.
Le principe a été repris dans la contribution proposée ici.

1 – Préparation de la base

Comme indiqué dans la précédente contribution, SPIP n’accepte pas par défaut les fichiers csv en téléchargement.
Pour cela, il faut suivre la procédure décrite dans l’article correspondant sur www.spip.net

Il faudra retenir les valeurs suivantes :

-  titre : CSV
-  extension : csv
-  inclus : embed
-  upload : oui

Par ftp, créer un répertoire csv dans /IMG/, et ne pas oublier de régler les droits d’écriture…

2 – La fonction

Elle s’inspire à la fois de la contribution de Jacques J., et de routines présentées notamment sur nexen.net.

Vous pouvez l’installer dans mes_fonctions.php3 comme à l’accoutumée. Voici les explications pas à pas :

Dans un premier temps, le filtre va ouvrir le fichier que vous avez téléchargé.

Il va lire les lignes une à une et les placer dans un tableau

function tableurcv($fichier){

/* ouverture du fichier CSV */ 
$fic = @fopen ($fichier,"rb") or die ("Impossible d'ouvrir le fichier *.csv");
 
$lignes=0; // compteur de lignes 

// chargement des données des lignes/cellules
while ($data = @fgetcsv ($fic, 1024, ";")) { // on lit chaque ligne 
  $num = count ($data); // nbr enregistrements par ligne 
  for ($c=0; $c<$num; $c++) { // on lit chaque cellule 
  $tabfic[$lignes][$c]=$data[$c]; // on met dans le tableau 		} 
 $lignes++; // incrementation du nombre de lignes 
}

// on ferme le fichier 
  fclose ($fic);

L’apport principal de cette contribution est de permettre au créateur du fichier csv de « préprogrammer la mise en page ». En effet, il peut renseigner son fichier dont la structure ressemble à ceci :

Copie ecran tableur

Les variables pouvant être modifiées sont :
-  largeur totale du tableau dans la mise en page du squelette (en relatif ou en absolu)
-  présence d’une entete
-  l’alignement de chacune des colonnes
-  la largeur relative des colonnes, afin d’équilibrer le tableau

A noter que le filtre traite les retours de ligne générés sous Excel par la combinaison de touches ALT + Retour

Il va récupérer dans les lignes 1 et 2 les paramétrages du tableau :
-  rang 1 col 2 : largeur du tableau
-  rang 2 col 2 : existence d’une entete de tableau

S’il y a une entete, il va la traiter spécifiquement en lui affectant le style ad hoc.

// 
//construction du tableau
$result ="";
$colstyle="row_odd";

/*
    calcul des largeurs 
*/
$largeurmax = $tabfic[0][1]; // largeur du tableau souhaité, situé en rang 1 colonne 2
$largeur = array_sum($tabfic[2]); // largeur du tableau csv, situé en rang 3 = somme des cellules
//alignements des colonnes
$align = ($tabfic[3]);

Lecture et traitement de l’entete
//debut du tableau
$result .= "<table width='".$largeurmax."'align='center'>\n"; //peut être paramétré par css

$maligne=5;
// test d'entete
if ($tabfic[1][1]==1){
  $maligne++;
  $entstyle="row_first";
  $result .= "<tr class='".$entstyle."'>\n"; 
  //lecture des cellules
  for ($colonne=1 ; $colonne<=$num ; $colonne++) { 
    //calcul des largeurs
    $largcol = ($tabfic[2][$colonne-1]/$largeur)*100;
    //alignements
    switch (TRUE) {
      case ($tabfic[3][$colonne-1] == "C"):
      $talign="center";
      break;
      case ($tabfic[3][$colonne-1] == "D"):
      $talign="right";
      break;
    default:
      $talign="left";
      break;
     }

    //saut de ligne manuel?
    $cellule=$tabfic[$maligne-2][$colonne-1];
    $cellule = str_replace("\n","<br/>", $cellule);
			
    $result .= "<td width='".$largcol."%' align='".$talign."'nowrap>&nbsp;".$cellule."&nbsp;</td>\n"; 
    } 
  $result .= "</tr>\n"; 
}

Les autres lignes du tableau seront traitées en reprenant, cellule par cellule, les éléments situés dans la même colonne en rang 3 (largeur de la cellule) et 4 ( alignement).

A noter que le fichier d’exemple fourni au format xls comporte une fonction, en rang 3, qui affiche automatiquement la largeur de la colonne.

// lecture des lignes
for ($ligne=$maligne ; $ligne<=$lignes ; $ligne++) {

//petit truc pour les styles alternés
if ($colstyle=="row_odd") {
  $colstyle="row_even";
} else {
  $colstyle="row_odd";
} 
  $result .= "<tr class='".$colstyle."'>\n"; 

//lecture des cellules
for ($colonne=1 ; $colonne<=$num ; $colonne++) {
  //calcul des largeurs
  $largcol = ($tabfic[2][$colonne-1]/$largeur)*100; 
  //alignements
  switch (TRUE) {
    case ($tabfic[3][$colonne-1] == "C"):
    $talign="center";
    break;

    case ($tabfic[3][$colonne-1] == "D"):
    $talign="right";
    break;

    default:
    $talign="left";
    break;
  }

  //saut de ligne manuel?
  $cellule=$tabfic[$ligne-1][$colonne-1];
  $cellule = str_replace("\n","<br/>", $cellule);
  $result .= "<td width='".$largcol."%' align='".$talign."'nowrap>&nbsp;".$cellule."&nbsp;</td>\n"; 
} 

$result .= "</tr>\n"; 
} 

$result .= "</table>\n"; 

return $result;
}

On notera au passage un « petit bricolage » permettant de traiter correctement les styles spip des tableaux :

$colstyle="row_odd";
...
// lecture des lignes
for ($ligne=$maligne ; $ligne<=$lignes ; $ligne++) {

//petit truc pour les styles alternés
if ($colstyle=="row_odd") {
$colstyle="row_even";
} else {
$colstyle="row_odd";
} 
...

La boucle document à utiliser est du type :

<BOUCLE_documentsCSV(DOCUMENTS){id_article}{par titre}{mode=document}{doublons}{extension=csv}>
      
  <h4>[(#TITRE|supprimer_numero)]</h4>
  <p>[(#DESCRIPTIF)]</p>
  <dt>[(#URL_DOCUMENT|tableurcv)]</dt>
  <div class="clear">&nbsp;</div>
</BOUCLE_documentsCSV>

Vous trouverez dans l’archive :
-  le fichier mes_fonctions.php3.txt (extension en .txt par sécurité pour les manœuvres hatives)
-  un modèle de tableau au format .xls
-  un modèle de tableau au format .csv

Un exemple de réalisation est visible ici.

Extension : adapter cette contribution pour traiter des balises de documents directement inclus dans les articles, mais vraisemblablement, cela nécessiterait une intervention sur le coeur du code.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom