[PLUGINS] +pages
[ptitvelo/web/www.git] / www / plugins / pages / pages_pipelines.php
1 <?php
2 /**
3 * Plugin Pages
4 *
5 * @author Rastapopoulos
6 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
7 * @link http://www.spip-contrib.net/Plugin-Pages Documentation
8 * @package SPIP\Pages\Pipelines
9 */
10
11 if (!defined("_ECRIRE_INC_VERSION")) return;
12
13 // Change l'entête du formulaire des articles pour montrer que c'est une page
14 function pages_affiche_milieu_ajouter_page($flux){
15
16 if ($flux['args']['exec'] == 'article_edit'){
17 include_spip('base/abstract_sql');
18 if (
19 _request('modele') == 'page'
20 or
21 (
22 ($id_article = $flux['args']['id_article']) > 0
23 and
24 (sql_getfetsel('page', 'spip_articles', 'id_article='.sql_quote($id_article)))
25 )
26 )
27 {
28
29 // On cherche et remplace l'entete de la page : "modifier la page"
30 $cherche = "/(<div[^>]*class=('|\")entete-formulaire.*?<\/span>).*?(<h1>.*?<\/h1>.*?<\/div>)/is";
31 $surtitre = _T('pages:modifier_page');
32 $remplace = "$1$surtitre$3";
33 $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
34
35 // Si c'est une nouvelle page, on remplace le lien de retour dans l'entete
36 if (_request('new') == 'oui'){
37 $cherche = "/(<span[^>]*class=(?:'|\")icone[^'\"]*retour[^'\"]*(?:'|\")>"
38 . "<a[^>]*href=(?:'|\"))[^'\"]*('|\")/is";
39 $retour = generer_url_ecrire("pages_tous");
40 $remplace = "$1$retour$2";
41 $flux['data'] = preg_replace($cherche, $remplace, $flux['data']);
42
43 }
44
45 }
46
47 }
48
49 return $flux;
50
51 }
52
53
54 /**
55 * Saisie de l'identifiant de la page sur la fiche d'une page
56 *
57 * @param array $flux
58 * Le contexte du pipeline
59 * @return array $flux
60 * Le contexte du pipeline modifié
61 */
62 function pages_affiche_milieu_identifiant($flux){
63 $texte = "";
64 $e = trouver_objet_exec($flux['args']['exec']);
65
66 // Si on est sur la fiche d'un article...
67 if (!$e['edition'] and $e['type']=='article' ) {
68 include_spip('base/abstract_sql');
69 $id_article = isset($flux['args'][$e['id_table_objet']]) ? $flux['args'][$e['id_table_objet']] : false;
70 // ... et s'il s'agit d'une page
71 if (
72 _request('modele') == 'page'
73 or
74 (
75 $id_article > 0
76 and
77 (sql_getfetsel('page', 'spip_articles', 'id_article='.sql_quote($id_article)))
78 )
79 ) {
80 $texte .= recuperer_fond('prive/objets/editer/identifiant_page',
81 array('id_article' => $id_article),
82 array('ajax'=>true)
83 );
84 }
85 }
86
87 if ($texte) {
88 if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
89 $flux['data'] = substr_replace($flux['data'],$texte,$p,0);
90 else
91 $flux['data'] .= $texte;
92 }
93
94 return $flux;
95 }
96
97
98 // Vérifier que la page n'est pas vide
99 function pages_formulaire_charger($flux){
100
101 // Si on est dans l'édition d'un article
102 if (is_array($flux) and $flux['args']['form'] == 'editer_article'){
103
104 // Si on est dans un article de modele page
105 if (_request('modele') == 'page' or ($flux['data']['page'] and _request('modele') != 'article')){
106 $flux['data']['modele'] = 'page';
107 $flux['data']['champ_page'] = $flux['data']['page'];
108 }
109 unset($flux['data']['page']);
110 }
111
112 return $flux;
113
114 }
115
116
117 /**
118 * Vérifications de l'identifiant d'une page
119 *
120 * @param array $flux
121 * Le contexte du pipeline
122 * @return array $flux
123 * Le contexte du pipeline modifié
124 */
125 function pages_formulaire_verifier($flux){
126
127 // Si on est dans l'édition d'un article/page ou dans le formulaire d'édition d'un identifiant page
128 if (
129 is_array($flux)
130 and (
131 ( $flux['args']['form'] == 'editer_article' and _request('modele') == 'page' )
132 or $flux['args']['form'] == 'editer_identifiant_page'
133 )
134 ){
135 $erreur = '';
136 $page = _request('champ_page');
137 $id_page = $flux['args']['args'][0];
138
139 // champ vide
140 if (!$page)
141 $erreur .= _T('info_obligatoire');
142 // nombre de charactères : 40 max
143 elseif (strlen($page) > 255)
144 $erreur = _T('pages:erreur_champ_page_taille');
145 // format : charactères alphanumériques en minuscules ou "_"
146 elseif (!preg_match('/^[a-z0-9_]+$/', $page))
147 $erreur = _T('pages:erreur_champ_page_format');
148 // doublon
149 elseif (sql_countsel(table_objet_sql('article'), "page=".sql_quote($page) . " AND id_article!=".intval($id_page)))
150 $erreur = _T('pages:erreur_champ_page_doublon');
151
152 if ($erreur)
153 $flux['data']['champ_page'] .= $erreur;
154 }
155 return $flux;
156
157 }
158
159
160 /**
161 * Insertion dans le pipeline editer_contenu_objet (SPIP)
162 *
163 * Sur les articles considérés comme pages uniques, on remplace l'élément de choix de rubriques par :
164 * -* un input hidden id_rubrique et id_parent avec pour valeur -1
165 * -* un input hidden modele avec comme valeur "page"
166 * -* un champ d'édition de l'identifiant de la page unique
167 *
168 * @param array $flux
169 * Le contexte du pipeline
170 * @return array $flux
171 * Le contexte du pipeline modifié
172 */
173 function pages_editer_contenu_objet($flux){
174 $args = $flux['args'];
175 if ($args['type'] == 'article' && isset($args['contexte']['modele']) && $args['contexte']['modele'] == 'page'){
176 $erreurs = $args['contexte']['erreurs'];
177 // On cherche et remplace l'édition de la rubrique
178 $cherche = "/<li[^>]*class=('|\")editer editer_parent.*?<\/li>/is";
179 $remplace = '<li class="editer editer_page obligatoire'.($erreurs['champ_page'] ? ' erreur' : '').'">';
180 $remplace .= '<input type="hidden" name="id_parent" value="-1" />';
181 $remplace .= '<input type="hidden" name="id_rubrique" value="-1" />';
182 $remplace .= '<input type="hidden" name="modele" value="page" />';
183 $remplace .= '<label for="id_page">'._T('pages:titre_page').'</label>';
184 if ($erreurs['champ_page'])
185 $remplace .= '<span class="erreur_message">'.$erreurs['champ_page'].'</span>';
186 $value = $args['contexte']['champ_page'] ? $args['contexte']['champ_page'] : $args['contexte']['page'];
187 $remplace .= '<input type="text" class="text" name="champ_page" id="id_page" value="'.$value.'" />';
188 $remplace .= '</li>';
189 $flux['data'] = preg_replace($cherche, $remplace, $flux['data'],1);
190 $flux['data'] = preg_replace($cherche, '', $flux['data']);
191 }
192 return $flux;
193 }
194
195 /**
196 * Insertion dans le pipeline pre_edition (SPIP)
197 *
198 * Si on édite un article :
199 * - Si on récupère un champ "champ_page" dans les _request() et qu'il est différent de "article",
200 * on transforme l'article en page unique, id_rubrique devient -1
201 * - 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
202 * son champ page pour pouvoir réaliser le processus inverse dans le futur
203 *
204 * @param array $flux Le contexte du pipeline
205 * @return array $flux Le contexte modifié
206 */
207 function pages_pre_edition_ajouter_page($flux){
208 if (is_array($flux) and isset($flux['args']['type']) && $flux['args']['type'] == 'article'){
209 if ((($page = _request('champ_page')) != '') AND ($page != 'article')){
210 /**
211 * On ajoute le "champ_page" du formulaire qui deviendra "page" dans la table
212 * On force l'id_rubrique à -1
213 */
214 $flux['data']['page'] = $page;
215 $flux['data']['id_rubrique'] = '-1';
216 $flux['data']['id_secteur'] = '0';
217 }
218 /**
219 * si l'id_parent est supérieur à 0 on que l'on ne récupère pas de champ_page,
220 * on pense à vider le champ "page", pour pouvoir revenir après coup en page
221 */
222 if (!_request('champ_page') && (_request('id_parent') > 0)){
223 $flux['data']['page'] = '';
224 }
225 }
226 return $flux;
227 }
228
229 /**
230 * Insertion dans le pipeline boite_infos (SPIP)
231 *
232 * Ajouter un lien pour transformer une article normal en page inversement
233 *
234 * @param array $flux
235 * Le contexte du pipeline
236 * @return array $flux
237 * Le contexte modifié
238 */
239 function pages_boite_infos($flux){
240 if ($flux['args']['type'] == 'article' and autoriser('modifier', 'article', $flux['args']['id'])){
241 include_spip('inc/presentation');
242 if (sql_getfetsel('page', 'spip_articles', 'id_article='. $flux['args']['id']) == '')
243 $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="");
244 else
245 $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="");
246 }
247 return $flux;
248 }
249
250
251 /**
252 * Insertion dans le pipeline affiche_hierarchie (SPIP)
253 * Pour les pages, faire pointer la racine vers la liste des pages au lieux des rubriques
254 * Pour savoir si on se trouve sur une page, on vérifie que le champ "page" existe, faute de mieux
255 *
256 * @param array $flux
257 * Le contexte du pipeline
258 * @return array $flux
259 * Le contexte modifié
260 */
261 function pages_affiche_hierarchie($flux){
262
263 $objet = $flux['args']['objet'];
264 $id_article = $flux['args']['id_objet'];
265 if (
266 $objet == 'article'
267 and sql_getfetsel('page', 'spip_articles', 'id_article='.sql_quote($id_article))
268 ){
269 $cherche = "<a href=\"". generer_url_ecrire('rubriques') . "\">" . _T('info_racine_site') . "</a>";
270 $remplace = "<a href=\"". generer_url_ecrire('pages_tous') . "\">" . _T('pages:pages_uniques') . "</a>";
271 $flux['data'] = str_replace($cherche,$remplace,$flux['data']);
272 }
273
274
275 return $flux;
276 }
277
278 ?>