Tableaux et présentation dans spip

Bonjour, j'ai besoin de présenter des données tabulaires dans un article, et je construis un tableau à l'aide des raccourcis spip. Jusque là, tout se passe bien, et, via le css, je donne à la table résultante à peu près les couleurs et la forme voulue.

Mais il demeure un problème : je voudrais pouvoir mettre une largeur prédéfinie aux différents <td>, pas forcément la même pour chaque <td>. Je n'ai pas trouvé la solution (si elle existe).

En fait, on pourrait le faire s'il était possible d'assigner une classe par <td> (genre <td classe="col1">, etc.). Il semble que celà ne soit pas possible en l'état. La seule solution que j'ai imaginée serait d'injecter une image invisible dans les <td> de la première ligne, mais, outre le côté "barbare" de la chose, c'est absolument inutilisable par un rédacteur non développeur.

Y aurait-il une idée ? Merci.
----
Marc VALLETEAU de MOULLIAC
assfor
Imaginons votre image
06 61 79 17 31
http://www.assfor.com
----------------------------------------------
P Merci de respecter l'environnement - n'imprimez ce message que si c'est véritablement nécessaire !

"L'intégrité de ce message n'étant pas assurée sur Internet, assfor ne peut être tenu pour responsable de son contenu. Si vous n'êtes pas destinataire de ce message, merci de le détruire et d'avertir l'expéditeur."

Marc VALLETEAU de MOULLIAC a écrit :

Bonjour, j'ai besoin de présenter des données tabulaires dans un article, et je construis un tableau à l'aide des raccourcis spip. Jusque là, tout se passe bien, et, via le css, je donne à la table résultante à peu près les couleurs et la forme voulue.

Mais il demeure un problème : je voudrais pouvoir mettre une largeur prédéfinie aux différents <td>, pas forcément la même pour chaque <td>. Je n'ai pas trouvé la solution (si elle existe).

En fait, on pourrait le faire s'il était possible d'assigner une classe par <td> (genre <td classe="col1">, etc.). Il semble que celà ne soit pas possible en l'état. La seule solution que j'ai imaginée serait d'injecter une image invisible dans les <td> de la première ligne, mais, outre le côté "barbare" de la chose, c'est absolument inutilisable par un rédacteur non développeur.

Y aurait-il une idée ? Merci.
----
Marc VALLETEAU de MOULLIAC
assfor
Imaginons votre image
06 61 79 17 31
http://www.assfor.com
----------------------------------------------
P Merci de respecter l'environnement - n'imprimez ce message que si c'est véritablement nécessaire !

"L'intégrité de ce message n'étant pas assurée sur Internet, assfor ne peut être tenu pour responsable de son contenu. Si vous n'êtes pas destinataire de ce message, merci de le détruire et d'avertir l'expéditeur."

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip
FAQ : FAQ webmestre - SPIP

Bonjour,

Marc VALLETEAU de MOULLIAC a écrit :

Mais il demeure un problème : je voudrais pouvoir mettre une largeur prédéfinie aux différents <td>, pas forcément la même pour chaque <td>. Je n'ai pas trouvé la solution (si elle existe).

En fait, on pourrait le faire s'il était possible d'assigner une classe par <td> (genre <td classe="col1">, etc.).

L'élément html <colgroup> peut-être ??

(désolé pour le message parti tout seul avant...)

--
Stéphane

Jeune Chambre Economique, Mouvement Jeunes Citoyens Entreprenants
  http://www.jce-rochefort.org - http://www.jce-poitoucharentes.org

Loisirs, arts, nature, technologie en Pays Santon
    Accueil en Charente Maritime *** http://www.team-santonum.com
    BTS Electrotechnique *** http://enselec.team-santonum.com

Marc VALLETEAU de MOULLIAC a écrit :

Mais il demeure un problème : je voudrais pouvoir mettre une largeur prédéfinie aux différents <td>, pas forcément la même pour chaque <td>. Je n'ai pas trouvé la solution (si elle existe).

Y aurait-il une idée ? Merci.

le faire en jquery ?

voila un exemple de ce que j'ai fait pour masquer par exemple la première colonne, la coloration d'une ligne sur 2, et la suppression de la première ligne ( si elle est vide )
la suppression des premieres lignes ou colonnes se fait quand on a un tableau avec les header soit en ligne soit en colonne.

Dans ton cas ..... plus simple il te suffit d'utiliser le .each et de l'adapter

$(document).ready(
        function(){
            //on applique le style first_td aux td et aux th et on vérifie si ils n'ont pas de contenu

            $('table').each(

                function(){
                    hide_first_column = true;
                    cpt = 0;
                    first_ligne = true;

                    //vérification de la présence d'un titre pour decalage des interlignes
                    $('th',$(this)).each(
                        function(){
                            if(first_ligne && $(this).text() != ' ' && $(this).text() != ''){
                                first_ligne = false;
                            }
                        }
                    );

                    if(first_ligne){
                        cpt++;
                    }

                    $('tr',$(this)).each(
                        function(){
                            //coloration d'une ligne sur 2
                            if(cpt%2==0)
                                $(this).addClass('interligne');
                            cpt++;

                            //ajout d'une classe a la premiere cellule de chaque ligne
                            //et vérification de la presence de contenu
                            $('th:first, td:first',$(this)).each(
                                function(){
                                    $(this).addClass('first_td');
                                    if($(this).text()!=' ' && $(this).text()!='')
                                        hide_first_column = false;
                                }
                            );

                            //on ajoute une classe aux dernière cellules de chaque lignes
                            $('th:last, td:last',$(this)).each(

                                function(){
                                    $(this).addClass('last_td');
                                }
                            );

                            //si aucun contenu on masque la premiere colonne
                            if(hide_first_column){
                                $('th:first, td:first',$(this)).each(
                                    function(){
                                        $(this).addClass('displaynone');
                                    }
                                );
                            }
                        }
                    );
                }
            );
        }
    );

