source: spip-zone/_plugins_/_dev_/liens_contenus/inc/lienscontenus.php @ 9843

Last change on this file since 9843 was 9843, checked in by nicolas@…, 13 years ago

-* On intercepte montenant aussi les suppressions de mots clefs (mais ne marche que sur un mot pour l'instant... :( )

File size: 18.4 KB
Line 
1<?php
2/*
3 * liens_contenus
4 * Gestion des liens inter-contenus
5 *
6 * Auteur :
7 * Nicolas Hoizey
8 * © 2007 - Distribue sous licence GNU/GPL
9 *
10 */
11
12function lienscontenus_referencer_liens($type_objet_contenant, $id_objet_contenant, $contenu)
13{
14    spip_log('Referencer liens contenus dans '.$type_objet_contenant.' '.$id_objet_contenant.' :', 'liens_contenus');
15
16    $liens_trouves = array();
17
18        // Types et aliases
19        $liens_contenus_types = array('article', 'breve', 'rubrique', 'auteur', 'document', 'mot', 'syndic');
20        $liens_contenus_aliases = array('art' => 'article', 'br' => 'breve', 'brève' => 'breve', 'rub' => 'rubrique', 'aut' => 'auteur', 'doc' => 'document', 'im' => 'document', 'img' => 'document', 'image' => 'document', 'emb' => 'document', 'mot' => 'mot', 'site' => 'syndic');
21
22        // Effacer les liens connus
23        spip_query("DELETE FROM spip_liens_contenus WHERE type_objet_contenant="._q($type_objet_contenant)." AND id_objet_contenant="._q($id_objet_contenant));
24       
25        // Echapper les <a href>, <html>...< /html>, <code>...< /code>
26        include_spip('inc/texte');
27        $contenu = echappe_html($contenu);
28
29        // Raccourcis de liens [xxx->url]
30        $regexp = ',\[([^][]*)->(>?)([^]]*)\],msS';
31        if (preg_match_all($regexp, $contenu, $matches, PREG_SET_ORDER)) {
32                foreach ($matches as $match) {
33                        $lien = trim($match[3]);
34                        if (preg_match(',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S', $lien, $match)) {
35                                list(, $type_objet_contenu, $id_objet_contenu, $params, $ancre) = $match;
36                                // article par defaut
37                                if (!$type_objet_contenu) $type_objet_contenu = 'article';
38                                $type_objet_contenu = isset($liens_contenus_aliases[$type_objet_contenu]) ? $liens_contenus_aliases[$type_objet_contenu] : $type_objet_contenu;
39                                if (in_array($type_objet_contenu, $liens_contenus_types)) {
40                                    $liens_trouves[$type_objet_contenu.' '.$id_objet_contenu] = array('type' => $type_objet_contenu, 'id' =>$id_objet_contenu);
41                                }
42                        }
43                }
44        }
45
46        // Raccourcis d'insertion de modeles
47        $regexp = '/<([a-z_-]{3,})\s*([0-9]+)?([|][^>]*)*>/iS';
48    // La regex de inc/texte n'est pas exploitable directement
49    // $regexp = '/'._RACCOURCI_MODELE.'/iS';
50        if (preg_match_all($regexp, $contenu, $matches, PREG_SET_ORDER)) {
51                foreach ($matches as $match) {
52                        list($chaine_modele ,$type_objet_contenu, $id_objet_contenu, $params) = $match;
53                        $type_objet_contenu = isset($liens_contenus_aliases[$type_objet_contenu]) ? $liens_contenus_aliases[$type_objet_contenu] : $type_objet_contenu;
54            $nouveau_lien = true;
55            switch ($type_objet_contenu) {
56                case 'article':
57                case 'rubrique':
58                case 'breve':
59                case 'syndic':
60                case 'auteur':
61                case 'mot':
62                    // Les elements de base de SPIP ont des pseudo modeles automatiques
63                    break;
64                case 'document':
65                    if ($type_objet_contenant == 'article' || $type_objet_contenant == 'rubrique') {
66                        $query = 'SELECT COUNT(*) AS nb FROM spip_documents_'.$type_objet_contenant.'s WHERE id_document='.$id_objet_contenu.' AND id_'.$type_objet_contenant.'='.$id_objet_contenant;
67                        $res = spip_query($query);
68                        $row = spip_fetch_array($res);
69                        if ($row['nb'] == 1) {
70                            // Si le doc est rattache a l'article ou la rubrique courant, on ne doit pas le comptabiliser
71                            $nouveau_lien = false;
72                        }
73                    }
74                    break;
75                case 'form':
76                    // Soyons gentil avec le plugin Forms s'il est activŽ
77                    if (defined('_DIR_PLUGIN_FORMS')) {
78                        break;
79                    }
80                default:
81                    if ($id_objet_contenu != '' || $params != '') {
82                        // C'est a priori un modele
83                        $params = array_filter(explode('|', strtolower($params)));
84                        if ($params) {
85                            list(, $soustype) = each($params);
86                            if (in_array($soustype, array('left', 'right', 'center'))) {
87                                list(, $soustype) = each($params);
88                            }
89                            if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
90                                if (find_in_path('modeles/'.$type_objet_contenu.'_'.$soustype.'.html')) {
91                                    // C'est un modele compose
92                                    $id_objet_contenu = $type_objet_contenu.'_'.$soustype;
93                                    $type_objet_contenu = 'modele';
94                                } elseif (find_in_path('modeles/'.$type_objet_contenu.'.html')) {
95                                    // C'est un modele simple
96                                    $id_objet_contenu = $type_objet_contenu;
97                                    $type_objet_contenu = 'modele';
98                                } else {
99                                    // C'est cense etre un modele, mais on ne le trouve pas
100                                    $id_objet_contenu = $type_objet_contenu;
101                                    $type_objet_contenu = 'modele';
102                                }
103                            }
104                        } elseif (find_in_path('modeles/'.$type_objet_contenu.'.html')) {
105                            // C'est un modele simple
106                            $id_objet_contenu = $type_objet_contenu;
107                            $type_objet_contenu = 'modele';
108                        } else {
109                            // C'est cense etre un modele, mais on ne le trouve pas
110                            $id_objet_contenu = $type_objet_contenu;
111                            $type_objet_contenu = 'modele';
112                        }
113                    } else {
114                        // Ce n'est pas un modele, sans doute un de <quote>, <poesie>, <html>, <code>, <cadre>, etc.
115                        $nouveau_lien = false;
116                    }
117            }
118            if ($nouveau_lien) {
119                $liens_trouves[$type_objet_contenu.' '.$id_objet_contenu] = array('type' => $type_objet_contenu, 'id' =>$id_objet_contenu);
120            }
121                }
122        }
123        if (count($liens_trouves) > 0) {
124           foreach ($liens_trouves as $lien) {
125            //spip_log('- lien '.$type_objet_contenant.' '.$id_objet_contenant.' vers '.$lien['type'].' '.$lien['id'], 'liens_contenus');
126            include_spip('base/abstract_sql');
127            spip_abstract_insert(
128                'spip_liens_contenus',
129                '(type_objet_contenant, id_objet_contenant, type_objet_contenu, id_objet_contenu)',
130                '('._q($type_objet_contenant).','._q($id_objet_contenant).','._q($lien['type']).','._q($lien['id']).')');
131           }
132        } else {
133        //spip_log('- aucun lien', 'liens_contenus');
134        }
135}
136
137// (re)initialisation de la table des liens
138function lienscontenus_initialiser()
139{
140        // vider la table
141        spip_query("DELETE FROM spip_liens_contenus");
142       
143        include_spip('inc/indexation');
144        $liste_tables = liste_index_tables();
145
146        // parcourir les tables et les champs
147        foreach ($liste_tables as $table) {
148                $type_objet_contenant = ereg_replace("^spip_(.*[^s])s?$", "\\1", $table);
149                $col_id = primary_index_table($table);
150        if ($res = spip_query("SELECT * FROM $table")) {
151            while ($row = spip_fetch_array($res)) {
152                $id_objet_contenant = $row[$col_id];
153                // implode() n'est pas forcement le plus propre conceptuellement, mais ca doit convenir et c'est rapide
154                lienscontenus_referencer_liens($type_objet_contenant, $id_objet_contenant, implode(' ', $row));
155            }
156        }
157        }
158}
159
160function lienscontenus_boite_liste($type_objet, $id_objet)
161{
162    $data = "\n";
163    $data .= debut_cadre_relief('../'._DIR_PLUGIN_LIENS_CONTENUS.'/images/liens_contenus-24.gif', true);
164    include_spip('public/assembler');
165        $contexte = array('type_objet' => $type_objet, 'id_objet' => $id_objet);
166        $data .= recuperer_fond('exec/lienscontenus_liste', $contexte);
167    $data .= fin_cadre_relief(true);
168    return $data;
169}
170
171function lienscontenus_verification()
172{
173    $data = '<script language="javascript" type="text/javascript">' .
174                'var messageConfirmationChangementStatut="'._T('lienscontenus:confirmation_depublication').'";' .
175                'var messageConfirmationSuppression="'._T('lienscontenus:confirmation_suppression').'";' .
176                '</script>';
177    return $data;
178}
179
180function lienscontenus_verification_articles()
181{
182    $data = lienscontenus_verification();
183    $script = <<<EOS
184        <script language="javascript" type="text/javascript">
185        $(document).ready(function() {
186            // on recupere le statut actuel et le code par defaut du onchange
187            var initialStatut = $('select[@name=statut_nouv] > option[@selected]').attr('value');
188            var currentStatut = initialStatut;
189            var select = $('select[@name=statut_nouv]')[0];
190            var currentOnChange = select.onchange;
191       
192            // on supprime le onchange par defaut
193            select.onchange = null;
194       
195            // on gere un onchange specifique
196            $('select[@name=statut_nouv]').bind('change', function(event) {
197                // Si le statut initial etait "publie" et s'il y a au moins un contenu publie qui pointe vers lui, on demande confirmation
198                if ((initialStatut == 'publie') && (currentStatut == 'publie') && ($('#liens_contenus_contenants > li.publie').size() > 0)) {
199                    if (confirm(messageConfirmationChangementStatut)) {
200                        // changement confirme
201                        var newStatut = $('select[@name=statut_nouv] > option[@selected]').attr('value');
202                        currentStatut = newStatut;
203                        // on execute le onchange initial
204                        currentOnChange.apply(this);
205                    } else {
206                        // on ne change pas, finalement
207                        $('select[@name=statut_nouv] > option[@selected]').removeAttr('selected');
208                        $('select[@name=statut_nouv] > option[@value=publie]').attr('selected', 'selected');
209                    }
210                } else {
211                    // pas de probleme pour changer
212                    var newStatut = $('select[@name=statut_nouv] > option[@selected]').attr('value');
213                    currentStatut = newStatut;
214                    // on execute le onchange initial
215                            currentOnChange.apply(this);
216                        }
217                    });
218                });
219                </script>
220EOS;
221    $data .= $script;
222    return $data;
223}
224
225function lienscontenus_verification_breves_edit()
226{
227    $data = lienscontenus_verification();
228    $script = <<<EOS
229        <script language="javascript" type="text/javascript">
230        $(document).ready(function() {
231            // on recupere le statut actuel
232            if ($('select[@name=statut]')) {
233                var initialStatut = $('select[@name=statut] > option[@selected]').attr('value');
234                var currentStatut = initialStatut;
235           
236                // on gere un onchange specifique
237                $('select[@name=statut]').bind('change', function(event) {
238                    // Si le statut initial etait "publie" et s'il y a au moins un contenu publie qui pointe vers lui, on demande confirmation
239                    if ((initialStatut == 'publie') && (currentStatut == 'publie') && ($('#liens_contenus_contenants > li.publie').size() > 0)) {
240                        if (confirm(messageConfirmationChangementStatut)) {
241                            var newStatut = $('select[@name=statut] > option[@selected]').attr('value');
242                            currentStatut = newStatut;
243                        } else {
244                            $('select[@name=statut] > option[@selected]').removeAttr('selected');
245                            $('select[@name=statut] > option[@value=publie]').attr('selected', 'selected');
246                        }
247                    } else {
248                        var newStatut = $('select[@name=statut] > option[@selected]').attr('value');
249                                currentStatut = newStatut;
250                            }
251                        });
252                    }
253                });
254                </script>
255EOS;
256    $data .= $script;
257    return $data;
258}
259
260function lienscontenus_verification_sites()
261{
262    $data = lienscontenus_verification();
263    $script = <<<EOS
264        <script language="javascript" type="text/javascript">
265        $(document).ready(function() {
266            // on recupere le statut actuel
267            if ($('select[@name=nouveau_statut]')) {
268                var initialStatut = $('select[@name=nouveau_statut] > option[@selected]').attr('value');
269                var currentStatut = initialStatut;
270           
271                // on gere un onchange specifique
272                $('select[@name=nouveau_statut]').bind('change', function(event) {
273                    // Si le statut initial etait "publie" et s'il y a au moins un contenu publie qui pointe vers lui, on demande confirmation
274                    if ((initialStatut == 'publie') && (currentStatut == 'publie') && ($('#liens_contenus_contenants > li.publie').size() > 0)) {
275                        if (confirm(messageConfirmationChangementStatut)) {
276                            var newStatut = $('select[@name=nouveau_statut] > option[@selected]').attr('value');
277                            currentStatut = newStatut;
278                        } else {
279                            $('select[@name=nouveau_statut] > option[@selected]').removeAttr('selected');
280                            $('select[@name=nouveau_statut] > option[@value=publie]').attr('selected', 'selected');
281                        }
282                    } else {
283                        var newStatut = $('select[@name=nouveau_statut] > option[@selected]').attr('value');
284                        currentStatut = newStatut;
285                    }
286                });
287            }
288        });
289        </script>
290EOS;
291    $data .= $script;
292    return $data;
293}
294
295function lienscontenus_verification_auteur_infos()
296{
297    $data = lienscontenus_verification();
298    $script = <<<EOS
299        <script language="javascript" type="text/javascript">
300        $(document).ready(function() {
301            // on recupere le statut actuel
302            if ($('select[@name=statut]')) {
303                var initialStatut = $('select[@name=statut] > option[@selected]').attr('value');
304                var currentStatut = initialStatut;
305           
306                // on gere un onchange specifique
307                $('select[@name=statut]').bind('change', function(event) {
308                    // Si le statut initial n'etait pas "5poubelle" et s'il y a au moins un contenu publie qui pointe vers lui, on demande confirmation
309                    var newStatut = $('select[@name=statut] > option[@selected]').attr('value');
310                    if ((initialStatut != '5poubelle') && (newStatut == '5poubelle') && ($('#liens_contenus_contenants > li.publie').size() > 0)) {
311                        if (confirm(messageConfirmationChangementStatut)) {
312                            currentStatut = newStatut;
313                        } else {
314                            $('select[@name=statut] > option[@selected]').removeAttr('selected');
315                            $('select[@name=statut] > option[@value='+currentStatut+']').attr('selected', 'selected');
316                        }
317                    } else {
318                        currentStatut = newStatut;
319                    }
320                });
321            }
322        });
323        </script>
324EOS;
325    $data .= $script;
326    return $data;
327}
328
329function lienscontenus_verification_mots_tous()
330{
331    // TODO : A finir...
332    $data = lienscontenus_verification();
333    $script = <<<EOS
334        <style>a.lienscontenus_oui { color: red; text-decoration: line-through; }</style>
335        <script language="javascript" type="text/javascript">
336        $(document).ready(function() {
337            function gestionDesSuppressionsDeMots() {
338                // on ajoute une classe specifique
339                $('tr.tr_liste').each(function() {
340                    var idMot = $(this).find('td:first-child > a').attr('href').replace(/^.*&id_mot=([0-9]+)&.*$/g, '$1');
341                    // on recupere "oui" si un autre contenu pointe vers le mot, "non" sinon
342                    var motContenu = $.ajax({
343                        url: '?exec=lienscontenus_ajax_mot_contient',
344                        data: 'id_mot='+idMot+'&var_ajaxcharset=utf-8',
345                        async: false,
346                        dataType: 'xml'
347                        }).responseText;
348                    motContenu = $(motContenu).text();
349                    $(this).find('td:last-child > div > a').addClass('lienscontenus_' + motContenu);
350                });
351                // on ne s'interesse qu'aux mots vers lesquels pointent d'autres contenus
352                $('tr.tr_liste > td > div > a.lienscontenus_oui').each(function() {
353                    if (this.onclick) {
354                        originalOnClick = this.onclick;
355                        this.onclick = null;
356                    } else {
357                        originalOnClick = null;
358                    }
359                    $(this).bind('click', {origclick: originalOnClick}, handleClick);
360                    function handleClick(event)
361                    {
362                        if (confirm(messageConfirmationSuppression)) {
363                            if(event.data.origclick) {
364                                event.data.origclick.apply(this);
365                                // On relance la detection apres la mise a jour
366                                // TODO : executer apres le AjaxSqueeze de origclick, qui est asynchrone !
367                                gestionDesSuppressionsDeMots();
368                                return false;
369                            } else {
370                                // Si on n'a pas de onclick a l'origine, c'est que le href doit etre suivi
371                                return true;
372                            }
373                        } else {
374                            return false;
375                        }
376                    }
377                });
378            }
379            gestionDesSuppressionsDeMots();
380            // TODO : comment intercepter la modification de ces divs par AjaxSqueeze ?
381            $('div[@id^=editer_mot-]').bind('change', function() { gestionDesSuppressionsDeMots() });
382        });
383        </script>
384EOS;
385    $data .= $script;
386    return $data;
387}
388?>
Note: See TracBrowser for help on using the repository browser.