SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 236 visiteurs en ce moment

Accueil > Multilinguisme > Navigation multilingue > Balise #RUBRIQUE_PRINCIPALE

Balise #RUBRIQUE_PRINCIPALE

Ou comment assimiler des rubriques de niveaux 1 à des secteurs

14 janvier 2009 – par Thomas Weiss – commentaires

5 votes

Pour certains sites, il arrive que les rubriques de niveau 0 soient des langues (rubriques FRANÇAIS, ANGLAIS, CHINOIS ETC.). Dans ce cas, il est impossible d’utiliser le critère racine dans les boucles pour afficher des sous-menus cohérents.

Prérequis : notions de PHP/MYSQL

Dans un site SPIP, quand les secteurs servent comme entrées pour les langues (rubriques français, anglais, chinois, etc), le critère racine n’est pas utilisable dans la BOUCLE RUBRIQUES pour afficher des menus cohérents. La balise #RUBRIQUEPRINCIPALE permet d’assimiler les rubriques de niveau 1 à des secteurs et donc d’afficher les menus désirés.

Exemple :

Niveau 0 : FRANÇAIS

Niveau 1 : DÉCOUVRIR ; S’ORIENTER ; PARTICIPER ;

Dans cet exemple (voir en ligne http://forum-china-europa.net/spip.php?article1 ), une boucle avec le critère racine afficherait toutes les rubriques de niveau 1 avec leurs sousrubriques, ce qui n’est pas souhaitable. #RUBRIQUEPRINCIPALE permet d’afficher uniquement les sous-rubriques des rubriques de niveau1.

La syntaxe de base utilisée pour la boucle servant à générer les différents sous menus est la suivante :

<BOUCLE_rubriques(RUBRIQUES) {id_rubrique=#RUBRIQUEPRINCIPALE}{lang} {par titre}>
     <BOUCLE_sous_rubriques(RUBRIQUES){id_parent} {par num titre}>

<a href="liensouhaité">#TITRE</a> ou tout autre balise
     </BOUCLE_sous_rubriques>
</BOUCLE_rubriques>

           

Le code de la balise (à insérer dans le fichier mes_fonctions.php situé dans le répertoire squelettes ) est le suivant :

Function balise_RUBRIQUEPRINCIPALE($p){
$_id_rubrique = interprete_argument_balise(1,$p);
        if (!$_id_rubrique)
                $_id_rubrique = champ_sql('id_rubrique',$p);
        $p->code = "fce_getRubriquePrincipale($_id_rubrique)" ;
        $p->interdire_scripts = false;
        return $p;
}

function fce_getRubriquePrincipale($idrubrique) {
$requete = "SELECT id_parent, id_secteur FROM nomdevotretable_rubriques WHERE id_rubrique = $idrubrique";
$query = mysql_query($requete);
$row = mysql_fetch_row($query);
$idparent = $row[0];
$idsecteur = $row[1];
if ($idparent == $idsecteur) return $idrubrique;
return fce_getRubriquePrincipale($idparent, $idsecteur);
}

Voir en ligne : Site du forum China-Europa

P.-S.

Code testé sur spip 1.9.2 et spip 2.0

Dernière modification de cette page le 31 mars 2009

Retour en haut de la page

Vos commentaires

  • Le 31 mars 2009 à 14:17, par arthegone En réponse à : Balise #RUBRIQUE_PRINCIPALE

    OK j’avais bien noté :)

    Je me suis mal exprimé.

    Moi aussi spip_rubriques est le nom de ma table (prefixe par defaut « spip_ »).

    Pour le moment je ne vois pas ce qui merde...

    Faut que je trouve ce qui me génère cette erreur.

    Merci encore Thomas ;)

    PS :
    Est il possible que tu m’envoie ton mes_fonction.php ?

    • Le 27 septembre 2009 à 20:59, par Jérémie En réponse à : Balise #RUBRIQUE_PRINCIPALE f

      Arthegone,

      Pour que celà fonctionne, il faut que la boucle contenant #RUBRIQUEPRINCIPALE soit incluse dans une boucle mère. Alors ça marchera ;)

      Jérémie.

    Répondre à ce message

  • Le 26 septembre 2009 à 21:40, par Jérémie En réponse à : Balise #RUBRIQUE_PRINCIPALE

    Bonjour !

    Merci pour cette contribution !! Très interessante.

    Existe-t-il quelque chose de similaire pour les brèves ?

    Comment faire dans un cas de multilinguisme avec des rubrique racine par langue pour insérer des brèves associée, aux rubriques principale, justement ....

    Si quelqu’un a une idée...

    Répondre à ce message

  • Le 30 mars 2009 à 12:15, par arthegone En réponse à : Balise #RUBRIQUE_PRINCIPALE

    Salut Thomas,

    Suite à l’utilisation de ton PREMIER code, pour commencer, j’ai une erreur sur mes_fonctions.php

    message :

    Warning : mysql_fetch_row() : supplied argument is not a valid MySQL result resource in F :\PortableApps\EasyPHP 2.0b1\www\spipjuin2008\mes_fonctions.php on line 13

    Mon fichier mes_fonctions.php

    <?php
    function balise_RUBRIQUEPRINCIPALE($p){
    $_id_rubrique = interprete_argument_balise(1,$p);
           if (!$_id_rubrique)
                   $_id_rubrique = champ_sql('id_rubrique',$p);
           $p->code = "fce_getRubriquePrincipale($_id_rubrique)" ;
           $p->interdire_scripts = false;
           return $p;
    }
    function fce_getRubriquePrincipale($idrubrique) {
    $requete = "SELECT id_parent, id_secteur FROM spip_rubriques WHERE id_rubrique = $idrubrique";
    $query = mysql_query($requete);
    $row = mysql_fetch_row($query);
    $idparent = $row[0];
    $idsecteur = $row[1];
    if ($idparent == $idsecteur) return $idrubrique;
    return fce_getRubriquePrincipale($idparent, $idsecteur);
    }
    ?>

    il n’y a rien d’autre que ton script.

    Je ne comprend pas l’erreur en fait.

    La balise #INSERT_HEAD est presente dans ma page (sommaire.html)

    Et j’ai ton code de base pour le bouclage.

    Bizarre...

    • Le 30 mars 2009 à 14:56, par Thomas Weiss En réponse à : Balise #RUBRIQUE_PRINCIPALE

      As-tu au préalable modifié le code en fonction du nom de ta table ?

      Je m’explique : dans le code suivant tu dois remplacer spip_rubriques par le nom de ta table Mysql.

      $requete = "SELECT id_parent, id_secteur FROM spip_rubriques WHERE id_rubrique = $idrubrique";
    • Le 31 mars 2009 à 00:27, par arthegone En réponse à : Balise #RUBRIQUE_PRINCIPALE

      As-tu au préalable modifié le code en fonction du nom de ta table ?

      Je m’explique : dans le code suivant tu dois remplacer spip_rubriques par le nom de ta table Mysql.
      $requete = « SELECT id_parent, id_secteur FROM spip_rubriques WHERE id_rubrique = $idrubrique » ;

      Thomas, je ne comprends pas pourquoi je dois changer ma table spip_rubriques. Il me semble que c’est elle qui gere justement les rubriques.

      Par contre (je ne suis pas un pro de SQL) mais jamais on ne met le nom de la base SQL c’est normal ?

      sinon je ne vois pas pourquoi cela merde aussi bien en local que sur le web.

      Tu as quelle version de spip exactement ?

    • Le 31 mars 2009 à 11:48, par Thomas En réponse à : Balise #RUBRIQUE_PRINCIPALE

      Spip_rubriques est le nom de MA table. Il faut bien sur adapter le code en fonction de ta configuration.

    Répondre à ce message

  • Le 27 mars 2009 à 10:48, par arthegone En réponse à : Balise #RUBRIQUE_PRINCIPALE

    Bonjour Thomas, contribution très interessante.

    En ce qui me concerne (ne maitrisant pas trop le php) mes secteurs serait plutot de niveau 3.

    Quelle est la valeur à changer dans mes_fonctions.php ?

    • Le 27 mars 2009 à 13:29, par Thomas Weiss En réponse à : Balise #RUBRIQUE_PRINCIPALE

      Bonjour, ce code ne fonctionne que pour des rubriques de niveau 1 (dont le parent est id_secteur). En effet, le principe de la boucle est d’effectuer une récursivité jusqu’à ce que id_parent soit égal à id_secteur. Maintenant si tu veux récuperer les id des rubriques de niveau 3 je te propose le code suivant un peu différent :

      function fce_getRubriquePrincipale($idrubrique) {
      $requete = "SELECT id_parent, id_secteur FROM spip_rubriques WHERE id_rubrique = $idrubrique";
      $query = mysql_query($requete);
      $row = mysql_fetch_row($query);
      $idparent = $row[0];
      $idsecteur = $row[1];
      if ($idparent == $idsecteur) {
      $requete2 = "SELECT id_rubrique FROM spip_rubriques WHERE id_parent = $idrubrique";
      $query2 = mysql_query($requete2);
      $row2 = mysql_fetch_row($query2);
      $idniveau2 = $row2[0];

      $requete3 = "SELECT id_rubrique FROM spip_rubriques WHERE id_parent = $idniveau2";
      $query3 = mysql_query($requete3);
      $row3 = mysql_fetch_row($query3);
      $idniveau3 = $row3[0];

      return $idniveau3;

      }
      return fce_getRubriquePrincipale($idparent);
      }

    Répondre à ce message

