Changeset 110434 in spip-zone


Ignore:
Timestamp:
May 28, 2018, 11:18:08 AM (15 months ago)
Author:
rastapopoulos@…
Message:

1) On vire toutes les modifs par regex, c'est fini ce temps là. On utilise le DOMDocument qui est standard dans PHP et qui marche très bien et qui fait de la vraie analyse syntaxique, c'est très solide et propre. 2) On ajoute une colonne Rang *si pas déjà* bien sûr et on met un lien qui permet de trier dessus, car pour l'instant je ne sais pas encore comment faire pour forcer le tri en avance, car il n'y a pas de pipeline PRE compilation dans SPIP (et c'est un manque). On approche du but même s'il y a encore des manques, là tout est automatisé et fonctionne pour n'importe quel objet qui n'aurait pas changé son squelette de liste !

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/rang/branches/automatique/rang_pipelines.php

    r110319 r110434  
    6363                //and in_array(_request('exec'), rang_get_contextes())
    6464        ) {
    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'])
    76                 ) {
    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                                         );
     65                //var_dump(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS));
     66               
     67                // On teste rapide pour les choses à ajouter
     68                $ajouter_objet = (strpos($flux['data']['texte'], 'data-objet=') === false);
     69                $ajouter_ids = (strpos($flux['data']['texte'], 'data-id_objet') === false);
     70                $ajouter_rangs = !preg_match('%<th[^>]+?class=("|\')[\w ]*?rang%is', $flux['data']['texte']);
     71               
     72                // On continue et on fait de l'analyse de DOM seulement si au moins un des trois
     73                if ($ajouter_objet or $ajouter_ids or $ajouter_rangs) {
     74                        // On charge le DOM de la liste
     75                        libxml_use_internal_errors(true);
     76                        $dom = new DOMDocument;
     77                        $dom->loadHTML('<?xml encoding="utf-8" ?>' . $flux['data']['texte']);
     78                        $finder = new DomXPath($dom);
     79                       
     80                        // Si pas déjà présent, on ajoute l'info de l'objet sur le tableau
     81                        if ($ajouter_objet and $table = $dom->getElementsByTagName('table')->item(0)) {
     82                                $table->setAttribute('data-objet', $objet_info['objet']);
     83                        }
     84                       
     85                        // On voit si on doit ajouter un th de rang
     86                        if (
     87                                $ajouter_rangs
     88                                and $thead_tr = $finder->query('//thead/tr')->item(0)
     89                                and $th_premier = $dom->getElementsByTagName('th')->item(0)
     90                        ) {
     91                                $url_trier_rang = parametre_url(self(), 'par', 'rang', '&');
     92                                $lien_tri = $dom->createElement('a', 'Rang');
     93                                $lien_tri->setAttribute('href', $url_trier_rang);
     94                                $lien_tri->setAttribute('class', 'ajax');
     95                                $th = $dom->createElement('th');
     96                                $th->appendChild($lien_tri);
     97                                $thead_tr->insertBefore($th, $th_premier);
     98                        }
     99                       
     100                        // On parcourt toutes les lignes de contenu
     101                        $tbody_trs = $finder->query('//tbody/tr');
     102                        foreach ($tbody_trs as $tr) {
     103                                // Il faut toujours avoir l'id sous la main
     104                                if ($td_id = $finder->query('.//td[contains(@class, "id")]', $tr)->item(0)) {
     105                                        $id_objet = intval($td_id->textContent);
    93106                                       
    94                                         return $matches[1] . $lignes . '</tbody>';
    95                                 },
    96                                 $flux['data']['texte']
    97                         );
     107                                        // Si on doit ajouter les ids
     108                                        if ($ajouter_ids) {
     109                                                $tr->setAttribute('data-id_objet', $id_objet);
     110                                        }
     111                                       
     112                                        // Si on doit ajouter les rangs
     113                                        if (
     114                                                $ajouter_rangs
     115                                                and $td_premier = $tr->getElementsByTagName('td')->item(0)
     116                                        ) {
     117                                                $rang = sql_getfetsel('rang', $objet_info['table_objet_sql'], $objet_info['cle_objet'].'='.$id_objet);
     118                                                $tr->insertBefore($dom->createElement('td', $rang), $td_premier);
     119                                        }
     120                                }
     121                        }
     122                       
     123                        // S'il a un tfoot on rajoute aussi
     124                        if (
     125                                $ajouter_rangs
     126                                and $tfoot_trs = $finder->query('//tfoot/tr')
     127                        ) {
     128                                foreach ($tfoot_trs as $tr) {
     129                                        $td_premier = $tr->getElementsByTagName('td')->item(0);
     130                                        $tr->insertBefore($dom->createElement('td'), $td_premier);
     131                                }
     132                        }
     133                       
     134                        // On retransforme en HTML à la fin
     135                        $flux['data']['texte'] = $dom->saveHTML();
    98136                }
    99137               
Note: See TracChangeset for help on using the changeset viewer.