source: spip-zone/_plugins_/pages/trunk/pages_pipelines.php @ 99509

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

Suite de r99508 : variable inutile et remise de commentaire.

File size: 14.5 KB
Line 
1<?php
2/**
3 * Déclaration des pipelines utilisés par le plugin
4 *
5 * @plugin     Pages
6 * @copyright  2013
7 * @author     RastaPopoulos
8 * @licence    GNU/GPL
9 * @package    SPIP\Pages\Pipelines
10 * @link       http://contrib.spip.net/Pages-uniques
11 */
12
13if (!defined('_ECRIRE_INC_VERSION')) {
14        return;
15}
16
17// Change l'entête du formulaire des articles pour montrer que c'est une page
18function pages_affiche_milieu_ajouter_page($flux) {
19
20        if ($flux['args']['exec'] == 'article_edit') {
21                include_spip('base/abstract_sql');
22                if (
23                        _request('modele') == 'page'
24                        or
25                        (
26                                isset($flux['args']['id_article'])
27                                and ($id_article = $flux['args']['id_article']) > 0
28                                and (sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
29                        )
30                ) {
31                        //On force l'id parent à -1
32                        //Par principe une page nouvelle ou existante est dans la rubrique parent -1
33                        $cherche = "/(<input[^>]*name=('|\")id_parent[^>]*>)/is";
34                        if (!preg_match($cherche, $flux['data'])) {
35                                $cherche = "/(<input[^>]*name=('|\")id_rubrique[^>]*>)/is";
36                                $remplace = "$1<input type=\"hidden\" name=\"id_parent\" value=\"-1\" />\n";
37                                $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
38                        }
39
40                        // On cherche et remplace l'entete de la page : "modifier la page"
41                        $cherche = "/(<div[^>]*class=('|\")entete-formulaire.*?<\/span>).*?(<h1>.*?<\/h1>.*?<\/div>)/is";
42                        $surtitre = _T('pages:modifier_page');
43                        $remplace = "$1$surtitre$3";
44                        $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
45
46                        // Si c'est une nouvelle page, on remplace le lien de retour dans l'entete
47                        if (_request('new') == 'oui') {
48                                $cherche = "/(<span[^>]*class=(?:'|\")icone[^'\"]*retour[^'\"]*(?:'|\")>"
49                                                        . "<a[^>]*href=(?:'|\"))[^'\"]*('|\")/is";
50                                $retour = generer_url_ecrire('pages_tous');
51                                $remplace = "$1$retour$2";
52                                $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
53                        }
54                }
55        }
56
57        return $flux;
58}
59
60
61/**
62 * Saisie de l'identifiant de la page sur la fiche d'une page
63 *
64 * @param array $flux
65 *              Le contexte du pipeline
66 * @return array $flux
67 *              Le contexte du pipeline modifié
68 */
69function pages_affiche_milieu_identifiant($flux) {
70        $texte = '';
71        $e = trouver_objet_exec($flux['args']['exec']);
72
73        // Si on est sur la fiche d'un article...
74        if (!$e['edition'] and $e['type']=='article') {
75                include_spip('base/abstract_sql');
76                $id_article = isset($flux['args'][$e['id_table_objet']]) ? $flux['args'][$e['id_table_objet']] : false;
77                // ... et s'il s'agit d'une page
78                if (
79                        _request('modele') == 'page'
80                        or
81                        (
82                                intval($id_article) > 0
83                                and
84                                (sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
85                        )
86                ) {
87                        $texte .= recuperer_fond(
88                                'prive/objets/editer/identifiant_page',
89                                array('id_article' => $id_article),
90                                array('ajax' => true)
91                        );
92                }
93        }
94
95        if ($texte) {
96                if ($p=strpos($flux['data'], '<!--affiche_milieu-->')) {
97                        $flux['data'] = substr_replace($flux['data'], $texte, $p, 0);
98                } else {
99                        $flux['data'] .= $texte;
100                }
101        }
102
103        return $flux;
104}
105
106
107// Vérifier que la page n'est pas vide
108function pages_formulaire_charger($flux) {
109
110        // Si on est dans l'édition d'un article
111        if (is_array($flux) and $flux['args']['form'] == 'editer_article') {
112                // Si on est dans un article de modele page
113                if (_request('modele') == 'page' or ($flux['data']['page'] and _request('modele') != 'article')) {
114                        $flux['data']['modele'] = 'page';
115                        $flux['data']['champ_page'] = $flux['data']['page'];
116                }
117                unset($flux['data']['page']);
118        }
119
120        return $flux;
121}
122
123
124/**
125 * Vérifications de l'identifiant d'une page
126 *
127 * L'identifiant doit être unique, sauf en cas de traduction
128 *
129 * @param array $flux
130 *              Le contexte du pipeline
131 * @return array $flux
132 *              Le contexte du pipeline modifié
133 */
134function pages_formulaire_verifier($flux) {
135        // Si on est dans l'édition d'un article/page ou dans le formulaire d'édition d'un identifiant page
136        if (
137                is_array($flux)
138                and (
139                        ( $flux['args']['form'] == 'editer_article' and _request('modele') == 'page' )
140                        or $flux['args']['form'] == 'editer_identifiant_page'
141                )
142        ) {
143                $erreur = '';
144                $page = _request('champ_page');
145                $page = strtolower($page);
146                $page = preg_replace(',\\s+,', '_', $page);
147                set_request('champ_page', $page);
148                $id_page = $flux['args']['args'][0];
149                // champ vide
150                $lang = sql_getfetsel('lang', 'spip_articles', 'id_article='.intval($id_page));
151                if (!$lang) {
152                        $lang = $GLOBALS['spip_lang'];
153                }
154                if (!$page) {
155                        $erreur .= _T('info_obligatoire');
156                } elseif (strlen($page) > 255) {
157                         $erreur = _T('pages:erreur_champ_page_taille');
158                } elseif (!preg_match('/^[a-z0-9_]+$/', $page)) {
159                        // format : charactères alphanumériques en minuscules ou "_"
160                         $erreur = _T('pages:erreur_champ_page_format');
161                // doublon ?
162                } elseif (sql_countsel('spip_articles', array(
163                                'page=' . sql_quote($page),
164                                'id_article != ' . intval($id_page),
165                                'lang = ' . sql_quote($lang),
166                                'statut != ' .sql_quote("poubelle")))
167                ) {
168                        $erreur = _T('pages:erreur_champ_page_doublon');
169                }
170
171                if ($erreur) {
172                        if (!isset($flux['data']['champ_page'])) {
173                                $flux['data']['champ_page'] = '';
174                        }
175                        $flux['data']['champ_page'] .= $erreur;
176                }
177        }
178        return $flux;
179}
180
181
182/**
183 * Insertion dans le pipeline editer_contenu_objet (SPIP)
184 *
185 * Sur les articles considérés comme pages uniques, on remplace l'élément de choix de rubriques par :
186 * -* un input hidden id_rubrique et id_parent avec pour valeur -1
187 * -* un input hidden modele avec comme valeur "page"
188 * -* un champ d'édition de l'identifiant de la page unique
189 *
190 * @param array $flux
191 *              Le contexte du pipeline
192 * @return array $flux
193 *              Le contexte du pipeline modifié
194 */
195function pages_editer_contenu_objet($flux) {
196        $args = $flux['args'];
197        if ($args['type'] == 'article' && isset($args['contexte']['modele']) && $args['contexte']['modele'] == 'page') {
198                $erreurs = $args['contexte']['erreurs'];
199                // On cherche et remplace l'édition de la rubrique
200                $cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_parent.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
201                $remplace = '<\\2 class="editer editer_page obligatoire' . (empty($erreurs['champ_page']) ? '' : ' erreur') . '">';
202                $remplace .= '<input type="hidden" name="id_parent" value="-1" />';
203                $remplace .= '<input type="hidden" name="id_rubrique" value="-1" />';
204                $remplace .= '<input type="hidden" name="modele" value="page" />';
205                $remplace .= '<label for="id_page">'._T('pages:titre_page').'</label>';
206                if (!empty($erreurs['champ_page'])) {
207                        $remplace .= '<span class="erreur_message">' . $erreurs['champ_page'] . '</span>';
208                }
209
210                if (!empty($args['contexte']['champ_page'])) {
211                        $value = $args['contexte']['champ_page'];
212                } elseif (!empty($args['contexte']['page'])) {
213                        $value = $args['contexte']['page'];
214                } else {
215                        $value = '';
216                }
217
218                $remplace .= '<input type="text" class="text" name="champ_page" id="id_page" value="'.$value.'" />';
219                $remplace .= '</\\2>$3';
220                if (preg_match($cherche, $flux['data'], $m)) {
221                        $flux['data'] = preg_replace($cherche, $remplace, $flux['data'], 1);
222                        $flux['data'] = preg_replace($cherche, '', $flux['data']);
223                } else {
224                        $cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_soustitre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
225                        if (preg_match($cherche, $flux['data'])) {
226                                $flux['data'] = preg_replace($cherche,'$1'.$remplace, $flux['data']);
227                        } else {
228                                $cherche = "/(<(li|div)[^>]*class=(?:'|\")editer editer_titre.*?<\/\\2>)\s*(<(li|div)[^>]*class=(?:'|\")editer)/is";
229                                $flux['data'] = preg_replace($cherche, '$1'.$remplace, $flux['data']);
230                        }
231                }
232        }
233        return $flux;
234}
235
236/**
237 * Insertion dans le pipeline pre_edition (SPIP)
238 *
239 * Si on édite un article :
240 * - Si on récupère un champ "champ_page" dans les _request() et qu'il est différent de "article",
241 * on transforme l'article en page unique, id_rubrique devient -1
242 * - Si on ne récupère pas de champ_page et que id_parent est supérieur à 0, on le passe en article et on vide
243 * son champ page pour pouvoir réaliser le processus inverse dans le futur
244 *
245 * @param array $flux Le contexte du pipeline
246 * @return array $flux Le contexte modifié
247 */
248function pages_pre_edition_ajouter_page($flux) {
249        if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article') {
250                if ((($page = _request('champ_page')) != '') and ($page != 'article')) {
251                        /**
252                         * On ajoute le "champ_page" du formulaire qui deviendra "page" dans la table
253                         * On force l'id_rubrique à -1
254                         */
255                        $flux['data']['page'] = $page;
256                        $flux['data']['id_rubrique'] = '-1';
257                        $flux['data']['id_secteur'] = '0';
258                }
259                /**
260                 * si l'id_parent est supérieur à 0 on que l'on ne récupère pas de champ_page,
261                 * on pense à vider le champ "page", pour pouvoir revenir après coup en page
262                 */
263                if (!_request('champ_page') && (_request('id_parent') > 0)) {
264                        $flux['data']['page'] = '';
265                }
266        }
267        return $flux;
268}
269
270/**
271 * Insertion dans le pipeline boite_infos (SPIP)
272 *
273 * Ajouter un lien pour transformer un article éditorial en page ou inversement
274 *
275 * @param array $flux
276 *              Le contexte du pipeline
277 * @return array $flux
278 *              Le contexte modifié
279 */
280function pages_boite_infos($flux) {
281        if ($flux['args']['type'] == 'article') {
282                include_spip('inc/presentation');
283                if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '') {
284                        if (autoriser('creer', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
285                                $flux['data'] .= icone_horizontale(_T('pages:convertir_page'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'page'), 'page');
286                        }
287                } else {
288                        if (autoriser('modifier', 'page', $flux['args']['id']) && autoriser('convertir', 'page', $flux['args']['id'])) {
289                                $flux['data'] .= icone_horizontale(_T('pages:convertir_article'), parametre_url(parametre_url(generer_url_ecrire('article_edit'), 'id_article', $flux['args']['id']), 'modele', 'article'), 'article');
290                        }
291                }
292        }
293        return $flux;
294}
295
296
297/**
298 * Insertion dans le pipeline affiche_hierarchie (SPIP)
299 * Pour les pages, faire pointer la racine vers la liste des pages au lieux des rubriques
300 * Pour savoir si on se trouve sur une page, on vérifie que le champ "page" existe, faute de mieux
301 *
302 * @param array $flux
303 *              Le contexte du pipeline
304 * @return array $flux
305 *              Le contexte modifié
306 */
307function pages_affiche_hierarchie($flux) {
308        $objet = $flux['args']['objet'];
309        $id_article = $flux['args']['id_objet'];
310        if (
311                $objet == 'article'
312                and sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article))
313        ) {
314                $cherche = '<a href="'. generer_url_ecrire('rubriques') . '">' . _T('info_racine_site') . '</a>';
315                $remplace = '<a href="'. generer_url_ecrire('pages') . '">' . _T('pages:pages_uniques') . '</a>';
316                $flux['data'] = str_replace($cherche, $remplace, $flux['data']);
317        }
318        return $flux;
319}
320
321
322/**
323 * Insertion dans le pipeline pre_boucle (SPIP)
324 * Pour les listes d'articles purement éditoriaux, il faut exclure les pages uniques afin d'éviter la confusion des genres
325 * ainsi que les liens vers des pages parfois inaccessibles en fonction de l'autorisation de l'auteur.
326 *
327 * @param array $flux
328 *              Le contexte du pipeline
329 * @return array $flux
330 *              Le contexte modifié
331 */
332function pages_pre_boucle($boucle) {
333        // On ne s'intéresse qu'à la boucle ARTICLES
334        if ($boucle->type_requete == 'articles' and empty($boucle->modificateur['tout'])) {
335                // On n'insère le filtre {id_rubriques>0} pour exclure les pages uniques que si aucune des conditions
336                // suivantes n'est vérifiée:
337                // - pas de critère page autre que {page=''}
338                // - pas de critère explicite {id_rubrique=-1} ou {id_rubrique<0}
339                // - pas de critère {id_rubrique?} pour lequel l'environnement renvoie -1 pour l'id de la rubrique
340                // pas de critère {id_article=XX} ou {id_article} ou {id_article?}
341                $boucle_articles = true;
342                $critere_page = false;
343
344                // On cherche les critères id_rubrique, id_article ou page
345                foreach ($boucle->criteres as $_critere) {
346                        if ($_critere->op == 'page' and !$_critere->not) { // {page} ou {page?} mais pas {!page}
347                                // On considère qu'on cherche toujours des pages uniques donc on force le filtre id_rubrique=-1
348                                $boucle_articles = false;
349                                $critere_page = true;
350                                break;
351                        } elseif (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'page') { // {page=x}
352                                if (($_critere->op == '=')
353                                        and ($_critere->param[1][0]->texte == '')
354                                        and empty($_critere->param[1][1])
355                                        or $_critere->not) {
356                                        // On veut exclure explicitement les pages
357                                        break;
358                                } else {
359                                        // on désigne bien des pages par leur champ 'page'
360                                        $boucle_articles = false;
361                                        $critere_page = true;
362                                        break;
363                                }
364                        } elseif (($_critere->op == 'id_article') // {id_article} ou {id_article?}
365                                or (isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_article')) { // {id_article=x}
366                                // On pointe sur un article précis, il est donc inutile de rajouter un test sur la rubrique
367                                // Pour le critère {id_article?} on considère que pour sélectionner des pages uniques
368                                // ou des articles éditoriaux on doit préciser le critère {id_rubrique}
369                                $boucle_articles = false;
370                        } elseif (((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique=-1}
371                                        and ($_critere->op == '=')
372                                        and ($_critere->param[1][0]->texte == '-1'))
373                                        or ((isset($_critere->param[0][0]->texte) and $_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique<0}
374                                        and ($_critere->op == '<')
375                                        and ($_critere->param[1][0]->texte == '0'))) {
376                                // On cherche explicitement des pages uniques
377                                $boucle_articles = false;
378                                break;
379                        } else if (($_critere->op == 'id_rubrique')) {
380                                // On connait pas à ce stade la valeur de id_rubrique qui est passé dans le env.
381                                // Aussi, on créer une condition where qui se compile différemment suivant la valeur de l'id_rubrique.
382                                // En fait, il suffit de tester si l'id_rubrique est null. Dans ce cas il faut bien rajouter id_rubrique>0
383                                // pour éliminer les pages uniques.
384                                $boucle_articles = false;
385                                $env_id = "\$Pile[0]['id_rubrique']";
386                                $boucle->where[] =
387                                        array("'?'", "(isset($env_id)?(is_array($env_id)?count($env_id):strlen($env_id)):'')", "''", "'articles.id_rubrique>0'");
388                                break;
389                        }
390                }
391
392                // Si on est en présence d'une boucle article purement éditoriale, on ajoute le filtre id_rubrique>0
393                if ($boucle_articles) {
394                        $boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
395                }
396
397                // Si on est en présence d'un critère {page} quelconque, on force le filtre id_rubrique=-1
398                if ($critere_page) {
399                        $boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
400                }
401        }
402
403        return $boucle;
404}
Note: See TracBrowser for help on using the repository browser.