Changeset 89394 in spip-zone


Ignore:
Timestamp:
May 17, 2015, 3:54:48 PM (4 years ago)
Author:
p@…
Message:

Code fonctionnel avec la récurcivité !

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/courtjus/trunk/courtjus_fonctions.php

    r89392 r89394  
    1313
    1414function balise_URL_RUBRIQUE_dist($p) {
    15         $id_rubrique = interprete_argument_balise(1,$p);
    16         if (!$id_rubrique) $id_rubrique = champ_sql('id_rubrique', $p);
     15    $id_rubrique = interprete_argument_balise(1,$p);
     16    if (!$id_rubrique) $id_rubrique = champ_sql('id_rubrique', $p);
    1717
    18         $code = "court_jus_calculer_rubrique ($id_rubrique)";
    19         $p->code = $code;
    20         $p->interdire_scripts = false;
    21         return $p;
     18    $code = "court_jus_calculer_rubrique($id_rubrique)";
     19    $p->code = $code;
     20    $p->interdire_scripts = false;
     21    return $p;
    2222}
    2323
    2424function court_jus_calculer_rubrique($id_rubrique) {
    25     court_jus_trouver_objet($id_rubrique);
     25
     26    // On récupère l'éventuel objet de redirection
     27    $objet = court_jus_trouver_objet($id_rubrique);
     28    if ($objet)
     29        return $objet;
     30    // Sinon, on cherche les enfant de la rubrique et on cherche un objet dedans
     31    else {
     32        $objet = court_jus_trouver_objet_enfant($id_rubrique);
     33        return $objet;
     34    }
     35
     36    return generer_url_entite($id_rubrique, 'rubrique');
    2637}
     38
     39function court_jus_trouver_objet_enfant($id_rubrique) {
     40
     41    $enfants = courtjus_quete_enfant($id_rubrique);
     42
     43    // On cherche un éventuel objet dans les premiers enfants
     44    while (list($key,$enfant) = each($enfants) and !$objet) {
     45        $objet = court_jus_trouver_objet($enfant);
     46        if (!$objet) {
     47            $objet = court_jus_trouver_objet_enfant($enfant);
     48        }
     49    }
     50
     51    return $objet;
     52}
     53
    2754
    2855function court_jus_trouver_objet_rubrique() {
     
    3663        // On exclue la table des rubriques de SPIP
    3764        if (array_key_exists('id_rubrique', $data['field']) and $table != table_objet_sql('rubrique')) {
    38             $objet_in_rubrique[] = $table;
     65            // On garde le titre dans le tableau afin de pouvoir faire un classement par num titre.
     66            $objet_in_rubrique[] = array($table, $data['titre']);
    3967        }
    4068    }
     
    5078    $objets_in_rubrique = array();
    5179    foreach ($tables as $table) {
     80        // Simplification des variables. On a besoin du titre pour trouver le num titre
     81        list($table, $titre) = $table;
    5282        $objet = table_objet($table);
    5383        $champs_id = id_table_objet($table);
    54         $objets_rubrique = sql_allfetsel($champs_id, $table, 'id_rubrique='.intval($id_rubrique));
    55         foreach ($objets_rubrique as $objet_rubrique)
    56             $objets_in_rubrique[] = array('id_objet' => $objet_rubrique[$champs_id], 'objet' => $objet);
     84        $champs = array(
     85            $champs_id,
     86            $titre
     87        );
     88
     89        $where = array(
     90            'id_rubrique='.intval($id_rubrique),
     91            'statut='.sql_quote('publie')
     92        );
     93        $objets_rubrique = sql_allfetsel($champs, $table, $where);
     94
     95        foreach ($objets_rubrique as $objet_rubrique) {
     96            // Match va contenir le résulat de la recherche de num titre dans le titre
     97            $match = null;
     98            // On cherche le num titre dans le titre de l'objet
     99            preg_match('#^[0-9]*\.#', $objet_rubrique['titre'], $match);
     100            // On créer le tableau contenant les données de l'objet
     101            $objets_in_rubrique[] = array(
     102                'id_objet' => $objet_rubrique[$champs_id],
     103                'objet' => $objet,
     104                // Gros Hack, on utilise intval pour avoir une valeur numérique utilisable
     105                // Comme le . final est considéré comme une virgule, on fini avec une valeur entière.
     106                'num_titre' => intval($match[0])
     107            );
     108        }
    57109    }
    58110
     
    62114    // Si on est à 0 objet, on descend dans une sous rubrique
    63115    if ($nb_objet <= 0) {
    64         // Je sais pas encore comment par contre
     116        // On renvoie false pour déclencher éventuellement la recherche dans une sous rubrique
     117        return false;
    65118    }
    66119    // Un seul objet dans la rubrique, on renvoie le tableau
    67     elseif ($nb_objet = 1) {
     120    elseif ($nb_objet == 1) {
    68121        return generer_url_entite($objets_in_rubrique[0]['id_objet'], $objets_in_rubrique[0]['objet']);
    69122    }
     123    // S'il y plusieurs objets dans la rubrique et que le mode "par num titre" est activé, on regiride sur le num titre le plus petit.
     124    elseif ($nb_objet > 1) {
     125        // On va aller chercher array_column
     126        include_spip('array_column/src/array_column');
     127        // On créer un tableau avec uniquement les num titre
     128        $minmax = array_column($objets_in_rubrique, 'num_titre');
    70129
    71     // S'il y plusieurs objets dans la rubrique et que le mode "par num titre" est activé, on regiride sur le num titre le plus petit.
     130        // On recherche l'index dans le tableau minmax
     131        $index = array_search(min($minmax), $minmax);
     132
     133        // Créer l'URL de redirection
     134        return generer_url_entite($objets_in_rubrique[$index]['id_objet'], $objets_in_rubrique[$index]['objet']);
     135    }
    72136
    73137    // Sinon, si le mot "plus récent"" est activé on redirige sur l'article le plus récente.
     
    75139}
    76140
    77 court_jus_calculer_rubrique(22);
     141function courtjus_quete_enfant($id_rubrique) {
     142    // On récupère tous les enfants direct.
     143    $enfants = sql_allfetsel('id_rubrique', table_objet_sql('rubrique'), 'id_parent='.intval($id_rubrique));
     144
     145    // On simplifie le tableau pour n'avoir que des id
     146    include_spip('array_column/src/array_column');
     147    $enfants = array_column($enfants, 'id_rubrique');
     148
     149    return $enfants;
     150}
Note: See TracChangeset for help on using the changeset viewer.