Répondre à cet article

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • ScolaSPIP 4

    19 janvier 2016 – 164 commentaires

    ScolaSPIP est plugin-squelette responsive personnalisable pour sites Web d’établissements scolaires basé sur SPIPr Présentation de ScolaSPIP Ce plugin pour SPIP 3 est développé par la Dane de l’académie de Versailles pour les webmestres de cette (...)

  • Vérifier ses plugins avant un changement de version de SPIP

    28 mars – commentaire

    Lister la compatibilité des plugins avec une autre version de SPIP Ce plugin est le successeur du plugin Vérifier ses plugins pour le passage à SPIP 3.1. Il permet de vérifier si ces plugins sont compatibles avec des versions plus récentes de (...)

  • bigfoot

    16 juin 2015 – 58 commentaires

    Un plugin qui facilite l’utilisation des notes de bas de page en les affichant dans des infobulles à l’aide d’un peu de javascript. Le constat de l’auteur du script : Les notes de bas de page sur le web sont une plaie. Tu dois d’abord essayer de (...)

  • Mailshot

    16 janvier 2013 – 254 commentaires

    Ce plugin prend en charge l’envoi en nombre d’info-lettres par email. Mailshot permet l’envoi en nombre d’emails au moyen d’un SMTP (ou d’un service externe) dédié à cet effet. Il permet de limiter la cadence d’envoi. Enfin, ce plugin implémente la (...)

  • SkelEditor 2.0

    1er mars 2010 – 74 commentaires

    La version remaniée et enrichie du plugin, pour SPIP 2.1, qui vous permet d’éditer votre squelette directement en ligne sans passer dans le FTP Ce plugin vous permet d’éditer les fichiers du squelette courant depuis l’interface privé. Cela peut (...)