source: spip-zone/_plugins_/linkcheck/trunk/action/linkcheck_parcours.php @ 103846

Last change on this file since 103846 was 103846, checked in by kent1@…, 3 years ago
  • Déclaration plus moderne de la table linkcheck (dans declarer_tables_objets_sql())
  • Utiliser les mêmes limitations de statuts entre la détection de liens générale et celle par le pipeline post_edition. Seuls sont conservés les liens sur des objets pouvant être prévisualisés.
  • Réparation de la détection des liens sur les rubriques
  • Ajout d'un champ publie à la fois sur la table spip_linkchecks et spip_linkchecks_liens testant si l'objet parent est publié.
  • Permettre de filtrer sur les liens "Visibles en ligne" (publie == oui) et "Non visibles en ligne" (publie == non)
  • Changement du coté des autorisations, dorénavant :
    • les administrateurs et les rédacteurs peuvent voir la page linkchecks
    • seuls les webmestres peuvent réinitialiser la base
    • les personnes autorisées à modifier un objet voient les liens contenus dans l'objet éditorial
  • Déplacement du bloc sur les objets dans la colonne de gauche
  • Limiter l'affichage du blocs de liens sur les objets aux auteurs pouvant modifier l'objet

Version 1.4.0

File size: 5.5 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7function action_linkcheck_parcours_dist() {
8        set_time_limit(0);
9        include_spip('inc/autoriser');
10        include_spip('inc/linkcheck_fcts');
11
12        $securiser_action = charger_fonction('securiser_action', 'inc');
13        $arg = $securiser_action();
14
15        include_spip('inc/linkcheck_vars');
16        include_spip('inc/linkcheck_fcts');
17        include_spip('inc/autoriser');
18        include_spip('inc/queue');
19        include_spip('inc/config');
20
21        global $db_ok;
22        $branche=_request('branche', 0);
23
24        if (autoriser('webmestre')) {
25                //si la fonction n'a pas encore été effectué completement |
26                //Dans le cas ou on ne peux effectuer cette action qu'une fois ...
27                //if(!lire_config('linkcheck_etat_parcours')){
28
29                        //on regarde si la fonction a déjà été effectuée partiellement en récupérant les ids de reprise
30                        $dio = lire_config('linkcheck_dernier_id_objet');
31                        $do = lire_config('linkcheck_dernier_objet');
32                        $etat = lire_config('linkcheck_etat_parcours');
33
34                        //si le parcours a déja été réalisé, on reinitialise les méta
35                        if ($etat) {
36                                ecrire_config('linkcheck_dernier_id_objet', 0);
37                                ecrire_config('linkcheck_dernier_objet', 0);
38                        }
39
40                        //pour chaque tables
41                        $tables_a_traiter = linkcheck_tables_a_traiter();
42                        foreach ($tables_a_traiter as $key_table => $table) {
43                                //si on en est bien a cette table
44                                if (($do && $do<$key_table) || !$do) {
45                                        foreach ($table as $table_sql => $info_table) {
46                                                if (in_array($table_sql, array('spip_plugins'))) {
47                                                        continue;
48                                                }
49                                                $nom_champ_id=id_table_objet($table_sql);
50                                                // Récuperer la liste des champs suivant le type d'objet
51                                                $tab_champs_a_traiter = linkcheck_champs_a_traiter($info_table);
52                                                if (empty($tab_champs_a_traiter)) {
53                                                        continue;
54                                                }
55                                                $champs_a_traiter = is_array($tab_champs_a_traiter) ?
56                                                        implode(',', array_keys($tab_champs_a_traiter)) : '*';
57
58                                                // Recommencer à l'endroit ou l'on s'est arrêté
59                                                $where  = $nom_champ_id.'>'.intval($dio);
60
61                                                // Ne sélectionner que les objets dans la base qui contiennent des URLs
62                                                // @todo Tester pour oracle et sqlite
63                                                if ($db_ok['type'] === 'mysql') {
64                                                        /*$tab_expreg_mysql = array(
65                                                                '(((https?|ftps?)://)|(((https?|ftps?)://)?[A-Za-z0-9\-]*\.))[A-Za-z0-9\-]+\.[a-zA-Z]{2,9}/?',
66                                                                '->[^\]]\]');*/
67                                                        $classe_alpha = 'a-zA-Z0-9âäéèëêïîôöùüû²';
68                                                        $tab_expreg_mysql = array(
69                                                                "(((http|https|ftp|ftps)://)?www\.)|((http|https|ftp|ftps)://([".$classe_alpha."\-]*\.)?))([".$classe_alpha."+\-]*\.)+[a-zA-Z0-9]{2,9}(/[".$classe_alpha."=.?&+\_\\@\:\,/%#\-]*)?)(\'|\"| |\.|\->|\]|,|;|\s)/?",
70                                                                '(\->)([a-zA-Z]{3,10}[0-9]{1,})\]'
71                                                        );
72
73                                                        $where_reg = array();
74                                                        foreach ($tab_champs_a_traiter as $nom_champs => $type_champs) {
75                                                                if ($type_champs) {
76                                                                        foreach ($tab_expreg_mysql as $expreg) {
77                                                                                $where_reg[] = $nom_champs . ' regexp(\'' . $expreg . '\')';
78                                                                        }
79                                                                } else {
80                                                                        $where_reg[] = $nom_champs . ' <> \'\'';
81                                                                }
82                                                        }
83                                                        $where .= (!empty($where_reg)) ? ' AND (' . implode(' or ', $where_reg) . ')' : '';
84                                                }
85                                                // On réduit la recherche à une branche du site
86
87                                                $where .= ($branche > 0) ?
88                                                        ' AND (id_rubrique IN(' . implode(',', linkcheck_marmots($branche)) . '))' : '';
89
90                                                if (isset($info_table['statut'][0]['previsu'])) {
91                                                        $statuts = explode(',', str_replace('/auteur', '', $info_table['statut'][0]['previsu']));
92                                                        foreach ($statuts as $key => $val) {
93                                                                if ($val == '!') {
94                                                                        unset($statuts[$key]);
95                                                                }
96                                                        }
97                                                        if (count($statuts) > 0) {
98                                                                $where .= ' AND '.sql_in('statut', $statuts);
99                                                        }
100                                                } else if (isset($info_table['field']['statut'])) {
101                                                        // On exclus de la selection, les objet dont le status est refuse ou poubelle
102                                                        $where .= ' AND '.sql_in('statut', array('refuse', 'poubelle'), true);
103                                                }
104
105                                                $sql = sql_allfetsel(
106                                                        $nom_champ_id.','.$champs_a_traiter,
107                                                        $table_sql,
108                                                        $where,
109                                                        '',
110                                                        $nom_champ_id.' ASC'
111                                                );
112
113                                                //pour chaque objet
114                                                $objet = objet_type($table_sql);
115                                                foreach ($sql as $res) {
116                                                        //on créé les variables à envoyer
117                                                        $id_objet = $res[$nom_champ_id];
118                                                        unset($res[$nom_champ_id]);
119
120                                                        //on liste les liens
121                                                        $tab_liens = linkcheck_lister_liens($res);
122
123                                                        // On regarde si l'objet parent est publie
124                                                        $objet_publie = objet_test_si_publie($objet, $id_objet);
125
126                                                        if ($objet_publie) {
127                                                                $publie = 'oui';
128                                                        } else {
129                                                                $publie = 'non';
130                                                        }
131
132                                                        //on les insere dans la base
133                                                        linkcheck_ajouter_liens($tab_liens, $objet, $id_objet, $publie);
134
135                                                        //on renseigne les ids de reprise
136                                                        ecrire_config('linkcheck_dernier_id_objet', $id_objet);
137                                                }
138                                                //on renseigne l'indice de la table
139                                                ecrire_config('linkcheck_dernier_objet', $key_table);
140                                        }
141                                }
142                        }
143
144                        //quand la fonction a été executée en entier on renseigne la base
145                        ecrire_config('linkcheck_etat_parcours', true);
146
147                        //on lance analyse des liens trouvés
148                        //queue_add_job('linkcheck_tests', 'Tests post parcours des liens de la base', '', 'inc/linkcheck_fcts');
149
150                        //echo minipres('Parcours des liens', ("<p>Terminé !</p>\n<p style='text-align: right'> Vous pouvez maintenant <a href='" . generer_url_ecrire("linkcheck_tests"). "'> &gt;&gt; "._T('linkcheck:tester_liens_linkchecks')."</a></p>"));
151
152                //}
153        }
154
155        if ($redirect = _request('redirect')) {
156                include_spip('inc/headers');
157                redirige_par_entete($redirect.'&message=parcours_ok');
158        }
159}
Note: See TracBrowser for help on using the repository browser.