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.
Discussions par date d’activité
6 discussions
salut !
ya moyen d’avir une mise à jour pour spip 2 et 2.1 ??
codialement
Regarde le plugin odt2spip
oups j’ai rien dit, la nouvelle version spip gérant les CSV..
Répondre à ce message
J’ai modifié le code de la façon suivante :
Et j’utilise cela avec spip 1.9.2 et un modèle du type :
Ce qui permet des appels du type :
pour mettre des titres sur la ligne 1 et sur les colonnes 1 et 4
ou :
pour forcer une disposition verticale
Oups, j’ai oublié de préciser que les effets visuels (verticaux/horizontaux) sont obtenus par les classes CSS : row_odd/row_even (conforme spip) et col_odd/col_even.
J’ai mis les titres dans des cellules ’th’ plutôt que ’td’ (ça évite de définir la classe row_first qui n’avait plus de sens vu que les titres ne sont plus forcément en première ligne et/ou colonne.
Répondre à ce message
très bonne contrib. J’errai sur macro word et je suis arrivé ici... avec les mêmes problèmes :
l’idée est de gérer des tableaux un peu plus évolués. Visiblement CSV ne gère pas les fusions de cellules (colspan et rowspan). Or spip le fait via
|<|
&|^|
(respectivement colspan et rowspan).
Je me demandais si l’on pouvait procéder exactement de la même façon : on intègre un petit «
<
» dans le csv (entre les points virgules) et on l’interprète dans mes fonctions.Est-ce la bonne voie ?
Répondre à ce message
Bonjour,
je débute sous spip, et ce plugin m’interesse. Je l’ai installé mais je n’arrive pas à afficher le csv dans l’article. J’ai du raté un truc lors de l’instal, mise en ligne et tout mais je sais pas quoi.
Si quelqun pouvait expilquer étape par étape comment installer et faire fonctionner ce plugin, ca serait génial.
Merci
Bonjour,
Il ne s’agit pas encore d’un plugin. Le mode opératoire est détaillé dans l’article. Dis nous plutôt ce que tu as fait pour que ça ne fonctionne pas !
Bonjour,
J’ai récemment approfondi, grace à l’aide de Marabbeh (voir plus bas). D’où une amorce de plugin qui n’est pas encore suscptible d’être diffusé en état, mais qui peut rendre service. Envoyez-moi un message en MP. J’envoie le fichier dès que je j’aurai un peu nettoyé.
Juste oublié la signature du post
Bonjour,
J’ai un souci, je n’arrive pas a faire fonctionner cette fonction. Voici ce que j’ai fait avec la version 1.9 de SPIP :
- insertion dans la base de donnees de
titre : CSV
extension : csv
inclus : embed
upload : oui
- Ajout de la fonction dans mes_fonctions.php
- Dans dist/modeles creation de doc_csv.html avec
(#TITRE
[(#DESCRIPTIF)]
(#URL_DOCUMENT- Ensuite lorsque j’ecris un article je joins mon document csv et dans l’article je tape
Lorsque je vais dans la partie publique je ne vois pas mon tableau, je ne vois que l’icone du document que l’on peut telecharger.
Ou est mon erreur ?
Que faut il faire en plus ?
Bonjour,
Appelle-tu ton modèle dans ton article par
<doc_csvXX>
? (XX = n° du document) par exemple.Répondre à ce message
Merci pour cette contrib !
Quelqu’un connait une manière facile de lui faire accepter les accents ?
Merci !
Je me répond à moi même. Si ca peut aider quelqu’un.
Remplacer cette ligne :
$tabfic[$lignes][$c]=$data[$c] ; // on met dans le tableau
Par cette ligne :
$tabfic[$lignes][$c]=utf8_encode($data[$c]) ; // on met dans le tableau
Répondre à ce message
Très intéressante cette contrib. J’ai fait un petit essai, ça marche bien.
Une petite erreur :
$result .= "<td width='".$largcol."%' align='".$talign."' nowrap> ".$cellule." </td>\n";
cad mettre un espace devant nowrap.
J’ai aussi essayé d’en faire un modèle. Cad au lieu de mettre la boucle présentée ci-dessus dans le squelette, le rédacteur peut indiquer lui-même, dans l’article, l’endroit où il va mettre son tableau, avec la balise
<docXXX|csv>
.Voici le modèle doc_csv.html (quasiment la boucle de la contrib) :
à mettre dans le dossier squelettes/modeles/
Merci beaucoup, je regardais comment porter cette contrib vers des versions 1.9x. Je n’avais pas pensé au modèle.
Dans mon squelette, le critère doublons ne sert à rien. Puisque c’est dans un modèle et pas dans le squelette. D’ailleurs ça peut poser un problème. Mais dans mon cas, ça ne me gène pas d’afficher le document .csv d’origine.
Une autre suggestion :
Si votre fichier .xls contient des urls (http://www.mon-domaine.tld ou maito:mon-adresse@email.tld), ces adresses seront affichées telles quelles dans le fichier .csv, puis dans le tableau Spip. Pour en faire des liens cliquables, il faut ajouter une fonction :
Puis modifier le filtre tableurcsv() tout à la fin. Remplacer :
$result .= "<td width='".$largcol."%' align='".$talign."' nowrap> ".$cellule." </td>\n";
Par :
$result .= "<td width='".$largcol."%' align='".$talign."' nowrap> ".tableurcsv_formate_cellule($cellule)." </td>\n";
La fonction tableurcsv_formate_cellule() est à mettre aussi dans mes_fonctions.php.
Dans cette fonction, le paramètre $url_max permet de limiter la taille du lien, s’il risque de prendre toute la largeur du tableau. Mais l’url de redirection reste intacte.
Répondre à ce message
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 : |