Changeset 106482 in spip-zone


Ignore:
Timestamp:
Oct 1, 2017, 8:42:52 PM (3 years ago)
Author:
peetdu@…
Message:

Test sur l’idée présenté dans https://core.spip.net/issues/3844 : definir la relation a l‘objet parent dans la declaration de l‘objet.
Ça marche maintenant sur les articles et les mots-clés

Location:
_plugins_/rang/trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rang/trunk/action/trier_items.php

    r106315 r106482  
    3535        $page           = _request('debut_liste');
    3636        $objet          = _request('objet');
    37         $id_rubrique = _request('id_rubrique');
     37        $id_parent      = _request('id_parent');
    3838
    39 
    40         $table = table_objet_sql($objet);
    41         $id_objet = id_table_objet($objet);
     39        $table          = table_objet_sql($objet);
     40        $definition_table = lister_tables_objets_sql($table);
     41        $id_objet_parent = $definition_table['parent']['champ'];
     42        $id_objet       = id_table_objet($objet);
     43       
    4244
    4345        // reclassement !
    4446        foreach ($tab as $key => $value) {
    45                 $rang   = $page + $key + 1; //le classement commence à 1, pas à 0
     47                $rang   = $page + $key + 1; // le classement commence à 1, pas à 0
    4648                $id             = intval(substr($value, 3));
    47                 if ($id_rubrique == 'rien') {
     49                if ($id_parent == 'rien') {
    4850                        $where = "$id_objet=$id";
    4951                }
    5052                else {
    51                         $where = "$id_objet=$id AND id_rubrique=$id_rubrique";
     53                        $where = "$id_objet=$id AND $id_objet_parent=$id_parent";
    5254                }
    5355                sql_updateq($table, array('rang' => $rang), $where);
  • _plugins_/rang/trunk/inc/rang_api.php

    r106315 r106482  
    161161}
    162162
     163
     164/**
     165 * construction des chemins de sources vers les listes des objets sélectionnés
     166 * ce tableau sera ensuite comparé à la valeur $flux['data']['source'] fourni par le pipeline recuperer_fond()
     167 *
     168 * @return array
     169 *     les chemins sources vers les listes où activer Rang
     170 **/
     171
     172function rang_get_sources() {
     173        include_spip('inc/config');
     174        // mettre en cache le tableau calculé
     175        static $sources;
     176        if(is_array($sources)){
     177                return $sources;
     178        }
     179       
     180        $sources = array();
     181        $objets_selectionnes = lire_config('rang/rang_objets');
     182        $objets=explode(',',$objets_selectionnes);
     183
     184        foreach ($objets as $value) {
     185                $objet = table_objet($value);
     186                if (!empty($value)) {
     187                        $source = find_in_path('prive/objets/liste/'.$objet.'.html');
     188                        $sources[] = $source;
     189                }
     190
     191                // cas objets historiques
     192                if($objet == 'mots') {
     193                        $source = find_in_path('prive/objets/liste/mots-admin.html');
     194                        $sources[] = $source;
     195                }
     196        }
     197        return $sources;
     198}
     199
     200/**
     201 * Classer l'objet à la fin de la liste quand on le publie
     202 * @param string $table
     203 * @param int $id_objet
     204 * @return int
     205 */
     206 function rang_classer_dernier($table, $id_objet) {
     207
     208        // quel objet pour quel parent ?
     209        $definition_table       = lister_tables_objets_sql($table);
     210        $id_table_objet         = id_table_objet($table);
     211        $objet_parent           = $definition_table['parent']['type'];
     212        $id_objet_parent        = id_table_objet($objet_parent);
     213        $objet_parent_cle       = $definition_table['parent']['champ'];
     214
     215        // et hop, on place le nouvel objet publié à la fin
     216        $id_parent = sql_getfetsel($id_objet_parent, $table, $id_objet.' = '.$id_objet);
     217        $rang = sql_getfetsel('max(rang)', $table, $id_objet_parent.' = '.$id_parent );
     218        // todo : on classe l'article à la fin (rang max) mais on pourrait vouloir le classer au début
     219        // il faudrait donc une configuration pour ça, et dans ce cas reclasser tous les autres à un rang++
     220        $dernier = $rang+1;
     221
     222        return $dernier;
     223 }
     224
    163225function rang_tester_presence_numero($table) {
    164226        return false;
    165227}
     228
  • _plugins_/rang/trunk/paquet.xml

    r106380 r106482  
    22        prefix="rang"
    33        categorie="navigation"
    4         version="0.6.5"
     4        version="0.7.0"
    55        etat="experimental"
    66        compatibilite="[3.1.0;3.2.*]"
  • _plugins_/rang/trunk/prive/squelettes/inclure/rang.html

    r106380 r106482  
    2828                                        }
    2929
    30                                         $.post(url, {objet: "#ENV{objet}", id_rubrique: "#ENV{id_rubrique, rien}", debut_liste: page, trier: liste})
     30                                        $.post(url, {objet: "#ENV{objet}", id_parent: "#ENV{id_parent, rien}", debut_liste: page, trier: liste})
    3131                                                .done(function(data){
    3232                                                        $me.ajaxReload();
  • _plugins_/rang/trunk/rang_pipelines.php

    r106315 r106482  
    1414}
    1515
     16include_spip('inc/rang_api');
     17
    1618/**
    1719 * Declaration du champ Rang sur les objets sélectionnés
     20 * + Definir la relation a l‘objet parent dans la declaration de l‘objet (en attendant https://core.spip.net/issues/3844)
    1821 *
    1922 * @param array $tables
     
    2326        include_spip('inc/config');
    2427
     28        /* Declaration du champ Rang sur les objets sélectionnés */
    2529        $rang_objets = rtrim(lire_config('rang/rang_objets'), ',');
    2630        $liste_objets = explode(',', $rang_objets);
     
    2933                $tables[$table]['field']['rang'] = "SMALLINT NOT NULL";
    3034        }
     35       
     36        /* Definir la relation a l‘objet parent dans la declaration de l‘objet (en attendant https://core.spip.net/issues/3844) */
     37        // pour les articles
     38        $tables['spip_articles']['parent'] = array('type' => 'rubrique', 'champ' => 'id_rubrique');
     39
     40        // pour les rubriques
     41        $tables['spip_rubriques']['parent'] = array('type' => 'rubrique', 'champ' => 'id_rubrique');
     42
     43        //pour les mots-clés
     44        $tables['spip_mots']['parent'] = array('type' => 'groupe_mot', 'champ' => 'id_groupe');
     45
    3146        return $tables;
    3247}
     
    4156
    4257        $exec           = _request('exec');
    43 
    4458       
    4559        // Gestion du contexte i.e. page ?exec=xxxx
    46         // Par défaut, on peut toujours trier dans une rubrique.
    47         $contextes      = array(0 => 'rubrique');
     60        // Par défaut, on peut toujours trier dans une rubrique où dans un groupe de mot
     61        $contextes      = array(0 => 'rubrique', 1 => 'groupe_mots');
    4862
    4963        // Ajouter automatiquement un contexte
     
    6579        // -> contextes spécifiques à certains plugins (ex : pages uniques, Albums, etc.)
    6680
     81
     82
    6783        // faire archi gaffe à prendre le bon flux....pfiou compliqué :)
    6884        $sources        = rang_get_sources();
     85
    6986        if ( in_array($exec, $contextes) AND
    7087                 in_array($flux['data']['source'], $sources) AND
    7188                 strpos($flux['data']['texte'], 'pagination_liste')) {
    72                        
    7389
    7490                        // récupérer le type de l'objet, quelle que soit le contexte
     
    7793                        $suffixe_pagination = table_objet($objet);
    7894
     95                        $id_parent = $flux['args']['contexte']['id_rubrique'];
    7996
    8097                        // particularité des objets historiques
    81                         if ($objet == 'art') {
     98                        switch ($objet) {
     99                                case 'art':
    82100                                        $objet = 'articles';
    83101                                        $suffixe_pagination = 'art';
     102                                        break;
     103                                case 'mots':
     104                                        $objet = 'mots';
     105                                        $suffixe_pagination = 'mot';
     106                                        $id_parent = $flux['args']['contexte']['id_groupe'];
     107                                        break;
     108                                default:
     109                                        $id_parent = $flux['args']['contexte']['id_rubrique'];
     110                                        break;
    84111                        }
    85 
    86                         $id_rubrique = $flux['args']['contexte']['id_rubrique'];
    87 
    88                         // Debug
    89                         // echo 'objet : '.$objet.'<br>';
    90                         // echo 'fond : '.$flux['args']['fond'].'<br>';
    91                         // echo 'source : '.$flux['data']['source'].'<br>&nbsp;<br>';
    92                         //echo bel_env($flux);
    93112                       
    94                         $ajout_script = recuperer_fond('prive/squelettes/inclure/rang', array('suffixe_pagination' => $suffixe_pagination, 'objet' => $objet, 'id_rubrique' => $id_rubrique ));
     113                        $ajout_script = recuperer_fond('prive/squelettes/inclure/rang', array('suffixe_pagination' => $suffixe_pagination, 'objet' => $objet, 'id_parent' => $id_parent ));
    95114                        $flux['data']['texte'] = str_replace('</table>', '</table>'. $ajout_script, $flux['data']['texte']);
    96115               
    97116        }
    98 
    99117        return $flux;
    100 }
    101 
    102 /**
    103  * construction des chemins de sources vers les listes des objets sélectionnés
    104  * ce tableau sera ensuite comparé à la valeur $flux['data']['source'] fourni par le pipeline recuperer_fond()
    105  *
    106  * @return array
    107  *     les chemins sources vers les listes où activer Rang
    108  **/
    109 
    110 function rang_get_sources() {
    111         include_spip('inc/config');
    112         // mettre en cache le tableau calculé
    113         static $sources;
    114         if(is_array($sources)){
    115                 return $sources;
    116         }
    117        
    118         $sources = array();
    119         $objets_selectionnes = lire_config('rang/rang_objets');
    120         $objets=explode(',',$objets_selectionnes);
    121 
    122         foreach ($objets as $value) {
    123                 $objet = table_objet($value);
    124                 if (!empty($value)) {
    125                         $source = find_in_path('prive/objets/liste/'.$objet.'.html');
    126                         $sources[] = $source;
    127                 }
    128         }
    129         return $sources;
    130118}
    131119
     
    137125function rang_pre_edition($flux) {
    138126
    139         if($flux['args']['action']=='instituer' && $flux['data']['statut']=='publie' && lire_config('rang/rang_max')) {
    140                
    141                 $rang_objets  = rtrim(lire_config('rang/rang_objets'), ',');
    142                 $liste_objets = explode(',', $rang_objets);
    143                 $table        = $flux['args']['table'];
     127        if ($flux['args']['action']=='instituer' && lire_config('rang/rang_max')) {
     128                $rang_objets    = rtrim(lire_config('rang/rang_objets'), ',');
     129                $liste_objets   = explode(',', $rang_objets);
     130                $table                  = $flux['args']['table'];
    144131
     132                // cas des objets avec statut
    145133                if (in_array($table, $liste_objets)) {
    146                         // ici, on aurait bien besoin de objet_parent et id_parent
    147                         // dans la définition des tables, pour automatiser
    148                         switch($table) {
    149                                 case 'spip_articles' :
    150                                         $id_rubrique = sql_getfetsel('id_rubrique','spip_articles','id_article = '.$flux['args']['id_objet']);
    151                                         $rang = sql_getfetsel('max(rang)','spip_articles','id_rubrique = '.$id_rubrique);
    152                                         // todo : on classe l'article à la fin (rang max) mais on pourrait vouloir le classer au début
    153                                         // il faudrait donc une configuration pour ça, et dans ce cas reclasser tous les autres à un rang++
    154                                         $flux['data']['rang'] = $rang+1;
    155                                         break;
    156                                 case 'spip_mots' :
    157                                 case 'spip_rubriques' :
    158                                 case '...etc...' :
    159                                         // todo : traiter les autres cas
    160                                         break;
    161                                
     134                        $id_objet       = $flux['args']['id_objet'];
     135                       
     136                        // cas des objets avec statut
     137                        if (isset($flux['data']['statut']) && $flux['data']['statut']=='publie') {
     138                                $flux['data']['rang'] = rang_classer_dernier($table, $id_objet);
     139                        }
     140                        // cas des mots clés
     141                        if ($table == 'spip_mots') {
     142                                $flux['data']['rang'] = rang_classer_dernier($table, $id_objet);
    162143                        }
    163144                }
    164145        }
    165        
    166146        return $flux;
    167147}
Note: See TracChangeset for help on using the changeset viewer.