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 :
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> ".$cellule." </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> ".$cellule." </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"> </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.
Aucune discussion
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |