Changeset 110319 in spip-zone


Ignore:
Timestamp:
May 19, 2018, 9:53:56 PM (4 months ago)
Author:
rastapopoulos@…
Message:

On arrive à remplir le data-objet et le data-id_objet automatiquement, sur toutes les listes d'objets classiques. Reste à affiner la détection du parent sur vraiment tous les types de parent (ex objet/id_objet certains), et surtout à n'activer le rangement quand la liste est triée par Rang, ce qui n'est pas forcément le cas par défaut, et n'a d'ailleurs pas à l'être (il y a plein de cas où on veut que telle liste soit par défaut affichée par date, par titre, ou autre).

Location:
_plugins_/rang/branches/automatique
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rang/branches/automatique/inc/rang_api.php

    r110204 r110319  
    108108}
    109109
     110/**
     111 * Trouver l'objet qui correspond au squelette de liste de l'espace privé passé en argument sur le même modele que trouver_objet_exec()
     112 *
     113 * @see trouver_objet_exec
     114 * @param string $squelette
     115 *              Chemin d'un squelette de liste de l'admin (prive/objets/liste/patates)
     116 * @return array
     117 *              Retourne un tableau avec les infos de l'objet trouvé, sinon false
     118 **/
     119function rang_trouver_objet_liste($squelette) {
     120        static $objets_listes = array();
     121       
     122        if (!isset($objets_listes[$squelette])) {
     123                include_spip('base/objets');
     124                $objets_listes[$squelette] = false;
     125               
     126                if ($squelette and strpos($squelette, 'prive/objets/liste/') === 0) {
     127                        $exceptions = pipeline(
     128                                'rang_trouver_objet_liste',
     129                                array(
     130                                        'prive/objets/liste/mots-admin' => 'mot',
     131                                )
     132                        );
     133                       
     134                        // Soit on trouve l'objet dans la liste explicite
     135                        if (isset($exceptions[$squelette])) {
     136                                $objet = $exceptions[$squelette];
     137                        }
     138                        else {
     139                                $objet = str_replace('prive/objets/liste/', '', $squelette);
     140                        }
     141                       
     142                        // Si on a un objet et qu'il est dans les objets connus de SPIP
     143                        if (
     144                                $objet
     145                                and $table_objet_sql = table_objet_sql($objet)
     146                                and $objets = lister_tables_objets_sql()
     147                                and isset($objets[$table_objet_sql])
     148                        ) {
     149                                $objets_listes[$squelette] = array(
     150                                        'objet' => objet_type($objet),
     151                                        'table_objet_sql' => $table_objet_sql,
     152                                        'table_objet' => table_objet($objet),
     153                                        'cle_objet' => id_table_objet($objet),
     154                                );
     155                        }
     156                }
     157        }
     158       
     159        return $objets_listes[$squelette];
     160}
    110161
    111162/**
     
    116167 *     les chemins sources vers les listes où activer Rang
    117168 **/
    118 
    119169function rang_get_sources() {
    120170        include_spip('inc/config');
     
    157207 */
    158208function rang_get_contextes() {
    159         static $contextes;
    160         if(is_array($contextes)){
    161                 return $contextes;
    162         }
    163         include_spip('base/objets_parents');
    164         $tables = lire_config('rang/objets');
    165         $contextes = array();
    166        
    167         foreach ($tables as $table) {
    168                 // le nom de l'objet au pluriel
    169                 $contextes[] = table_objet($table);
    170                 // si l'objet a un parent, on ajoute le nom de cet objet
    171                 $info_parent = type_objet_info_parent(objet_type($table));
    172                 if (isset($info_parent['type']) && $info_parent['type']) {
    173                         $contextes[] = $info_parent['type'];
    174                 }
    175                 if($table=='spip_mots'){
    176                         $contextes[] = 'groupe_mots';
    177                 }
    178         }
    179         // vérifier si des plugins déclarent des contextes spécifiques
    180         $contextes = pipeline('rang_declarer_contexte',$contextes);
     209        static $contextes = null;
     210       
     211        if (!is_array($contextes)) {
     212                include_spip('base/objets_parents');
     213               
     214                $tables = lire_config('rang/objets');
     215                $contextes = array();
     216               
     217                foreach ($tables as $table) {
     218                        // le nom de l'objet au pluriel
     219                        $contextes[] = table_objet($table);
     220                        // si l'objet a un parent, on ajoute le nom de cet objet
     221                        $info_parent = type_objet_info_parent(objet_type($table));
     222                        if (isset($info_parent['type']) and $info_parent['type']) {
     223                                $contextes[] = $info_parent['type'];
     224                        }
     225                        if($table == 'spip_mots'){
     226                                $contextes[] = 'groupe_mots';
     227                        }
     228                }
     229                // vérifier si des plugins déclarent des contextes spécifiques
     230                $contextes = pipeline('rang_declarer_contexte', $contextes);
     231        }
     232       
    181233        return $contextes;
    182234}
  • _plugins_/rang/branches/automatique/paquet.xml

    r110177 r110319  
    2222        <necessite nom="declarerparent" compatibilite="[1.3.2;]" />
    2323        <utilise nom="mots" compatibilite="[2.7.8;]" />
    24 
     24       
     25        <pipeline nom="rang_trouver_objet_liste" action="" />
    2526        <pipeline nom="rang_declarer_contexte" action="" />
    2627
  • _plugins_/rang/branches/automatique/rang_pipelines.php

    r110204 r110319  
    5151        $tables_objets_selectionnes = lire_config('rang/objets');
    5252       
    53         if (isset($tables_objets_selectionnes) and !empty($tables_objets_selectionnes)) {
    54                 // Gestion du contexte : dans quelle page insérer le JS ?
    55                 if (in_array(_request('exec'), rang_get_contextes())
    56                         && in_array($flux['args']['fond'], rang_get_sources())
    57                         && strpos($flux['data']['texte'], 'data-objet=')
     53        if (
     54                // S'il y a bien des objets qu'on veut trier
     55                isset($tables_objets_selectionnes)
     56                and !empty($tables_objets_selectionnes)
     57                // On cherche un objet en rapport avec le squelette
     58                and $objet_info = rang_trouver_objet_liste($flux['args']['fond'])
     59                // Cet objet fait partie de ceux qu'on veut pouvoir trier
     60                and in_array($objet_info['table_objet_sql'], $tables_objets_selectionnes)
     61                // On cherche l'objet correspondant à la page en cours
     62                // Si la page sur laquelle on est fait partie des contextes qui peut avoir des rangs à trier
     63                //and in_array(_request('exec'), rang_get_contextes())
     64        ) {
     65                // Si pas déjà présent, on ajoute l'info de l'objet sur le tableau
     66                if (strpos($flux['data']['texte'], 'data-objet=') === false) {
     67                        $flux['data']['texte'] = preg_replace('/<table/i', '<table data-objet="'.$objet_info['objet'].'"', $flux['data']['texte']);
     68                }
     69               
     70                // Si pas déjà, on ajoute l'info d'identifiant sur chaque ligne
     71                if (
     72                        // Si pas de id_objet déjà dans le tableau
     73                        strpos($flux['data']['texte'], 'data-id_objet') === false
     74                        // Et qu'il y a des cellules avec les ids
     75                        and preg_match('%<td[^>]+?class=("|\')[^>]*?id%is', $flux['data']['texte'])
    5876                ) {
    59                         // recuperer le nom de l'objet
    60                         preg_match('/data-objet=["\'](\w+)["\']/', $flux['data']['texte'], $result);
    61                         $objet_nom  = $result[1];
    62                         $objet_type = objet_type($objet_nom);
     77                        include_spip('inc/filtres');
     78                       
     79                        $flux['data']['texte'] = preg_replace_callback(
     80                                '%(<tbody[^>]*?>)(.*?)</tbody>%is',
     81                                function ($matches) {
     82                                        $lignes = preg_replace_callback(
     83                                                '%<tr([^>]*?)>(.*?)</tr>%is',
     84                                                function ($matches) {
     85                                                        // On cherche le numéro d'id
     86                                                        preg_match('%<td[^>]+?class=("|\')[^>]*?id[^>]*?>(.*?)</td>%is', $matches[2], $trouver);
     87                                                        $id = supprimer_tags($trouver[2]);
     88                                                       
     89                                                        return '<tr' . $matches[1] . "data-id_objet=\"$id\"" . '>' . $matches[2] . '</tr>';
     90                                                },
     91                                                $matches[2]
     92                                        );
     93                                       
     94                                        return $matches[1] . $lignes . '</tbody>';
     95                                },
     96                                $flux['data']['texte']
     97                        );
     98                }
     99               
     100                $objet = $objet_info['objet'];
     101               
     102                // récupérer le type de parent…
     103                include_spip('base/objets_parents');
     104                $parent       = type_objet_info_parent($objet);
     105                $parent_champ = $parent['0']['champ'];
     106                $id_parent    = $flux['args']['contexte'][$parent_champ];
    63107
    64                         // insérer le script de tri si on a bien un objet à ranger
    65                         if ($objet_type) {
    66                                 // récupérer le type de parent…
    67                                 include_spip('base/objets_parents');
    68                                 $parent       = type_objet_info_parent($objet_type);
    69                                 $parent_champ = $parent['0']['champ'];
    70                                 $id_parent    = $flux['args']['contexte'][$parent_champ];
     108                // suffixe de la pagination : particularité des objets historiques
     109                switch ($objet) {
     110                        case 'article':
     111                                $suffixe_pagination = 'art';
     112                                break;
     113                        case 'site':
     114                                $suffixe_pagination = 'sites';
     115                                break;
     116                        case 'breve':
     117                                $suffixe_pagination = 'bre';
     118                                break;
     119                        default:
     120                                $suffixe_pagination = $objet;
     121                                break;
     122                }
    71123
    72                                 // suffixe de la pagination : particularité des objets historiques
    73                                 switch ($objet_type) {
    74                                         case 'article':
    75                                                 $suffixe_pagination = 'art';
    76                                                 break;
    77                                         case 'site':
    78                                                 $suffixe_pagination = 'sites';
    79                                                 break;
    80                                         case 'breve':
    81                                                 $suffixe_pagination = 'bre';
    82                                                 break;
    83                                         default:
    84                                                 $suffixe_pagination = $objet_type;
    85                                                 break;
    86                                 }
     124                // Calcul du JS à insérer avec les paramètres
     125                $ajout_script = recuperer_fond(
     126                        'prive/squelettes/inclure/rang',
     127                        array(
     128                                'suffixe_pagination' => $suffixe_pagination,
     129                                'objet'              => table_objet($objet),
     130                                'id_parent'          => $id_parent,
     131                        )
     132                );
    87133
    88                                 // Calcul du JS à insérer avec les paramètres
    89                                 $ajout_script = recuperer_fond('prive/squelettes/inclure/rang', array(
    90                                         'suffixe_pagination' => $suffixe_pagination,
    91                                         'objet'              => $objet_nom,
    92                                         'id_parent'          => $id_parent,
    93                                 ));
    94 
    95                                 // et hop, on insère le JS calculé
    96                                 $flux['data']['texte'] = str_replace('</table>', '</table>' . $ajout_script, $flux['data']['texte']);
    97                         }
    98                 }
     134                // et hop, on insère le JS calculé
     135                $flux['data']['texte'] = str_replace('</table>', '</table>' . $ajout_script, $flux['data']['texte']);
    99136        }
    100137       
Note: See TracChangeset for help on using the changeset viewer.