source: spip-zone/_plugins_/urls_pages/trunk/formulaires/editer_url_page.php @ 99665

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

v1.0.0 : premier jet d'une nouvelle version complètement refactorisée, et toujours aussi expérimentale.
Désolé pour le gros commit en 1 seule fois.

Les URLs des pages ne sont plus stockées dans le meta du plugin, mais dans le table spip_urls comme les autres URLs, avec type=, id_objet=0.
On ajoute une colonne 'page' utilisée uniquement pour les URLs des pages.
La migration est effectuée automatiquement lors de la mise à jour du plugin. Seules les URLs éventuellement non migrées (doublon dans la BDD) sont conservées dans la meta urls_pages. Réfléchir à leur prise en charge (message sur la page de gestion des URLs ?).

Le gros avantage de cette version, c'est qu'on à plus besoin de modifier le htaccess, ni d'indiquer le rewritebase dans la configuration.
On a juste à saisir une URL, et c'est tout.
De plus, on peut rentrer manuellement les pages, on ne se repose pas sur la détection automatique des squelettes, qui n'est donnée qu'à titre indicatif.

La fonction qui détecte les fonds de page a été refactorisée et migrée pour être utilisée dans une boucle DATA : <BOUCLE_fonds(DATA){source fonds_pages}>.
Par défaut, une boucle <BOUCLE_urls(URLS)> ne retourne pas les URLs des pages, à moins d'utiliser le critère {tout}.

On est obligé de surcharger la fonction urls_propres_dist() pour prendre en compte les pages, faute de pipeline.
Néammoins, la fonction dist est toujours utilisée pour tout autre URL que les pages.

Les URLs des pages sont gérées à partir du menu des URLs : publication -> gestion des URLs. On ajoute un menu sur cette page pour basculer entre la gestion des URLs des objets éditoriaux, et celle des URLs des pages.

Cette version est compatible SPIP >= 3.1

C'est un premier jet donc, il reste quelques pétouilles à finir.
À tester, mais pas en production !

