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

Last change on this file since 104864 was 104864, checked in by kent1@…, 4 years ago

Version 1.4.4

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