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

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

Version 1.4.2

Dans le pipeline post_edition s'assurer que le second argument passé à in_array est bien un tableau

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