File size: 4.7 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7/**
8 * Chargement des donnees du formulaire
9 *
10 * @param string $page
11 *     Vide pour créer une nouvelle URL
12 *     Nom d'une page pour éditer son URL
13 * @param string $redirect
14 * @return array
15 */
16function formulaires_editer_url_page_charger($page = '', $redirect = '') {
17
18        // Valeurs de base
19        $valeurs    = array();
20        $page       = trim($page);
21        $mode       = ($page ? 'modifier' : 'creer');
22        $page_loked = false;
23
24        // Valeurs selon qu'on modifie ou crée une URL
25        switch ($mode){
26
27                case 'modifier' :
28                        $url = sql_getfetsel(
29                                'url',
30                                'spip_urls',
31                                array(
32                                        'page = '.sql_quote($page),
33                        ));
34                        $fond        = trouver_fond_page($page);
35                        $page_locked = true; // interdire de modifier le champ page
36                        if (!$fond ){
37                                $message_erreur = _T('urls_pages:erreur_fond_absent_page', array('page' => $page));
38                        }
39                        break;
40
41                case 'creer' :
42                        $url  = '';
43                        $fond = '';
44                        break;
45        }
46
47        // Valeurs renvoyées
48        if (isset($message_erreur)
49                and $message_erreur
50        ){
51                $valeurs['message_erreur'] = $message_erreur;
52                $valeurs['editable'] = false;
53        }
54        $valeurs = array_merge($valeurs, array(
55                'page'        => $page,
56                'url'         => $url,
57                'page_locked' => $page_locked,
58                'page_fond'   => $fond,
59        ));
60
61        return $valeurs;
62}
63
64
65/**
66 * Vérifier les valeurs postées
67 *
68 * @param string $page
69 *     Vide pour créer une nouvelle URL
70 *     Nom d'une page pour éditer son URL
71 * @param string $redirect
72 * @return array
73 */
74function formulaires_editer_url_page_verifier($page = '', $redirect = '') {
75        $erreurs = array();
76
77        include_spip('action/editer_url');
78        $creation = !strlen($page);
79        $page     = trim(_request('page'));
80        $url      = trim(_request('url'));
81
82        // PAGE
83        // ====
84        // Page obligatoire
85        if (!$page) {
86                $erreurs['page'] = _T('info_obligatoire');
87        }
88        // Format de la page incorrect
89        elseif (!preg_match('/^([-\.\w]+)$/', $page)) {
90                $erreurs['page'] = _T('urls_pages:erreur_page_mauvais_format');
91        }
92        // Page correspondant à objet éditorial
93        elseif ($objets = lister_objets_types()
94                and $objets_split = join('|', $objets)
95                and $regex_objets = "/^($objets_split)([\-=_][0-9a-zA-Z]+)?$/"
96                and preg_match($regex_objets, $page)
97        ) {
98                $erreurs['page'] = _T('urls_pages:erreur_page_fond_objet_editorial');
99        }
100        // Création : URL de la page déjà enregistrée
101        elseif ($creation
102                and $url_bdd = sql_getfetsel('url', 'spip_urls', array('page = '.sql_quote($page)))
103        ) {
104                $erreurs['page'] = _T('urls_pages:erreur_page_doublon_url', array('url' => $url_bdd));
105        }
106        // Squelette de la page absent
107        elseif (!$fond = trouver_fond_page($page)) {
108                $erreurs['page'] = _T('urls_pages:erreur_page_fond_absent');
109        }
110
111        // URL
112        // ===
113        // URL obligatoire
114        if (!$url) {
115                $erreurs['url'] = _T('info_obligatoire');
116        }
117        // Format URL incorrect
118        elseif ($url != ($url_clean = url_nettoyer($url, 255))) {
119                set_request('url', $url_clean);
120                $erreurs['url'] = _T('urls:verifier_url_nettoyee');
121        }
122        // URL en doublon (peut importe l'objet)
123        elseif (sql_countsel('spip_urls', array('url = '.sql_quote($url), 'page != '.sql_quote($page)))){
124                $erreurs['url'] = _T('urls_pages:erreur_url_doublon');
125        }
126
127        return $erreurs;
128}
129
130/**
131 * Traitement
132 *
133 * @param string $page
134 *     Vide pour créer une nouvelle URL
135 *     Nom d'une page pour éditer son URL
136 * @param string $redirect
137 * @return array
138 */
139function formulaires_editer_url_page_traiter($page = '', $redirect = '') {
140
141        // Pas d'ajax si redirection
142        if ($redirect) {
143                refuser_traiter_formulaire_ajax();
144        }
145
146        $res  = array();
147        $page = trim(_request('page'));
148        $url  = trim(_request('url'));
149        $mode = (sql_countsel('spip_urls', array('page = '.sql_quote($page))) ? 'modifier' : 'creer');
150        $set  = array(
151                'page' => $page,
152                'url'  => $url,
153        );
154
155        // Actions BDD
156        switch ($mode) {
157
158                case 'creer' :
159                        $set = array_merge($set, array(
160                                'id_objet' => 0,
161                                'type'     => '',
162                                'perma'    => 1,
163                                'date'     => date('Y-m-d H:i:s '),
164                        ));
165                        if (($insert = sql_insertq('spip_urls', $set)) === false){
166                                $message_erreur = _T('erreur_technique_enregistrement_impossible');
167                        }
168                        break;
169
170                case 'modifier' :
171                        if (!$update = sql_updateq('spip_urls', $set, array('page = '.sql_quote($page)))) {
172                                $message_erreur = _T('erreur_technique_enregistrement_impossible');
173                        }
174                        break;
175        }
176
177        // Messages de retour éventuels
178        if (isset($message_erreur)
179                and $message_erreur
180        ){
181                $res['message_erreur'] = $message_erreur;
182        } else {
183                $message_ok = _T('info_modification_enregistree');
184                $message_ok .= '<br><a href="' . generer_url_ecrire('controler_urls_pages') . '">' . _T('navigateur_pas_redirige') . '</a>';
185                $res['message_ok'] = $message_ok;
186
187        }
188
189        // Redirection éventuelle
190        if ($redirect){
191                $res['redirect'] = $redirect;
192        }
193        $res['editable'] = false;
194
195        return $res;
196}
Note: See TracBrowser for help on using the repository browser.