1 | <?php |
---|
2 | |
---|
3 | if (!defined('_ECRIRE_INC_VERSION')) { |
---|
4 | return; |
---|
5 | } |
---|
6 | |
---|
7 | function 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 | } |
---|