Changeset 72965 in spip-zone for _plugins_/fil_ariane


Ignore:
Timestamp:
May 23, 2013, 4:14:04 PM (8 years ago)
Author:
cyril@…
Message:

on peut créer des fils plus courts en configurant la variable globale (_FIL_ARIANE_COURT); on passe en version 1.1.12;

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fil_ariane/trunk/fil_ariane_fonctions.php

    r70393 r72965  
    1313#defined('_FIL_ARIANE_ACCUEIL') || define('_FIL_ARIANE_ACCUEIL',true);
    1414
     15// Si cette constante est vraie le fil d'Ariane est plus court et se termine sur le parent
     16if (!defined('_FIL_ARIANE_COURT')) define('_FIL_ARIANE_COURT', false);
     17
    1518// Si cette constante est vraie le fil d'Ariane se termine par un lien
    1619if (!defined('_FIL_ARIANE_LIEN')) define('_FIL_ARIANE_LIEN', false);
     
    2730 * et construit un fil d'Ariane.
    2831 */
    29 function balise_FIL_ARIANE_dist($p) {
    30 
    31         // il est possible qu'il y ait un tableau des valeurs souhaitées pour  le fil d'Ariane
    32         // il s'agit dans ce cas du 1er paramètre passé avec la balise "fil_ariane"
    33         if ($fil = interprete_argument_balise(1, $p)) {
    34                 // si un id_objet est passé à la balise
    35                 if ($id_objet = interprete_argument_balise(2, $p)) {
    36                         $p->code = "calcule_hierarchie_objet($fil, $id_objet)";
    37                         return $p;
    38                 }
    39         }
    40 
    41         if (!$fil) {
    42                 // On appele la fonction qui construit le fil d'Ariane
    43                 // en prenant en compte seulement l'id de l'objet
    44                 $_id_objet = $p->boucles[$p->id_boucle]->primary;
    45 
    46                 // Code php mis en cache, et qui sera exécuté et qui est sensé ramener la valeur du champ
    47                 $id_objet = champ_sql($_id_objet, $p);
    48 
    49                 // L'objet issu du nom de la table
    50                 $objet = $p->boucles[$p->id_boucle]->id_table;
    51 
    52                 $p->code = "calcule_hierarchie_objet('$objet', $id_objet)";
    53         } else {
    54                 // On décortique le tableau $fil et on appelle la fonction qui construit le fil
    55                 // avec les valeurs du tableau
    56                 $p->code = "construire_FIL_ARIANE($fil)";
    57 
    58         }
    59 
    60         return $p;
     32function balise_FIL_ARIANE_dist($p)
     33{
     34
     35    // il est possible qu'il y ait un tableau des valeurs souhaitées pour  le fil d'Ariane
     36    // il s'agit dans ce cas du 1er paramètre passé avec la balise "fil_ariane"
     37    if ($fil = interprete_argument_balise(1, $p)) {
     38        // si un id_objet est passé à la balise
     39        if ($id_objet = interprete_argument_balise(2, $p)) {
     40            $p->code = "calcule_hierarchie_objet($fil, $id_objet)";
     41            return $p;
     42        }
     43    }
     44
     45    if (!$fil) {
     46        // On appele la fonction qui construit le fil d'Ariane
     47        // en prenant en compte seulement l'id de l'objet
     48        $_id_objet = $p->boucles[$p->id_boucle]->primary;
     49
     50        // Code php mis en cache, et qui sera exécuté et qui est sensé ramener la valeur du champ
     51        $id_objet = champ_sql($_id_objet, $p);
     52
     53        // L'objet issu du nom de la table
     54        $objet = $p->boucles[$p->id_boucle]->id_table;
     55
     56        $p->code = "calcule_hierarchie_objet('$objet', $id_objet)";
     57    } else {
     58        // On décortique le tableau $fil et on appelle la fonction qui construit le fil
     59        // avec les valeurs du tableau
     60        $p->code = "construire_FIL_ARIANE($fil)";
     61
     62    }
     63
     64    return $p;
    6165}
    6266
     
    6670 * Calcule la hierarchie d'un objet et la retourne sous forme d'un tableau
    6771 */
    68 function calcule_hierarchie_objet($objet, $id_objet) {
    69 
    70         $objet = objet_type($objet); // pour obtenir le type d'objet au singulier
    71 
    72         if ($f = charger_fonction($objet, 'fil_ariane', true)) {
    73                 $fil = $f($id_objet);
    74                 return construire_FIL_ARIANE($fil);
    75         }
    76 
    77         $fil_ariane_objet = charger_fonction('objet', 'fil_ariane');
    78         $fil = $fil_ariane_objet($objet, $id_objet);
    79         return construire_FIL_ARIANE($fil);
     72function calcule_hierarchie_objet($objet, $id_objet)
     73{
     74
     75    $objet = objet_type($objet); // pour obtenir le type d'objet au singulier
     76
     77    if ($f = charger_fonction($objet, 'fil_ariane', true)) {
     78        $fil = $f($id_objet);
     79        return construire_FIL_ARIANE($fil);
     80    }
     81
     82    $fil_ariane_objet = charger_fonction('objet', 'fil_ariane');
     83    $fil              = $fil_ariane_objet($objet, $id_objet);
     84    return construire_FIL_ARIANE($fil);
    8085
    8186}
     
    8489 * Construit le fil d'Ariane
    8590 */
    86 function construire_FIL_ARIANE($fil) {
    87 
    88         $fil_ariane = '<div class="' . _FIL_ARIANE_STYLE . '">';
    89 
    90         if (!is_array($fil)) {
    91                 return '';
    92         }
    93 
    94         // si on doit tracer le 1er élément, on l'ajoute au début du tableau
    95         if (_FIL_ARIANE_ACCUEIL)
    96                 $fil = array(_T('public:accueil_site') => $GLOBALS['meta']['adresse_site']) + $fil;
    97 
    98 
    99         $nb = count($fil);
    100         $passe = 0;
    101 
    102         foreach ($fil as $titre => $lien) {
    103 
    104                 // si on a déja tracé un élément, mais qu'on est pas encore arrivé au dernier
    105                 if ($passe > 0)
    106                         $fil_ariane .= "<span class=\"sep divider\">" . _FIL_ARIANE_SEP . "</span>";
    107 
    108                 // tant qu'on est pas encore arrivé au dernier élément
    109                 if ($passe < $nb - 1)
    110                         $fil_ariane .= "<a href='$lien'>$titre</a>";
    111 
    112                 // si on arrive au dernier
    113                 elseif ($passe >= $nb - 1) {
    114                         if (_FIL_ARIANE_LIEN)
    115                                 $fil_ariane .= "<a class='on' href='$lien'>$titre</a>";
    116                         else
    117                                 $fil_ariane .= "<span class='on'>$titre</span>";
    118                 }
    119 
    120                 $passe++;
    121         }
    122 
    123         $fil_ariane .= '</div>';
    124         return $fil_ariane;
     91function construire_FIL_ARIANE($fil)
     92{
     93
     94    $fil_ariane = '<div class="' . _FIL_ARIANE_STYLE . '">';
     95
     96    if (!is_array($fil)) {
     97        return '';
     98    }
     99
     100    // si on doit tracer le 1er élément, on l'ajoute au début du tableau
     101    if (_FIL_ARIANE_ACCUEIL)
     102        $fil = array(_T('public:accueil_site') => $GLOBALS['meta']['adresse_site']) + $fil;
     103
     104    // si le fil d'Ariane est court, on retire le dernier élément
     105    if (_FIL_ARIANE_COURT)
     106        array_pop($fil);
     107
     108    $nb    = count($fil);
     109    $passe = 0;
     110
     111    foreach ($fil as $titre => $lien) {
     112
     113        // si on a déja tracé un élément, mais qu'on est pas encore arrivé au dernier
     114        if ($passe > 0)
     115            $fil_ariane .= "<span class=\"sep divider\">" . _FIL_ARIANE_SEP . "</span>";
     116
     117        // tant qu'on est pas encore arrivé au dernier élément
     118        if ($passe < $nb - 1)
     119            $fil_ariane .= "<a href='$lien'>$titre</a>";
     120
     121        // si on arrive au dernier
     122        elseif ($passe >= $nb - 1) {
     123            if (_FIL_ARIANE_COURT) { // si court, lien off dans tous les cas
     124                $fil_ariane .= "<a href='$lien'>$titre</a>";
     125            } else { // sinon, lien ou pas selon conf
     126                if (_FIL_ARIANE_LIEN)
     127                    $fil_ariane .= "<a class='on' href='$lien'>$titre</a>";
     128                else
     129                    $fil_ariane .= "<span class='on'>$titre</span>";
     130            }
     131        }
     132
     133        $passe++;
     134    }
     135
     136    $fil_ariane .= '</div>';
     137    return $fil_ariane;
    125138}
    126139
     
    131144 *    couples titre => url
    132145 */
    133 function fil_ariane_objet_dist($objet, $id_objet) {
    134 
    135         $url = generer_url_entite($id_objet, $objet);
    136         $titre = generer_info_entite($id_objet, $objet, 'titre');
    137 
    138         $fil = array();
    139         $fil[$titre] = $url;
    140         return $fil;
    141 }
    142 
    143 function fil_ariane_organisation_dist($id_organisation) {
    144         return fil_ariane_hierarchie_objet('organisation', $id_organisation, 'nom', 'id_parent');
    145 }
    146 
    147 function fil_ariane_rubrique_dist($id_rubrique) {
    148         return fil_ariane_hierarchie_objet('rubrique', $id_rubrique, 'titre', 'id_parent');
    149 }
    150 
    151 function fil_ariane_article_dist($id_article) {
    152         // récupere l'id de la rubrique parent, le titre de l'article
    153         $item = sql_fetsel('id_rubrique, titre', 'spip_articles', "id_article = " . sql_quote($id_article));
    154 
    155         // récupère la hierarchie de la rubrique parent seulement si id_rubrique non nul (cas des pages uniques);
    156         $fil = array();
    157         if ($item['id_rubrique'] > 0) {
    158                 $fil_ariane_rubrique = charger_fonction('rubrique', 'fil_ariane');
    159                 $fil = $fil_ariane_rubrique($item['id_rubrique']);
    160         }
    161 
    162         // ajoute le titre et l'url de l'article
    163         $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_article, 'article');
    164 
    165         return $fil;
    166 }
    167 
    168 function fil_ariane_produit_dist($id_produit) {
    169         // récupère l'id de la rubrique parent ainsi que le titre du produit
    170         $item = sql_fetsel('id_rubrique, titre', 'spip_produits', "id_produit = " . sql_quote($id_produit));
    171 
    172         // récupère la hierarchie de la rubrique du produit
    173         $fil_ariane_rubrique = charger_fonction('rubrique', 'fil_ariane');
    174         $fil = $fil_ariane_rubrique($item['id_rubrique']);
    175 
    176         // ajoute le titre et l'url du produit
    177         $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_produit, 'produit');
    178 
    179         return $fil;
    180 }
    181 
    182 function fil_ariane_mot_dist($id_mot) {
    183         // récupère l'id du groupe, le titre du mot
    184         $item = sql_fetsel('id_groupe, titre', 'spip_mots', "id_mot = " . sql_quote($id_mot));
    185 
    186         // récupère la hierarchie du parent (si le plugin groupes de mots arborescents)
    187         # $fil = fil_ariane_hierarchie_objet('groupe' , $item['id_groupe'], 'titre', 'id_parent');
    188 
    189         // récupère le nom du groupe
    190         $groupe = sql_getfetsel('titre', 'spip_groupes_mots', "id_groupe = " . sql_quote($item['id_groupe']));
    191 
    192         // ajoute le titre et l'url du groupe
    193         $fil[typo(supprimer_numero($groupe))] = generer_url_entite($item['id_groupe'], 'groupe');
    194 
    195         // ajoute le titre et l'url du mot
    196         $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_mot, 'mot');
    197 
    198         return $fil;
    199 }
    200 
    201 
    202 function fil_ariane_hierarchie_objet($objet, $id_objet, $col_titre, $col_parent) {
    203         $fil = array();
    204 
    205         // trouver le nom du champ contenant la clé primaire de l'objet
    206         $col_id = id_table_objet($objet);
    207 
    208         // trouver le nom de la table contenant l'objet
    209         $table = table_objet_sql($objet);
    210 
    211         // trouver le titre et l'id du parent de l'objet en cours; on calcule son url;
    212         $item = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = " . sql_quote($id_objet));
    213 
    214         $titre = typo(supprimer_numero($item['titre']));
    215         $id_parent = $item['id_parent'];
    216         $url = generer_url_entite($id_objet, $objet);
    217 
    218         // tant qu'il y a des parents, je place nom => url dans le tableau
    219         while ($id_parent) {
    220                 // on trouve le parent, son titre; on calcule son url
    221                 $parent = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = " . sql_quote($id_parent));
    222 
    223                 $nom_parent = typo(supprimer_numero($parent['titre']));
    224                 $url_parent = generer_url_entite($id_parent, $objet);
    225 
    226                 $fil[$nom_parent] = $url_parent;
    227                 $id_parent = $parent['id_parent'];
    228         }
    229 
    230         // on inverse le tableau
    231         $fil = array_reverse($fil, true);
    232 
    233         $fil[$titre] = $url;
    234 
    235         return $fil;
    236 
    237 }
     146function fil_ariane_objet_dist($objet, $id_objet)
     147{
     148
     149    $url   = generer_url_entite($id_objet, $objet);
     150    $titre = generer_info_entite($id_objet, $objet, 'titre');
     151
     152    $fil         = array();
     153    $fil[$titre] = $url;
     154    return $fil;
     155}
     156
     157function fil_ariane_organisation_dist($id_organisation)
     158{
     159    return fil_ariane_hierarchie_objet('organisation', $id_organisation, 'nom', 'id_parent');
     160}
     161
     162function fil_ariane_rubrique_dist($id_rubrique)
     163{
     164    return fil_ariane_hierarchie_objet('rubrique', $id_rubrique, 'titre', 'id_parent');
     165}
     166
     167function fil_ariane_article_dist($id_article)
     168{
     169    // récupere l'id de la rubrique parent, le titre de l'article
     170    $item = sql_fetsel('id_rubrique, titre', 'spip_articles', "id_article = " . sql_quote($id_article));
     171
     172    // récupère la hierarchie de la rubrique parent seulement si id_rubrique non nul (cas des pages uniques);
     173    $fil = array();
     174    if ($item['id_rubrique'] > 0) {
     175        $fil_ariane_rubrique = charger_fonction('rubrique', 'fil_ariane');
     176        $fil                 = $fil_ariane_rubrique($item['id_rubrique']);
     177    }
     178
     179    // ajoute le titre et l'url de l'article
     180    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_article, 'article');
     181
     182    return $fil;
     183}
     184
     185function fil_ariane_produit_dist($id_produit)
     186{
     187    // récupère l'id de la rubrique parent ainsi que le titre du produit
     188    $item = sql_fetsel('id_rubrique, titre', 'spip_produits', "id_produit = " . sql_quote($id_produit));
     189
     190    // récupère la hierarchie de la rubrique du produit
     191    $fil_ariane_rubrique = charger_fonction('rubrique', 'fil_ariane');
     192    $fil                 = $fil_ariane_rubrique($item['id_rubrique']);
     193
     194    // ajoute le titre et l'url du produit
     195    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_produit, 'produit');
     196
     197    return $fil;
     198}
     199
     200function fil_ariane_mot_dist($id_mot)
     201{
     202    // récupère l'id du groupe, le titre du mot
     203    $item = sql_fetsel('id_groupe, titre', 'spip_mots', "id_mot = " . sql_quote($id_mot));
     204
     205    // récupère la hierarchie du parent (si le plugin groupes de mots arborescents)
     206    # $fil = fil_ariane_hierarchie_objet('groupe' , $item['id_groupe'], 'titre', 'id_parent');
     207
     208    // récupère le nom du groupe
     209    $groupe = sql_getfetsel('titre', 'spip_groupes_mots', "id_groupe = " . sql_quote($item['id_groupe']));
     210
     211    // ajoute le titre et l'url du groupe
     212    $fil[typo(supprimer_numero($groupe))] = generer_url_entite($item['id_groupe'], 'groupe');
     213
     214    // ajoute le titre et l'url du mot
     215    $fil[typo(supprimer_numero($item['titre']))] = generer_url_entite($id_mot, 'mot');
     216
     217    return $fil;
     218}
     219
     220
     221function fil_ariane_hierarchie_objet($objet, $id_objet, $col_titre, $col_parent)
     222{
     223    $fil = array();
     224
     225    // trouver le nom du champ contenant la clé primaire de l'objet
     226    $col_id = id_table_objet($objet);
     227
     228    // trouver le nom de la table contenant l'objet
     229    $table = table_objet_sql($objet);
     230
     231    // trouver le titre et l'id du parent de l'objet en cours; on calcule son url;
     232    $item = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = " . sql_quote($id_objet));
     233
     234    $titre     = typo(supprimer_numero($item['titre']));
     235    $id_parent = $item['id_parent'];
     236    $url       = generer_url_entite($id_objet, $objet);
     237
     238    // tant qu'il y a des parents, je place nom => url dans le tableau
     239    while ($id_parent) {
     240        // on trouve le parent, son titre; on calcule son url
     241        $parent = sql_fetsel("$col_titre AS titre , $col_parent AS id_parent", $table, "$col_id = " . sql_quote($id_parent));
     242
     243        $nom_parent = typo(supprimer_numero($parent['titre']));
     244        $url_parent = generer_url_entite($id_parent, $objet);
     245
     246        $fil[$nom_parent] = $url_parent;
     247        $id_parent        = $parent['id_parent'];
     248    }
     249
     250    // on inverse le tableau
     251    $fil = array_reverse($fil, true);
     252
     253    $fil[$titre] = $url;
     254
     255    return $fil;
     256
     257}
Note: See TracChangeset for help on using the changeset viewer.