Contactez-nous

1

Des liens entre rubriques

13 mars 2006
par ARNO*

[SPIP 1.8] SPIP ne permet pas de définir des liens de traduction entre rubriques (seulement entre articles). Or, certains sites ont une structure correspondant exactement à ce besoin, car leur structure multilingue est basée sur une séparation des rubriques par langues.

La méthode suivante permet d’établir assez simplement des liens entre les rubriques, tout en facilitant le classement des rubriques dans la gestion dans l’espace privé.

Principe

Le principe consiste, tout simplement, à numéroter les rubriques qui se correspondent avec le même numéro.

Voici par exemple une structure de site :

Français

  • 1000. Ma rubrique 1
    • 1010. Sous-rub 1
    • 1020. Sous-rub 2
  • 2000. Ma rubrique 2
  • 3000. Ma rubrique 3

English

  • 1000. My first section
    • 1010. First sub-sec
    • 1020. Second sub-sec
  • 2000. My second section

Deutsch

  • 1000. Meine erste Rubrik (six ans l’Allemand, quand même !)

Italiano

  • 2000. La secunda rubrica (0 année d’Italien)

Nous avons donc un site multilingue très classique : des grands secteurs par langue (français, anglais, allemand, italien). Chaque langue contient sa propre structure. Le principe consiste simplement à utiliser comme numérotations de titres de rubriques les mêmes numéros lorsqu’il s’agit des rubriques équivalentes. Pour que le système reste simple, nous adoptons une numérotation aussi logique que possible.

Notons qu’il n’est pas nécessaire d’avoir toutes les rubriques traduites dans toutes les langues.

Squelettes

La méthode permettant d’afficher, dans chaque rubrique, la liste des rubriques qui en sont la traduction est très simple :
— on extrait le numéro du titre de la rubrique ;
— on cherche toutes les rubriques dont le titre commence par le même numéro.

Grâce au nouveau moteur de SPIP 1.8, cela se réalise dans les squelettes en une seule commande, à l’intérieur même de la boucle de sélection.

Cependant, nous avons besoin d’un nouveau filtre, qui, à l’inverse de supprimer_numero (qui renvoie le titre sans le numéro), va renvoyer le numéro sans le titre. Appelons-le : extraire_numero.

Installons-le dans mes_fonctions :

  1. function extraire_numero ($titre) {
  2. if (ereg("([0-9]+)\.", $titre, $match)) {
  3. return $match[1];
  4. }
  5. else return $titre;
  6. }

Télécharger

Si l’on applique ce filtre au titre de la rubrique « 1010. Sous-rub 1 » :

le résultat sera : « 1010 ».

Dans notre squelette de rubrique, plaçons-nous à l’intérieur de la boucle principale :

La boucle principe affiche le titre de la rubrique en cours, la seule chose à vérifier étant que le titre est bien filtré par supprimer_numero.

Nous avons maintenant besoin de rechercher les rubriques dont le titre commence par le même numéro que la rubrique principale. Le critère est :

Le moteur de SPIP 1.8 permet ce genre de chose : à l’intérieur de nos critères, nous pouvons utiliser une pseudo-balise d’une boucle précédente, celle-ci étant même filtrée si nécessaire !

Si notre rubrique principale est la « 1010. Sous-rub1 », cela revient à demander les rubriques correspondant au critère :

Ce type de critère, avec un double symbole « égal », signifie une expression régulière. C’est-à-dire que, au lieu de l’égalité, on peut comprendre « qui contient la chaîne de caractères suivants ». La chaîne est :
— ^ : « qui commence par »
— 1010 : « les caractères 1010 ».

Nous cherchons donc ici toutes les rubriques dont le titre « commence par 1010 ». Nous obtenons :
— « 1010. Sous-rub 1 »
— « 1010. First sub-sec »

Pour exclure des résultats la rubrique principale, il suffit d’ajouter le critère {exclus}.

Ce qui donne par exemple :

Remarques

On peut encore jouer avec les numéros pour trouver les parents et les enfants d’un élément, même si dans SPIP de tels éléments n’ont pas, habituellement, de parents et d’enfants. Par exemple, on peut l’utiliser pour hiérarchiser des mots-clés.


— 1000. France
— 1100. Ile-de-France
— 1110. Hauts-de-Seine
— 1111. Issy-les-Moulineaux

Il est assez simple de trouver les « enfants » de « France » : le premier numéro est identique, le second est libre, les suivants sont zéro. Le « parent » de « Ile-de-France » suit la logique inverse : le premier chiffre est identique, et les suivants sont à zéro. Avec des fonctions très simples pour extraire les numéros, et des expressions régulières adaptées, ça n’est pas extrêmement compliqué à réaliser.

