source: spip-zone/_core_/plugins/urls_etendues/action/editer_url.php @ 95586

Last change on this file since 95586 was 95586, checked in by brunobergot@…, 4 years ago

translitteration() applique corriger_carracteres() par défaut, pas la peine de doublonner cf #3624

File size: 7.8 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2016                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) {
14        return;
15}
16
17function action_editer_url_dist() {
18
19        // Rien a faire ici pour le moment
20        #$securiser_action = charger_fonction('securiser_action', 'inc');
21        #$arg = $securiser_action();
22
23}
24
25
26function url_nettoyer($titre, $longueur_maxi, $longueur_min = 0, $separateur = '-', $filtre = '') {
27
28        $titre = supprimer_tags(supprimer_numero(extraire_multi($titre)));
29        $url = translitteration($titre);
30
31        if ($filtre) {
32                $url = $filtre($url);
33        }
34
35        // on va convertir tous les caracteres de ponctuation et espaces
36        // a l'exception de l'underscore (_), car on veut le conserver dans l'url
37        $url = str_replace('_', chr(7), $url);
38        $url = @preg_replace(',[[:punct:][:space:]]+,u', ' ', $url);
39        $url = str_replace(chr(7), '_', $url);
40
41        // S'il reste trop de caracteres non latins, les gerer comme wikipedia
42        // avec rawurlencode :
43        if (preg_match_all(",[^a-zA-Z0-9 _]+,", $url, $r, PREG_SET_ORDER)) {
44                foreach ($r as $regs) {
45                        $url = substr_replace($url, rawurlencode($regs[0]),
46                                strpos($url, $regs[0]), strlen($regs[0]));
47                }
48        }
49
50        // S'il reste trop peu, renvoyer vide
51        if (strlen($url) < $longueur_min) {
52                return '';
53        }
54
55        // Sinon couper les mots et les relier par des $separateur
56        $mots = preg_split(",[^a-zA-Z0-9_%]+,", $url);
57        $url = '';
58        foreach ($mots as $mot) {
59                if (!strlen($mot)) {
60                        continue;
61                }
62                $url2 = $url . $separateur . $mot;
63
64                // Si on depasse $longueur_maxi caracteres, s'arreter
65                // ne pas compter 3 caracteres pour %E9 mais un seul
66                $long = preg_replace(',%.,', '', $url2);
67                if (strlen($long) > $longueur_maxi) {
68                        break;
69                }
70
71                $url = $url2;
72        }
73        $url = substr($url, 1);
74
75        // On enregistre en utf-8 dans la base
76        $url = rawurldecode($url);
77
78        if (strlen($url) < $longueur_min) {
79                return '';
80        }
81
82        return $url;
83}
84
85function url_insert(&$set, $confirmer, $separateur) {
86        $has_parent = true;
87        # assurer la coherence des champs techniques si non fournis
88        if (!isset($set['id_parent'])) {
89                $has_parent = false;
90                $set['id_parent'] = 0;
91        }
92        if (!isset($set['segments'])) {
93                $set['segments'] = count(explode('/', $set['url']));
94        }
95        $perma = false;
96        if (isset($set['perma']) and $set['perma']) {
97                unset($set['perma']);
98                $perma = true;
99        }
100        $redate = true;
101
102        # le separateur ne peut pas contenir de /
103        if (strpos($separateur, '/') !== false) {
104                $separateur = "-";
105        }
106
107        // Si l'insertion echoue, c'est une violation d'unicite.
108        $where_urllike = 'url LIKE ' . url_sql_quote_like($set['url']) . " AND NOT(type=" . sql_quote($set['type']) . " AND id_objet=" . intval($set['id_objet']) . ")";
109        $where_thisurl = $where_urllike . ($has_parent ? " AND id_parent=" . intval($set['id_parent']) : "");
110        if (
111                // si pas de parent defini, il faut que cette url soit unique, independamment de id_parent
112                // il faut utiliser un LIKE pour etre case unsensitive en sqlite
113                (!$has_parent and sql_countsel("spip_urls", $where_urllike))
114                or @sql_insertq('spip_urls', $set) <= 0
115        ) {
116
117                // On veut chiper une ancienne adresse ou prendre celle d'un repertoire deja present?
118                if (
119                        (!is_dir(_DIR_RACINE . $set['url']) and !file_exists(_DIR_RACINE . $set['url']))
120                        // un vieux url
121                        and $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl, '', 'perma DESC')
122                        // qui n'est pas permanente
123                        and !$vieux['perma']
124                        // et dont l'objet a une url plus recente
125                        and $courant = sql_fetsel('*', 'spip_urls',
126                                'type=' . sql_quote($vieux['type']) . ' AND id_objet=' . sql_quote($vieux['id_objet'])
127                                . ' AND url<>' . sql_quote($set['url'])
128                                . ' AND date>' . sql_quote($vieux['date']), '', 'date DESC', 1)
129                ) {
130                        if ($confirmer and !_request('ok2')) {
131                                die("Vous voulez chiper l'URL de l'objet " . $courant['type'] . " "
132                                        . $courant['id_objet'] . " qui a maintenant l'url "
133                                        . $courant['url']);
134                        }
135                        $where_thisurl = "url=" . sql_quote($vieux['url']) . " AND id_parent=" . intval($vieux['id_parent']);
136                        // si oui on le chipe
137                        sql_updateq('spip_urls', $set, $where_thisurl);
138                        sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl);
139                        spip_log("reattribue url " . $vieux['url']
140                                . " de " . $vieux['type'] . "#" . $vieux['id_objet'] . " (parent " . $vieux['id_parent'] . ")"
141                                . " A " . $set['type'] . "#" . $set['id_objet'] . " (parent " . $set['id_parent'] . ")",
142                                "urls" . _LOG_INFO_IMPORTANTE);
143                } // Sinon
144                else {
145
146                        // Soit c'est un Come Back d'une ancienne url propre de l'objet
147                        // Soit c'est un vrai conflit. Rajouter l'ID jusqu'a ce que ca passe,
148                        // mais se casser avant que ca ne casse.
149
150                        // il peut etre du a un changement de casse de l'url simplement
151                        // pour ce cas, on reecrit systematiquement l'url en plus d'actualiser la date
152                        $where = "type=" . sql_quote($set['type'])
153                                . " AND id_objet=" . intval($set['id_objet'])
154                                . " AND id_parent=" . intval($set['id_parent'])
155                                . " AND url LIKE ";
156                        if (
157                                !is_dir(_DIR_RACINE . $set['url']) and !file_exists(_DIR_RACINE . $set['url'])
158                                and sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))
159                        ) {
160                                sql_updateq('spip_urls', array('url' => $set['url'], 'date' => date('Y-m-d H:i:s')),
161                                        $where . url_sql_quote_like($set['url']));
162                                spip_log("reordonne " . $set['type'] . " " . $set['id_objet'], "urls");
163                                $redate = false;
164                        } else {
165                                $set['url'] .= $separateur . $set['id_objet'];
166                                if (strlen($set['url']) > 200) //serveur out ? retourner au mieux
167                                {
168                                        return false;
169                                } elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) {
170                                        sql_updateq('spip_urls', array('url' => $set['url'], 'date' => date('Y-m-d H:i:s')),
171                                                $where . url_sql_quote_like($set['url']));
172                                        $redate = false;
173                                } else {
174                                        // remettre id_parent et perma comme il faut si besoin
175                                        if (!$has_parent) {
176                                                unset($set['id_parent']);
177                                        }
178                                        if ($perma) {
179                                                $set['perma'] = true;
180                                        }
181
182                                        return url_insert($set, $confirmer, $separateur);
183                                }
184                        }
185                }
186        }
187
188        $where_thisurl = 'url=' . sql_quote($set['url']) . " AND id_parent=" . intval($set['id_parent']); // maj
189        if ($redate) {
190                sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl);
191        }
192
193        // si url perma, poser le flag sur la seule url qu'on vient de mettre
194        if ($perma) {
195                sql_update('spip_urls', array('perma' => "($where_thisurl)"),
196                        "type=" . sql_quote($set['type']) . " AND id_objet=" . intval($set['id_objet']));
197        }
198
199        spip_log("Creation de l'url propre '" . $set['url'] . "' pour " . $set['type'] . " " . $set['id_objet'] . " (parent " . $set['id_parent'] . " perma " . ($perma ? "1" : "0") . ")",
200                "urls");
201
202        return true;
203}
204
205function url_sql_quote_like($url) {
206        return sql_quote(str_replace(array("%", "_"), array("\\%", "\\_"), $url)) . " ESCAPE " . sql_quote('\\');
207}
208
209function url_verrouiller($objet, $id_objet, $url) {
210        $where = "id_objet=" . intval($id_objet) . " AND type=" . sql_quote($objet);
211        $where .= " AND url=" . sql_quote($url);
212
213        // pour verrouiller une url, on fixe sa date dans le futur, dans 10 ans
214        sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s', time() + 10 * 365.25 * 24 * 3600)), $where);
215}
216
217function url_delete($objet, $id_objet, $url = "") {
218        $where = "id_objet=" . intval($id_objet) . " AND type=" . sql_quote($objet);
219        if (strlen($url)) {
220                $where .= " AND url=" . sql_quote($url);
221        }
222
223        sql_delete("spip_urls", $where);
224}
Note: See TracBrowser for help on using the repository browser.