Marc VALLETEAU de MOULLIAC a écrit :

Merci beaucoup Yoann, ça a l'air parfait ... Mais j'avoue être vraiment très fruste en javascript, aussi quelques questions :

1. quand tu dis en jquery, tu veux dire, je suppose, en javascript, mais où mets-tu le script en question ? Et comment l'appeler ensuite ?

oui jquery n'est rien d'autre qu'un framework javascript.
mettre le jquery.js dans le header de ta page (spip.php?page=jquery.js ou mettre #INSERT_HEAD dans ton head html.

et utiliser les fonctions de jquery ensuite.
la base :
$(document).ready(
       function(){
             ....
       }
);

permet de ne lancer ton code qu'une fois que le DOM est chargé ( n'attend pas que toutes les images le soient, c'est + rapide)

2. le $('table').each s'applique à toutes les tables rencontrées, non ?

oui et comme mon site est en full xhtml et que je n'utilise les tables que pour faire des tableaux, ca collait a mon cas.
tu peux aussi avoir un truc du genre $('table.spip').each pour toutes les tables générées par spip ( il me semble, il faut vérifier si la classe spip est bien ajoutée )

pour plus d'infos va voir la doc de jquery sur les selecteurs :slight_smile:

3. Si j'ai bien compris, 'il me suffit', dans $('table').each, d'utiliser un
      $('td',$(this)).each {
        et ici, pour chaque td (ou th), mettre une classe du genre classe1, classe2, etc, autant qu'il rencontre de td ?
    }

oui en gros c'est ca

var i=0;
$('td',$(this)).each {
       i++;
        $(this).addclass('classe'+i);
    }

et le tour est joué ( pas testé )

Je crois voir assez bien ce qu'il faut faire, mais, comme je n'utilise, pour le moment, jquery qu'à travers les automatismes de spip, je suis un peu comme une vache devant un oeuf de poule :slight_smile:

Merci de ton aide ...

réponds a la liste par contre ... d'autres pourraient avoir besoin de cette info s'ils la cherche

Bonjour,

Il est possible de faire cette manipulation en CSS en utilisant les sélecteurs de proximité :

td+td {} // Concerne la seconde colonne (et toutes les occurrence de deux colonnes successives la règle s'appliquant à la seconde colonne)
td+td+td {} // concerne la troisième colonne d'un groupe de trois colonnes

Attention cette technique est assez complexe à utiliser. En effet si on ne prend que la première ligne de cet exemple, elle concerne toutes les colonnes d'un tableau sauf la première. En effet, la règle s'applique dès qu'il y a deux TD se suivant comme c'est le cas de la deuxième colonne, de la troisième colonne, etc.

Si vous connaissez à l'avance les nombre de colonnes c'est une manière de faire assez intéressante et surtout qui vous évite du JS qui ne devrait pas être utilisé pour gérer le design, je le rappelle (bien que, la discussion soit ouverte).

Voilà ma petite contrib de la nouvelle année. Alors bonne année à tout le monde.

_
Pablo

Le 15 janv. 08 à 10:00, Yoann NOGUES (zerax) a écrit :

Marc VALLETEAU de MOULLIAC a écrit :

Mais il demeure un problème : je voudrais pouvoir mettre une largeur
prédéfinie aux différents <td>, pas forcément la même pour chaque
<td>. Je n'ai pas trouvé la solution (si elle existe).

Y aurait-il une idée ? Merci.

le faire en jquery ?

voila un exemple de ce que j'ai fait pour masquer par exemple la
première colonne, la coloration d'une ligne sur 2, et la suppression de
la première ligne ( si elle est vide )
la suppression des premieres lignes ou colonnes se fait quand on a un
tableau avec les header soit en ligne soit en colonne.

Dans ton cas ..... plus simple il te suffit d'utiliser le .each et de
l'adapter

$(document).ready(
       function(){
           //on applique le style first_td aux td et aux th et on
vérifie si ils n'ont pas de contenu

           $('table').each(

               function(){
                   hide_first_column = true;
                   cpt = 0;
                   first_ligne = true;

                   //vérification de la présence d'un titre pour
decalage des interlignes
                   $('th',$(this)).each(
                       function(){
                           if(first_ligne && $(this).text() != ' ' &&
$(this).text() != ''){
                               first_ligne = false;
                           }
                       }
                   );

                   if(first_ligne){
                       cpt++;
                   }

                   $('tr',$(this)).each(
                       function(){
                           //coloration d'une ligne sur 2
                           if(cpt%2==0)
                               $(this).addClass('interligne');
                           cpt++;

                           //ajout d'une classe a la premiere cellule
de chaque ligne
                           //et vérification de la presence de contenu
                           $('th:first, td:first',$(this)).each(
                               function(){
                                   $(this).addClass('first_td');
                                   if($(this).text()!=' ' &&
$(this).text()!='')
                                       hide_first_column = false;
                               }
                           );

                           //on ajoute une classe aux dernière cellules
de chaque lignes
                           $('th:last, td:last',$(this)).each(

                               function(){
                                   $(this).addClass('last_td');
                               }
                           );

                           //si aucun contenu on masque la premiere colonne
                           if(hide_first_column){
                               $('th:first, td:first',$(this)).each(
                                   function(){
                                       $(this).addClass('displaynone');
                                   }
                               );
                           }
                       }
                   );
               }
           );
       }
   );

_______________________________________________
liste spip
spip@rezo.net - désabonnement : spip-off@rezo.net
Infos et archives : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
irc://irc.freenode.net/spip
FAQ : FAQ webmestre - SPIP