Il faut, enfin, rappeler qu’une telle astuce ne doit être utilisée que si elle respecte la structure originelle des éléments de SPIP. Ici, c’est le cas : il s’agit simplement de numéroter les rubriques, en respectant par ailleurs la hiérarchie des rubriques dans la base de données. Sinon, une méthode trop « bidouillesque » qui ne respecterait pas la structure habituelle de SPIP rendrait le site très complexe à maintenir.

  • Sylvain
    Mars 2006

    C’est pass bête ... l’astuce est vraiment bien trouvée :-)

    mais franchement :

    SPIP ne permet pas de définir des liens de traduction entre rubriques (seulement entre articles).

    effectivement, et c’est parfois domage ...

    La limitation n’est d’ailleurs pas liée à des choix techniques, mais d’ergonomie et de logique de construction des sites

    ah ... heu ...

    Or, certains sites ont une structure correspondant exactement à ce besoin

    y aurait pas quelque chose qui cloche là ?

    enfin, si ça corresponds au besoin de certain sites, que la limitation n’est pas liée à un choix technique (j’en déduis que ça ne doit ni casser l’architecture de SPIP, ni être hyper compliqué d’ajouter ça) ... pourquoi ne pas l’ajouter dans SPIP comme pour les articles ???

    personnelement j’ai jamais compris ça dans SPIP, j’ai fait jusque là fait 2 site multilingue, il se trouve que les 2 correspondent à cette demande / ce besoin !!!

  • ARNO*
    Mars 2006

    pourquoi ne pas l’ajouter dans SPIP comme pour les articles ???

    C’est un problème d’ergonomie. Imaginons que tu actives à la fois les liens entre rubriques (s’ils existaient) et les liens entre articles...

    - Est-ce qu’on doit autoriser, à ce moment-là, les liens entre articles de rubriques qui ne sont pas elles-même liées ?

    • On peut dire oui, parce que solution de facilité pour le développement :-)) mais aussi parce qu’après-tout, le webmestre peut vouloir créer un système de liens un peu complexe (ou souple).
    • On peut dire que non, parce que justement un site qui panacherait les deux aurait rapidement de gros problèmes structurels (navigations assez facilement incohérentes).

    - Si on dit que oui, alors on a très vite des sites complètement incohérents.

    - Si on dit que non, alors il faut mettre en place un système complet de contrôle de cohérence entre rubriques liées et articles liés. Il faut par exemple que SPIP interdise le déplacement d’un article lié à un autre article dans une autre rubrique que celle liée aux articles déjà liés... ; ou alors qu’il soit capable de déplacer les 2 articles simultanément dans deux rubriques de langues différentes, mais liées. En cas de liens sur plus de deux langues, ça devient coton au niveau rigidité.

    On peut prendre le problème dans l’autre sens : SPIP ne gère pas le multilinguisme au niveau des éléments eux-mêmes : on n’a pas une rubrique elle-même multilingue, et on n’a pas un article lui-même multilingue ; à la place, on a plusieurs articles dans différentes langues, reliés par un lien indiquant la traduction. Ca n’est pas du tout pareil, et ça introduit des difficultés de cohérence des sites. En même temps, ça autorise les sites multilingues, mais ayant des structures différentes dans chaque langue et, de plus, des choses pas forcément traduites.

    Le truc des rubriques liées concerne, essentiellement, des sites multilingues qui sont intégralement traduits. C’est un cas relativement rare. La plupart des sites multilingues sont traduits au fur et à mesure, voire n’ont pas vocation à être complètement traduits (chaque langue vit sa vie propre).

    Bon, par ailleurs, SPIP évolue rapidement, la 1.8 permet (sans trop l’annoncer) de modifier la structure de la base ; la 1.9 introduit une API de plugins qui permettra d’étendre la structure et l’interface de gestion, dans un premier temps en version de test ; je ne doute pas qu’une configuration plus souple des liens de traduction apparaîtra rapidement... Les choix faits jusqu’à présent, qui sont ceux d’une structure unique (livrée par défaut et quasiment impossible à modifier sans renoncer aux mises à jour de SPIP), qui avait l’avantage de livrer aux usagers, même novices, un site qui resterait cohérente en évitant les erreurs structurelles fatales, c’est justement ce que le nouveau moteur, introduit dans la 1.8, va permettre de dépasser.

  • Mars
    Mars 2008

    Je suis en train de travailler sur un site qui utilise ce que tu décris.
    J’ai pas eu de mal à le mettre ne place, j’en suis maintenant à mettre en page le sommaire et du coup j’ai pas de liens vers le sommaire dans un autre langue que celle prédéfinie.
    Est-ce qu’il existe un moyen d’appliquer la même chose pour renvoyer sur un sommaire.fr.html ; sommaire.en.html etc ...

  • Thomas
    Février 2009

    Bonjour, bravo pour cette astuce ! Est-elle compatible avec spip 2.0 ? Par ailleurs, je vous propose une contribution pour gérer les sous-menus lorsque les secteurs correspondent à des langues.

    http://www.spip-contrib.net/Balise-RUBRIQUE_PRINCIPALE

    Qu’en pensez-vous ? Salutations

  • Nico
    Avril 2010

    Si vous avez une erreur php de type : Deprecated : Function ereg() is deprecated ...

    La fonction ereg() n’est pas compatible avec PHP 5.3.0

    Il faut alors modifier la fonction du filtre extraire_numero dans le fichier mes_fonctions.php comme suit :

    function extraire_numero ($titre) {
           if (preg_match('/^([0-9]+)\./', $titre, $match)) {
                   return $match[1];
           }
           else return $titre;
    }

    Merci pour cette technique qui fonctionne très bien.

Qui êtes-vous ?
Votre message

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