source: spip-zone/_plugins_/linkcheck/trunk/linkcheck_pipelines.php @ 103854

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

log en moins

File size: 8.3 KB
Line 
1<?php
2/**
3 * Plugin LinkCheck
4 * (c) 2013-2017 Benjamin Grapeloux, Guillaume Wauquier
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Ajouter aprés l'ajout ou la modification d'un objet, enregistre les
14 * nouveaux liens, efface les anciens et programme une vérification de
15 * ces liens
16 *
17 * @param array $flux
18 * @return array
19 */
20function linkcheck_post_edition($flux) {
21        $objet = false;
22        /**
23         * Le pipeline d'institution ne passe pas type
24         */
25        if (isset($flux['args']['type'])) {
26                $objet = $flux['args']['type'];
27        } elseif ($flux['args']['action'] == 'instituer'
28                and isset($flux['data']['statut'])
29                and isset($flux['args']['table'])) {
30                $objet = objet_type($flux['args']['table']);
31        }
32
33        //on verifie que l'on est bien dans un contexte de verification d'objet
34        if ($flux['args']['id_objet'] && $objet) {
35                include_spip('inc/linkcheck_fcts');
36                include_spip('inc/linkcheck_vars');
37                $champs_a_traiter = false;
38                $id_objet = intval($flux['args']['id_objet']);
39                $table_sql = table_objet_sql($objet);
40                $id_table_objet = id_table_objet($objet);
41                $tables_a_traiter = linkcheck_tables_a_traiter();
42                foreach ($tables_a_traiter as $table) {
43                        foreach ($table as $table_sql_def => $info_table) {
44                                if ($table_sql_def == $table_sql) {
45                                        $champs_a_traiter = linkcheck_champs_a_traiter($info_table);
46                                        break;
47                                }
48                        }
49
50                        if (is_array($champs_a_traiter)) {
51                                break;
52                        }
53                }
54                /**
55                 * On ne comptabilise les liens que sur les objets prévisualisables
56                 *
57                 * Ici on vérifie si le statut de l'objet est prévisualisable
58                 */
59                $fields = objet_info($objet, 'field');
60                if (isset($fields['statut'])) {
61                        $info_statuts = objet_info($objet, 'statut');
62                        $statuts = array();
63                        if (isset($info_statuts[0]['previsu'])) {
64                                $statuts = explode(',', str_replace('/auteur', '', $info_statuts[0]['previsu']));
65                                foreach ($statuts as $key => $val) {
66                                        if ($val == '!') {
67                                                unset($statuts[$key]);
68                                        }
69                                }
70                        } else {
71                                $not_statuts = array('refuse', 'poubelle');
72                        }
73                        $statut = sql_getfetsel('statut', $table_sql, $id_table_objet.'='.intval($id_objet));
74                        if (count($statuts) > 0 && in_array($statut, $statuts)) {
75                                $objet_ok = true;
76                        } elseif (count($statuts) == 0 && !in_array($statut, $not_statuts)) {
77                                $objet_ok = true;
78                        } else {
79                                $objet_ok = false;
80                        }
81                } else {
82                        $objet_ok = true;
83                }
84                /**
85                 * L'objet n'a plus de statut prévisualisable donc ses liens ne sont plus pris en compte
86                 * On les supprime et si le lien n'est plus utilisé sur d'autres objets, il est également supprimé
87                 */
88                if (!$objet_ok) {
89                        $liens_lies = sql_allfetsel(
90                                'id_linkcheck',
91                                'spip_linkchecks_liens',
92                                'id_objet='.intval($id_objet).' AND objet='.sql_quote($objet)
93                        );
94                        foreach ($liens_lies as $lien) {
95                                sql_delete(
96                                        'spip_linkchecks_liens',
97                                        'id_linkcheck='.intval($lien['id_linkcheck']).'
98                                                AND id_objet='.intval($id_objet).'
99                                                AND objet='.sql_quote($objet)
100                                );
101                                if (!sql_countsel('spip_linkchecks_liens', 'id_linkcheck='.intval($lien['id_linkcheck']))) {
102                                        sql_delete('spip_linkchecks', 'id_linkcheck='.intval($lien['id_linkcheck']));
103                                }
104                        }
105                        return $flux;
106                }
107                if (is_array($champs_a_traiter)) {
108                        $tab_value = sql_fetsel(array_keys($champs_a_traiter), $table_sql, $id_table_objet.'='.intval($id_objet));
109                        foreach (array_keys($champs_a_traiter) as $ct) {
110                                if (isset($flux['data'][$ct])) {
111                                        $tab_value[$ct]=$flux['data'][$ct];
112                                }
113                        }
114                        //on parcours les liens
115                        $tab_liens = linkcheck_lister_liens($tab_value);
116
117                        // On regarde si l'objet parent est publie
118                        $objet_publie = objet_test_si_publie($objet, $id_objet);
119
120                        if ($objet_publie) {
121                                $publie = 'oui';
122                        } else {
123                                $publie = 'non';
124                        }
125                        //on les insère en base si besoin
126                        linkcheck_ajouter_liens($tab_liens, $objet, $id_objet, $publie);
127
128                        // maintenant on vérifie que tous les liens de la base correspondant à cet objet
129                        // soient encore présent dans l'objet
130                        // on recup tout les liens de l'article presents en base
131                        $sel = sql_allfetsel(
132                                'l.url, l.id_linkcheck',
133                                'spip_linkchecks_liens AS ll, spip_linkchecks AS l',
134                                'l.id_linkcheck=ll.id_linkcheck AND id_objet='.intval($id_objet).' AND ll.objet='.sql_quote($objet)
135                        );
136
137                        //pour chaque liens
138                        foreach ($sel as $lks) {
139                                //si il n'est plus ds l'article
140                                if (!in_array($lks['url'], $tab_liens)) {
141                                        //on supprime son entrée ds la table de liaison
142                                        sql_delete(
143                                                'spip_linkchecks_liens',
144                                                'id_linkcheck='.intval($lks['id_linkcheck']).' AND id_objet='.intval($id_objet).'
145                                                        AND objet='.sql_quote($objet)
146                                        );
147
148                                        //on regarde s'il est utilisé ailleurs ds le site
149                                        $tpl = sql_getfetsel(
150                                                'count(*)',
151                                                'spip_linkchecks_liens',
152                                                'id_linkcheck='.intval($lks['id_linkcheck'])
153                                        );
154                                        //s'il ne l'est pas
155                                        if ($tpl == 0) {
156                                                //on le supprime de la table liens
157                                                sql_delete('spip_linkchecks', 'id_linkcheck='.intval($lks['id_linkcheck']));
158                                        }
159                                }
160                        }
161                        include_spip('inc/queue');
162                        queue_add_job(
163                                'genie_linkcheck_test_postedition',
164                                'Tests post_edition des liens d\'un objet',
165                                array($id_objet, $objet),
166                                'genie/linkcheck_test_postedition',
167                                true,
168                                0,
169                                -5
170                        );
171                }
172        }
173
174        return $flux;
175}
176
177
178/**
179 * Pipeline qui ajoute des taches automatiques
180 *
181 * @param array $taches
182 * @return $taches
183 */
184function linkcheck_taches_generales_cron($taches) {
185        $taches['linkcheck_tests_ok'] = 2*24*3600; // tous les 2 jours
186        $taches['linkcheck_tests_vide'] = 12*3600; // toutes les 12 heures //on test ceux qui n'ont pas d'état
187        $taches['linkcheck_tests_mort'] = 7*24*3600; // toutes les semaines
188        $taches['linkcheck_tests_malade'] = 24*3600; // tous les jours
189        $taches['linkcheck_tests_deplace'] = 3.5*24*3600; // 2 fois par semaine
190        $taches['linkcheck_mail'] = 24*3600; // tous les jours
191        return $taches;
192}
193
194/**
195 * Pipeline qui affiche des alertes au webmestre du site, pour l'informer et
196 * l'inciter à corriger les liens défectueux du site
197 *
198 * On n'affiche le message que lorsqu'il y a au moins un lien mort ou malade dans le site
199 *
200 * @param array $flux
201 * @return array
202 */
203function linkcheck_alertes_auteur($flux) {
204        include_spip('inc/config');
205        if (lire_config('linkcheck/afficher_alerte')) {
206                include_spip('inc/autoriser');
207                if (autoriser('voir', 'linkchecks')) {
208                        include_spip('inc/linkcheck_fcts');
209                        $res = sql_getfetsel('id_linkcheck', 'spip_linkchecks', sql_in('etat', array('mort', 'malade')));
210                        if ($res > 0) {
211                                $comptes = linkcheck_chiffre();
212                                $texte = _T(
213                                        'linkcheck:liens_invalides',
214                                        array(
215                                                'mort' => (isset($comptes['nb_lien_mort']) ? $comptes['nb_lien_mort'] : '0'),
216                                                'malade' => (isset($comptes['nb_lien_malade']) ? $comptes['nb_lien_malade'] : '0'),
217                                                'deplace' => (isset($comptes['nb_lien_deplace']) ? $comptes['nb_lien_deplace'] : '0')
218                                        )
219                                );
220                                $flux['data'][] = $texte." <a href='" . generer_url_ecrire('linkchecks') . "'>"._T('linkcheck:linkcheck').'</a>';
221                        }
222                }
223        }
224        return $flux;
225}
226
227/**
228 * Insertion dans le pipeline affiche_gauche (SPIP)
229 * Affiche la liste des liens contenus dans l'objet
230 *
231 * @pipeline affiche_gauche
232 * @param array $flux
233 * @return array
234 */
235function linkcheck_affiche_gauche($flux) {
236        include_spip('inc/autoriser');
237        $texte = '';
238        $e = trouver_objet_exec($flux['args']['exec']);
239        if (is_array($e) && !$e['edition']) {
240                include_spip('inc/linkcheck_vars');
241                $tab_type_objets = linkcheck_tables_a_traiter();
242                foreach ($tab_type_objets as $objet) {
243                        $_objet = array_shift($objet);
244                        if (autoriser('modifier', $e['type'], $flux['args'][$e['id_table_objet']]) && ((isset($_objet['page']) && $e['type'] == $_objet['page']) || $e['type'] == $_objet['type'])) {
245                                $texte .= recuperer_fond('prive/objets/liste/linkchecks_lies', array(
246                                        'objet_source' => 'linkcheck',
247                                        'objet' => $e['type'],
248                                        'id_objet' => $flux['args'][$e['id_table_objet']]
249                                ));
250                                if ($p = strpos($flux['data'], '<!--affiche_milieu-->')) {
251                                        $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
252                                } else {
253                                        $flux['data'] .= $texte;
254                                }
255                                break;
256                        }
257                }
258        }
259
260        return $flux;
261}
262
263/**
264 * Optimiser la base de donnees en supprimant les liens orphelins
265 * de l'objet vers quelqu'un et de quelqu'un vers l'objet.
266 *
267 * @param array $flux
268 * @return array
269 */
270function linkcheck_optimiser_base_disparus($flux) {
271        include_spip('action/editer_liens');
272        $flux['data'] += objet_optimiser_liens(array('linkcheck'=>'*'), '*');
273        return $flux;
274}
Note: See TracBrowser for help on using the repository browser.