source: spip-zone/_plugins_/modeles_media/inc/marquer_doublons_doc.php @ 53439

Last change on this file since 53439 was 53439, checked in by yffic@…, 10 years ago

if (!defined("_ECRIRE_INC_VERSION")) return; sur tout fichier PHP pour sécurité future principalement

File size: 5.6 KB
Line 
1<?php
2/*
3 * Surcharge pour identifier également les modèles <media> en attendant une solution plus élégante (pipeline adéquat par exemple)
4 *
5 */
6if (!defined("_ECRIRE_INC_VERSION")) return;
7
8// On liste tous les champs susceptibles de contenir des documents ou images si on veut que ces derniers soient lies a l objet lorsqu on y fait reference par imgXX docXX ou embXX ou mediaXX
9$GLOBALS['medias_liste_champs'][] = 'texte';
10$GLOBALS['medias_liste_champs'][] = 'chapo';
11 
12// http://doc.spip.org/@marquer_doublons_documents
13function inc_marquer_doublons_doc($champs,$id,$type,$id_table_objet,$table_objet,$spip_table_objet, $desc=array(), $serveur=''){
14        $champs_selection=array();
15                foreach ($GLOBALS['medias_liste_champs'] as $champs_choisis) {
16                        if ( isset($champs[$champs_choisis]) )
17                        array_push($champs_selection,$champs_choisis);
18                }
19        if (count($champs_selection) == 0)
20                return;
21        if (!$desc){
22                $trouver_table = charger_fonction('trouver_table', 'base');
23                $desc = $trouver_table($table_objet, $serveur);
24        }
25        $load = "";
26        // charger le champ manquant en cas de modif partielle de l     'objet
27        // seulement si le champ existe dans la table demande
28       
29                foreach ($champs_selection as $champs_a_parcourir) {
30                        if (isset($desc['field'][$champs_a_parcourir])) {
31                        $load = $champs_a_parcourir;
32                        $champs_a_traiter .= $champs[$champs_a_parcourir];
33                        }
34                }       
35
36        if ($load){
37                $champs[$load] = "";
38                $row = sql_fetsel($load, $spip_table_objet, "$id_table_objet=".sql_quote($id));
39                if ($row AND isset($row[$load]))
40                        $champs[$load] = $row[$load];
41        }
42        include_spip('inc/texte');
43        include_spip('base/abstract_sql');
44        $GLOBALS['doublons_documents_inclus'] = array();
45        media_traiter_modeles($champs_a_traiter,true); // detecter les doublons avec une version modifiée de traiter_modeles
46        sql_updateq("spip_documents_liens", array("vu" => 'non'), "id_objet=$id AND objet=".sql_quote($type));
47        if (count($GLOBALS['doublons_documents_inclus'])){
48                // on repasse par une requete sur spip_documents pour verifier que les documents existent bien !
49                $in_liste = sql_in('id_document',
50                        $GLOBALS['doublons_documents_inclus']);
51                $res = sql_select("id_document", "spip_documents", $in_liste);
52                while ($row = sql_fetch($res)) {
53                        // Creer le lien s'il n'existe pas deja
54                        sql_insertq("spip_documents_liens", array('id_objet'=>$id, 'objet'=>$type, 'id_document' => $row['id_document'], 'vu' => 'oui'));
55                        sql_updateq("spip_documents_liens", array("vu" => 'oui'), "id_objet=$id AND objet=".sql_quote($type)." AND id_document=" . $row['id_document']);
56                }
57        }
58}
59
60// Hack pour identifier aussi les modèles <media>
61
62function media_traiter_modeles($texte, $doublons=false, $echap='', $connect='', $liens = null) {
63        // preserver la compatibilite : true = recherche des documents
64        if ($doublons===true)
65                $doublons = array('documents'=>array('doc','emb','img','image','audio','application','video','text','media'));
66        // detecter les modeles (rapide)
67        if (strpos($texte,"<")!==false AND
68          preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER)) {
69                include_spip('public/assembler');
70                foreach ($matches as $match) {
71                        // Recuperer l'appel complet (y compris un eventuel lien)
72
73                        $a = strpos($texte,$match[0]);
74                        preg_match(_RACCOURCI_MODELE_DEBUT,
75                        substr($texte, $a), $regs);
76                        $regs[]=""; // s'assurer qu'il y a toujours un 5e arg, eventuellement vide
77                        list(,$mod, $type, $id, $params, $fin) = $regs;
78                        if ($fin AND
79                        preg_match('/<a\s[^<>]*>\s*$/i',
80                                        substr($texte, 0, $a), $r)) {
81                                $lien = array(
82                                        'href' => extraire_attribut($r[0],'href'),
83                                        'class' => extraire_attribut($r[0],'class'),
84                                        'mime' => extraire_attribut($r[0],'type')
85                                );
86                                $n = strlen($r[0]);
87                                $a -= $n;
88                                $cherche = $n + strlen($regs[0]);
89                        } else {
90                                $lien = false;
91                                $cherche = strlen($mod);
92                        }
93
94                        // calculer le modele
95                        # hack articles_edit, breves_edit, indexation
96                        if ($doublons)
97                                $texte .= preg_replace(',[|][^|=]*,s',' ',$params);
98                        # version normale
99                        else {
100                                // si un tableau de liens a ete passe, reinjecter le contenu d'origine
101                                // dans les parametres, plutot que les liens echappes
102                                if (!is_null($liens))
103                                        $params = str_replace($liens[0], $liens[1], $params);
104                          $modele = inclure_modele($type, $id, $params, $lien, $connect);
105                                // en cas d'echec,
106                                // si l'objet demande a une url,
107                                // creer un petit encadre vers elle
108                                if ($modele === false) {
109                                        if (!$lien)
110                                                $lien = traiter_lien_implicite("$type$id", '', 'tout', $connect);
111                                        if ($lien)
112                                                $modele = '<a href="'
113                                                  .$lien['url']
114                                                  .'" class="spip_modele'
115                                                  . '">'
116                                                  .sinon($lien['titre'], _T('ecrire:info_sans_titre'))
117                                                  ."</a>";
118                                        else {
119                                                $modele = "";
120                                                if (test_espace_prive()) {
121                                                        $modele = entites_html(substr($texte,$a,$cherche));
122                                                        if (!is_null($liens))
123                                                                $modele = "<pre>".str_replace($liens[0], $liens[1], $modele)."</pre>";
124                                                }
125                                        }
126                                }
127                                // le remplacer dans le texte
128                                if ($modele !== false) {
129                                        $modele = protege_js_modeles($modele);
130                                        $rempl = code_echappement($modele, $echap);
131                                        $texte = substr($texte, 0, $a)
132                                                . $rempl
133                                                . substr($texte, $a+$cherche);
134                                }
135                        }
136
137                        // hack pour tout l'espace prive
138                        if (((!_DIR_RESTREINT) OR ($doublons)) AND ($id)){
139                                foreach($doublons?$doublons:array('documents'=>array('doc','emb','img','image','audio','application','video','text','media')) as $quoi=>$modeles)
140                                        if (in_array($type,$modeles))
141                                                $GLOBALS["doublons_{$quoi}_inclus"][] = $id;
142                        }
143                }
144        }
145
146        return $texte;
147}
148
149
150?>
Note: See TracBrowser for help on using the repository browser.