[PLUGINS] +clavettes et dependances
[lhc/web/clavette_www.git] / www / plugins / pages / pages_pipelines.php
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
13 if (!defined("_ECRIRE_INC_VERSION")) return;
14
15 // Change l'entête du formulaire des articles pour montrer que c'est une page
16 function pages_affiche_milieu_ajouter_page($flux){
17
18 if ($flux['args']['exec'] == 'article_edit'){
19 include_spip('base/abstract_sql');
20 if (
21 _request('modele') == 'page'
22 or
23 (
24 ($id_article = $flux['args']['id_article']) > 0
25 and
26 (sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article)))
27 )
28 )
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 */
69 function 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('prive/objets/editer/identifiant_page',
88 array('id_article' => $id_article),
89 array('ajax'=>true)
90 );
91 }
92 }
93
94 if ($texte) {
95 if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
96 $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
97 else
98 $flux['data'] .= $texte;
99 }
100
101 return $flux;
102 }
103
104
105 // Vérifier que la page n'est pas vide
106 function pages_formulaire_charger($flux){
107
108 // Si on est dans l'édition d'un article
109 if (is_array($flux) and $flux['args']['form'] == 'editer_article'){
110
111 // Si on est dans un article de modele page
112 if (_request('modele') == 'page' or ($flux['data']['page'] and _request('modele') != 'article')){
113 $flux['data']['modele'] = 'page';
114 $flux['data']['champ_page'] = $flux['data']['page'];
115 }
116 unset($flux['data']['page']);
117 }
118
119 return $flux;
120 }
121
122
123 /**
124 * Vérifications de l'identifiant d'une page
125 *
126 * @param array $flux
127 * Le contexte du pipeline
128 * @return array $flux
129 * Le contexte du pipeline modifié
130 */
131 function pages_formulaire_verifier($flux){
132 // Si on est dans l'édition d'un article/page ou dans le formulaire d'édition d'un identifiant page
133 if (
134 is_array($flux)
135 and (
136 ( $flux['args']['form'] == 'editer_article' and _request('modele') == 'page' )
137 or $flux['args']['form'] == 'editer_identifiant_page'
138 )
139 ){
140 $erreur = '';
141 $page = _request('champ_page');
142 $id_page = $flux['args']['args'][0];
143 // champ vide
144 $lang = sql_getfetsel('lang','spip_articles','id_article='.intval($id_page));
145 if (!$page)
146 $erreur .= _T('info_obligatoire');
147 // nombre de charactères : 40 max
148 elseif (strlen($page) > 255)
149 $erreur = _T('pages:erreur_champ_page_taille');
150 // format : charactères alphanumériques en minuscules ou "_"
151 elseif (!preg_match('/^[a-z0-9_]+$/', $page))
152 $erreur = _T('pages:erreur_champ_page_format');
153 // doublon
154 elseif (sql_countsel(table_objet_sql('article'), "page=".sql_quote($page) . " AND id_article!=".intval($id_page)." AND lang=".sql_quote($lang)))
155 $erreur = _T('pages:erreur_champ_page_doublon');
156
157 if ($erreur)
158 $flux['data']['champ_page'] .= $erreur;
159 }
160 return $flux;
161
162 }
163
164
165 /**
166 * Insertion dans le pipeline editer_contenu_objet (SPIP)
167 *
168 * Sur les articles considérés comme pages uniques, on remplace l'élément de choix de rubriques par :
169 * -* un input hidden id_rubrique et id_parent avec pour valeur -1
170 * -* un input hidden modele avec comme valeur "page"
171 * -* un champ d'édition de l'identifiant de la page unique
172 *
173 * @param array $flux
174 * Le contexte du pipeline
175 * @return array $flux
176 * Le contexte du pipeline modifié
177 */
178 function pages_editer_contenu_objet($flux){
179 $args = $flux['args'];
180 if ($args['type'] == 'article' && isset($args['contexte']['modele']) && $args['contexte']['modele'] == 'page'){
181 $erreurs = $args['contexte']['erreurs'];
182 // On cherche et remplace l'édition de la rubrique
183 $cherche = "/<li[^>]*class=('|\")editer editer_parent.*?<\/li>/is";
184 $remplace = '<li class="editer editer_page obligatoire'.($erreurs['champ_page'] ? ' erreur' : '').'">';
185 $remplace .= '<input type="hidden" name="id_parent" value="-1" />';
186 $remplace .= '<input type="hidden" name="id_rubrique" value="-1" />';
187 $remplace .= '<input type="hidden" name="modele" value="page" />';
188 $remplace .= '<label for="id_page">'._T('pages:titre_page').'</label>';
189 if ($erreurs['champ_page'])
190 $remplace .= '<span class="erreur_message">'.$erreurs['champ_page'].'</span>';
191 $value = $args['contexte']['champ_page'] ? $args['contexte']['champ_page'] : $args['contexte']['page'];
192 $remplace .= '<input type="text" class="text" name="champ_page" id="id_page" value="'.$value.'" />';
193 $remplace .= '</li>';
194 if (preg_match($cherche,$flux['data'])) {
195 $flux['data'] = preg_replace($cherche, $remplace, $flux['data'],1);
196 $flux['data'] = preg_replace($cherche, '', $flux['data']);
197 } else {
198 $cherche = "/(<li[^>]*class=('|\")editer editer_soustitre.*?<\/li>)/is";
199 if (preg_match($cherche,$flux['data'])) {
200 $flux['data'] = preg_replace($cherche,'$1'.$remplace, $flux['data']);
201 } else {
202 $cherche = "/(<li[^>]*class=('|\")editer editer_titre.*?<\/li>)/is";
203 $flux['data'] = preg_replace($cherche,'$1'.$remplace, $flux['data']);
204 }
205 }
206 }
207 return $flux;
208 }
209
210 /**
211 * Insertion dans le pipeline pre_edition (SPIP)
212 *
213 * Si on édite un article :
214 * - Si on récupère un champ "champ_page" dans les _request() et qu'il est différent de "article",
215 * on transforme l'article en page unique, id_rubrique devient -1
216 * - 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
217 * son champ page pour pouvoir réaliser le processus inverse dans le futur
218 *
219 * @param array $flux Le contexte du pipeline
220 * @return array $flux Le contexte modifié
221 */
222 function pages_pre_edition_ajouter_page($flux){
223 if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article'){
224 if ((($page = _request('champ_page')) != '') AND ($page != 'article')){
225 /**
226 * On ajoute le "champ_page" du formulaire qui deviendra "page" dans la table
227 * On force l'id_rubrique à -1
228 */
229 $flux['data']['page'] = $page;
230 $flux['data']['id_rubrique'] = '-1';
231 $flux['data']['id_secteur'] = '0';
232 }
233 /**
234 * si l'id_parent est supérieur à 0 on que l'on ne récupère pas de champ_page,
235 * on pense à vider le champ "page", pour pouvoir revenir après coup en page
236 */
237 if (!_request('champ_page') && (_request('id_parent') > 0)){
238 $flux['data']['page'] = '';
239 }
240 }
241 return $flux;
242 }
243
244 /**
245 * Insertion dans le pipeline boite_infos (SPIP)
246 *
247 * Ajouter un lien pour transformer un article éditorial en page ou inversement
248 *
249 * @param array $flux
250 * Le contexte du pipeline
251 * @return array $flux
252 * Le contexte modifié
253 */
254 function pages_boite_infos($flux){
255 if ($flux['args']['type'] == 'article') {
256 include_spip('inc/presentation');
257 if (sql_getfetsel('page', 'spip_articles', 'id_article='. intval($flux['args']['id'])) == '') {
258 if (autoriser('creer', 'page', $flux['args']['id']))
259 $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', $fonction="", $dummy="", $javascript="");
260 }
261 else {
262 if (autoriser('modifier', 'page', $flux['args']['id']))
263 $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', $fonction="", $dummy="", $javascript="");
264 }
265 }
266 return $flux;
267 }
268
269
270 /**
271 * Insertion dans le pipeline affiche_hierarchie (SPIP)
272 * Pour les pages, faire pointer la racine vers la liste des pages au lieux des rubriques
273 * Pour savoir si on se trouve sur une page, on vérifie que le champ "page" existe, faute de mieux
274 *
275 * @param array $flux
276 * Le contexte du pipeline
277 * @return array $flux
278 * Le contexte modifié
279 */
280 function pages_affiche_hierarchie($flux){
281
282 $objet = $flux['args']['objet'];
283 $id_article = $flux['args']['id_objet'];
284 if (
285 $objet == 'article'
286 and sql_getfetsel('page', 'spip_articles', 'id_article='.intval($id_article))
287 ){
288 $cherche = "<a href=\"". generer_url_ecrire('rubriques') . "\">" . _T('info_racine_site') . "</a>";
289 $remplace = "<a href=\"". generer_url_ecrire('pages') . "\">" . _T('pages:pages_uniques') . "</a>";
290 $flux['data'] = str_replace($cherche,$remplace,$flux['data']);
291 }
292 return $flux;
293 }
294
295
296 /**
297 * Insertion dans le pipeline pre_boucle (SPIP)
298 * Pour les listes d'articles purement éditoriaux, il faut exclure les pages uniques afin d'éviter la confusion des genres
299 * ainsi que les liens vers des pages parfois inaccessibles en fonction de l'autorisation de l'auteur.
300 *
301 * @param array $flux
302 * Le contexte du pipeline
303 * @return array $flux
304 * Le contexte modifié
305 */
306 function pages_pre_boucle($boucle){
307
308 // On ne s'intéresse qu'à la boucle ARTICLES
309 if ($boucle->type_requete == 'articles' and !$boucle->modificateur['tout']) {
310 // On n'insère le filtre {id_rubriques>0} pour exclure les pages uniques que si aucune des conditions
311 // suivantes n'est vérifiée:
312 // - pas de critère page autre que {page=''}
313 // - pas de critère explicite {id_rubrique=-1} ou {id_rubrique<0}
314 // - pas de critère {id_rubrique?} pour lequel l'environnement renvoie -1 pour l'id de la rubrique
315 $boucle_articles = true;
316 $critere_page = false;
317
318 // On cherche les critères id_rubrique, id_article ou page
319 foreach($boucle->criteres as $_critere){
320 if ($_critere->op == 'page') { // {page} ou {page?}
321 // On considère qu'on cherche toujours des pages uniques donc on force le filtre id_rubrique=-1
322 $boucle_articles = false;
323 $critere_page = true;
324 break;
325 }
326 elseif ($_critere->param[0][0]->texte == 'page') { // {page=x}
327 if (($_critere->op == '=')
328 AND ($_critere->param[1][0]->texte == '')) {
329 // On veut exclure explicitement les pages
330 break;
331 }
332 else {
333 // on désigne bien des pages par leur champ 'page'
334 $boucle_articles = false;
335 $critere_page = true;
336 break;
337 }
338 }
339 elseif (($_critere->op == 'id_article') // {id_article} ou {id_article?}
340 OR ($_critere->param[0][0]->texte == 'id_article')) { // {id_article=x}
341 // On pointe sur un article précis, il est donc inutile de rajouter un test sur la rubrique
342 // Pour le critère {id_article?} on considère que si l'on veut sélectionner des pages uniques
343 // ou des articles éditoriaux on doit préciser le critère {id_rubrique}
344 $boucle_articles = false;
345 }
346 elseif ((($_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique=-1}
347 AND ($_critere->op == '=')
348 AND ($_critere->param[1][0]->texte == '-1'))
349 OR (($_critere->param[0][0]->texte == 'id_rubrique') // {id_rubrique<0}
350 AND ($_critere->op == '<')
351 AND ($_critere->param[1][0]->texte == '0'))) {
352 // On cherche explicitement des pages uniques
353 $boucle_articles = false;
354 break;
355 }
356 elseif (($_critere->op == 'id_rubrique')) {
357 // On connait pas à ce stade la valeur de id_rubrique qui est passé dans le env.
358 // Aussi, on créer une condition where qui se compile différemment suivant la valeur de l'id_rubrique.
359 // En fait, il suffit de tester si l'id_rubrique est null. Dans ce cas il faut bien rajouter id_rubrique>0
360 // pour éliminer les pages uniques.
361 $boucle_articles = false;
362 $env_id = "\$Pile[0]['id_rubrique']";
363 $boucle->where[] =
364 array("'?'", "(is_array($env_id)?count($env_id):strlen($env_id))", "''", "'articles.id_rubrique>0'");
365 break;
366 }
367 }
368
369 // Si on est en présence d'une boucle article purement éditoriale, on ajoute le filtre id_rubrique>0
370 if ($boucle_articles) {
371 $boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
372 }
373
374 // Si on est en présence d'un critère {page} quelconque, on force le filtre id_rubrique=-1
375 if ($critere_page) {
376 $boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
377 }
378 }
379
380 return $boucle;
381 }
382
383 ?>