source: plugins_spip/diogene/formulaires/diogene.php @ 2974

Last change on this file since 2974 was 2974, checked in by kent1, 11 years ago

pas mal de modifications

File size: 17.8 KB
Line 
1<?php
2
3function formulaires_diogene_charger_dist($id_article='new', $id_rubrique=0, $lier_trad=0, $type='normal',$redirect=''){
4        global $visiteur_session;
5        $valeurs = array();
6        $id_auteur = $visiteur_session['id_auteur'];
7        spip_log("On redirigera sur $redirect","diogene");
8        // charger une seule fois la config
9        $config = lire_config('diogene/statuts/');
10        spip_log($config);
11        if(!$id_auteur){
12                $valeurs['editable'] = false;
13                $valeurs['message_erreur'] = _T('emballe_medias:droits_insuffisants').'<br />'._T('emballe_medias:connection_obligatoire');
14        }
15
16        else{
17                $auteur_statut = $visiteur_session['statut'];
18
19                // on cherche un article deja existant seulement si la configuration le permet
20                if ($config['chercher_article']=='oui') {
21                        if(!intval($id_article)){
22                                $id_article = sql_getfetsel("art.id_article","spip_articles AS art LEFT JOIN spip_auteurs_articles AS aut ON (art.id_article=aut.id_article)","art.statut IN ('prop','prepa') AND art.objet_type = '$type' AND aut.id_auteur = $id_auteur");
23                                if(!intval($id_article)){
24                                        $id_article = 'new';
25                                }
26                        }
27                }
28
29                include_spip('inc/autoriser');
30                $auteur_info = $config['statuts'];
31
32                // On vérifie si l'auteur connecté a les droits nécessaires pour créer l'article
33                if(is_array($auteur_info)){
34                        if(autoriser('diogene_publier')){
35                                $valeurs['editable'] = true;
36                        }
37                        else{
38                                $valeurs['message_erreur'] = _T('emballe_medias:droits_insuffisants');
39                                $valeurs['editable'] = false;
40                        }
41                }
42                else{
43                        $valeurs['editable'] = false;
44                        $valeurs['message_erreur'] = _T('emballe_medias:configurer_auteurs');
45                }
46                if($valeurs['editable'] && ($id_article != 'new') && (!_request('valider'))){
47
48                        // Si l'article existe déjà, on récupÚre ses anciennes valeurs
49                        $valeurs = sql_fetsel("*","spip_articles","id_article=$id_article");
50
51                        // Le textarea pour le texte dans le public est dénommé textearticle
52                        $valeurs['textearticle'] = $valeurs['texte'];
53
54                        // et la valeur pour rubrique = rubrique
55                        $valeurs['rubrique'] = $valeurs['id_rubrique'];
56
57                        $valeurs['id'] = $id_article;
58
59                        // on est dans une trad => on affiche le formulaire de langue
60                        if($lier_trad != 0){
61                                $valeurs['titre'] .= ' '._T('emballe_medias:new_traduction');
62                                $valeurs['id_trad'] = $lier_trad;
63                        }
64
65                        $valeurs['selecteur_langue'] = true;
66                        $validable = true;
67                        // L'article est publiable uniquement si un document associé existe
68                        //$validable = sql_getfetsel("doc_objet.id_document","spip_documents_liens AS doc_objet LEFT JOIN spip_documents as doc ON (doc.id_document=doc_objet.id_document)","doc_objet.id_objet = '$id_article' AND doc_objet.objet='article'");
69                        spip_log("EM : id_document = $validable","diogene");
70
71                        if ($validable) {
72                                $valeurs['selecteur_statut'] = $config['statut_visible'];
73                                spip_log("EM : selecteur_statut = ".$config['statut_visible'],"diogene");
74                        }
75
76                        /*
77                         * On récupÚre les mots qui sont peut être associés
78                         * On les place dans l'array $valeurs de la sorte $valeurs['groupe_#ID_GROUPE']
79                         */
80                        $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
81                        foreach($groupes_possibles as $groupe){
82                                $valeurs['groupe_'.$groupe]     = sql_fetsel('mot.id_mot','spip_mots as mot left join spip_mots_articles as mots_articles ON (mot.id_mot=mots_articles.id_mot)','mots_articles.id_article='.intval($id_article).' AND mot.id_groupe='.intval($groupe));
83                        }
84
85                        // Pipeline pour compléter les valeurs déjà récupérées
86                        $post_valeurs = pipeline('diogene_ajout_media_post_charger',
87                                array(
88                                        'args' => array(
89                                                'id_article' => $id_article,
90                                                'mode' => 'chargement',
91                                                'valeurs' => $valeurs
92                                        ),
93                                        'data' => array()
94                                )
95                        );
96                        if(is_array($post_valeurs)){
97                                $valeurs = array_merge($valeurs,$post_valeurs);
98                        }
99                        if($valeurs['statut'] != 'publie'){
100                                if(($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prop')){
101                                        $valeurs['message_ok'] = _T('emballe_medias:message_article_prop_prop');
102                                }
103                                else if (($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prepa')){
104                                        $valeurs['message_ok'] = _T('emballe_medias:message_article_prop_prepa');
105                                }
106                                else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'prepa')){
107                                        $valeurs['message_ok'] = _T('emballe_medias:message_article_publie_prepa');
108                                }
109                        }
110                        spip_log($valeurs['message_ok']);
111                }
112                if(($valeurs['editable'] == true) && (_request('valider'))){
113                        spip_log("EM : On récupÚre les valeurs des inputs pour les recharger dans le formulaire");
114                        $valeurs = diogene_recuperer_champs();
115                        $valeurs['titre'] = _request('titre');
116                        $valeurs['id_rubrique'] = _request('rubrique');
117                        $valeurs['selecteur_langue'] = true;
118                        $valeurs['id_article'] = $id_article;
119                        $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
120                        foreach($groupes_possibles as $groupe){
121                                $valeurs['groupe_'.$groupe]     = sql_fetsel('mot.id_mot','spip_mots as mot left join spip_mots_articles as mots_articles ON (mot.id_mot=mots_articles.id_mot)','mots_articles.id_article='.intval($id_article).' AND mot.id_groupe='.intval($groupe));
122                        }
123                        $post_valeurs = pipeline('diogene_ajout_media_post_charger',
124                                array(
125                                        'args' => array(
126                                                'id_article' => $id_article,
127                                                'mode' => 'rechargement',
128                                                'valeurs' => $valeurs
129                                        ),
130                                        'data' => array()
131                                )
132                        );
133                        // L'article est publiable uniquement si un document associé existe
134                        $validable = sql_getfetsel("doc_objet.id_document","spip_documents_liens AS doc_objet LEFT JOIN spip_documents as doc ON (doc.id_document=doc_objet.id_document)","doc_objet.id_objet = '$id_article' AND doc_objet.objet='article'");
135
136                        if (intval($validable)) {
137                                $valeurs['selecteur_statut'] = $config['statut_visible'];
138                                spip_log("EM : selecteur_statut = ".$config['statut_visible'],"diogene");
139                                $valeurs['statut'] = _request('statut') ? _request('statut') : 'prepa';
140                        }
141                        if(is_array($post_valeurs)){
142                                $valeurs = array_merge($valeurs,$post_valeurs);
143                        }
144                }
145                else if ($valeurs['editable'] == true){
146                        $valeurs['formulaire_langue'] = true;
147                }
148                $valeurs['objet_type'] = $type;
149        }
150        if(_request('page') == 'inc-emballe_media_form'){
151                $valeurs['action'] = str_replace('&amp;','&',_request('redirect'));
152        }
153
154        return $valeurs;
155}
156
157function formulaires_diogene_verifier_dist($id_article='new',$id_rubrique=0, $lier_trad=0,$type='normal',$redirect=''){
158        //initialise le tableau des erreurs
159        $erreurs = array();
160
161    //initilise le tableau de valeurs $champs => $valeur
162    $valeurs = array();
163
164        //récupere la liste des champs possible
165        $champs = diogene_champs_textes();
166
167        $longueur_titre = 3;
168        $longueur_texte = lire_config('diogene/texte/textearticle_taille', 30);
169
170        //gere la correspondance champs -> _request(champs)
171        foreach($champs as $clef => $valeur) {
172                $valeurs[$valeur] = _request($valeur);
173        }
174
175        //verifier les champs obligatoires
176        foreach ($valeurs as $champs => $valeur) {
177                if ((lire_config('diogene/texte/'.$champs.'_obligatoire') == 'on') && empty($valeur)) {
178                        spip_log("$champs : ".lire_config('diogene/texte/'.$champs.'_obligatoire'));
179                        $erreurs[$champs] = _T('emballe_medias:champ_obligatoire');
180                }
181                else if(($length = lire_config('diogene/texte/'.$champs.'_taille') > 0) && (strlen($valeur) < $length)){
182                        spip_log("$champs : ".lire_config('diogene/texte/'.$champs.'_taille'));
183                        $erreurs[$champs] = _T('emballe_medias:champs_trop_court',array('nombre'=>$length));
184                }
185                spip_log("EM : $champs - ".$erreurs[$champs]);
186        }
187        if(!_request('titre')){
188                $erreurs['titre'] = _T('emballe_medias:titre_obligatoire');
189        }
190        else if(strlen(_request('titre'))<$longueur_titre){
191                $erreurs['titre']= _T('emballe_medias:titre_trop_court',array('nombre'=>$longueur_titre));
192        }
193
194        /*
195         * On teste si les groupes obligatoires sont ok
196         */
197        if(is_array(lire_config('diogene/texte/mots_obligatoires'))){
198                foreach(lire_config('diogene/texte/mots_obligatoires') as $groupe_obligatoire){
199                        $mots_groupe = _request('groupe_'.$groupe_obligatoire);
200                        if(empty($mots_groupe)){
201                                $erreurs['groupe_'.$groupe_obligatoire] = _T('emballe_medias:champ_obligatoire');
202                        }
203                }
204        }
205        $erreurs = pipeline('diogene_ajout_media_post_verifier',
206                                array(
207                                        'args' => array(
208                                                'erreurs' => $erreurs,
209                                                'valeurs' => $valeurs
210                                        ),
211                                        'data' => $erreurs
212                                )
213                        );
214
215
216        if (count($erreurs)) $erreurs['message_erreur'] = _T('emballe_medias:verifier_formulaire');
217        return $erreurs;
218}
219
220// http://doc.spip.org/@inc_editer_article_dist
221function formulaires_diogene_traiter_dist($id_article='new',$id_rubrique=0, $lier_trad=0,$type='normal',$redirect=''){
222        include_spip('base/abstract_sql');
223        $invalider = false;
224        $config = lire_config('diogene/statuts/');
225
226        $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
227
228        // si dans le charger() on avait trouve un id_article deja exisant, il se trouve
229        // dans le parametre diogenet_id_article
230        if ($art = _request('diogene_id_article')) {
231                $id_article = $art;
232        }
233
234    //initialise le tableau de valeurs $champs => $valeur
235    $valeurs = array();
236
237        //récupere la liste des champs possible
238        $champs = diogene_champs_textes();
239
240        //gere la correspondance champs -> _request(champs)
241        foreach($champs as $clef => $valeur) {
242                $valeurs[$valeur] = _request($valeur);
243        }
244
245        $valeurs['titre'] = _request('titre');
246        $valeurs['texte'] = $valeurs['textearticle'];
247        unset($valeurs['textearticle']);
248
249        $valeurs['id_rubrique'] = _request('rubrique') ? _request('rubrique') : $id_rubrique;
250        unset($valeurs['rubrique']);
251
252        if(lire_config('diogene/statuts/statut_visible') != 'on'){
253                $valeurs['statut'] = lire_config('diogene/statuts/statut_article_defaut');
254        }else{
255                $valeurs['statut'] = _request('statut',lire_config('diogene/statuts/statut_article_defaut'));
256        }
257
258        // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
259        // dans la premiere rubrique racine
260        if (!$valeurs['id_rubrique'] OR ($id_rubrique == 0) OR !intval($id_rubrique)) {
261                $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
262                $id_rubrique = $row['id_rubrique'];
263        } else $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");
264
265        $id_secteur = $row['id_secteur'];
266        $lang_rub = $row['lang'];
267
268        $lang = _request('choix_langue');
269
270        if($lang){
271                $choisie = 'oui';
272        }
273        // La langue a la creation : si les liens de traduction sont autorises
274        // dans les rubriques, on essaie avec la langue de l'auteur,
275        // ou a defaut celle de la rubrique
276        // Sinon c'est la langue de la rubrique qui est choisie + heritee
277        else{
278                if ($GLOBALS['meta']['multi_articles'] == 'oui') {
279                        lang_select($GLOBALS['visiteur_session']['lang']);
280                        if (in_array($GLOBALS['spip_lang'],
281                        explode(',', $GLOBALS['meta']['langues_multilingue']))) {
282                                $lang = $GLOBALS['spip_lang'];
283                                $choisie = 'oui';
284                        }
285                }
286                if (!$lang) {
287                        $choisie = 'non';
288                        $lang = $lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site'];
289                }
290        }
291
292        if(lire_config('emballe_medias/types/gerer_types') == 'on'){
293                $valeurs['objet_type'] = $type;
294        }else{
295                $valeurs['objet_type'] = 'normal';
296        }
297
298        $valeurs['lang'] = $lang;
299        $valeurs['langue_choisie'] = $choisie;
300
301        $valeurs['accepter_forum'] = substr($GLOBALS['meta']['forums_publics'],0,3);
302
303        // Dans le cas de la création d'un nouvel article
304        // NB trouver la fonction d'insertion d'articles plutot
305        if($id_article == 'new'){
306                include_spip('action/editer_article');
307
308                $rubriques = lire_config('diogene/texte/rubrique',array(0=>1));
309                $id_parent = lire_config('diogene/texte/rubrique_defaut', $rubriques[0]);
310                $id_article = insert_article($id_parent);
311
312                $message_ok = _T('emballe_medias:fin_article_cree');
313                $editable = false;
314                $invalider = true;
315                $valeurs['formulaire_documents'] = true;
316
317                /*
318                 * On traite les mots clés obligatoires ou pas
319                 * Les mots ne devraient pas être dans $valeurs
320                 */
321                $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
322                /*
323                 * On traite chaque groupe séparément
324                 * L'article est nouveau donc on ne fait pas de vérification sur les mots
325                 */
326                foreach($groupes_possibles as $groupe){
327                        /*
328                         * Si le select est multiple
329                         */
330                        if(is_array(_request('groupe_'.$groupe))){
331                                foreach(_request('groupe_'.$groupe) as $cle => $mot){
332                                        sql_insertq('spip_mots_articles', array('id_mot' =>$mot,  'id_article' => $id_article));
333                                }
334                        }
335                        /*
336                         * Si le select est simple
337                         */
338                        else{
339                                sql_insertq('spip_mots_articles', array('id_mot' =>_request('groupe_'.$groupe),  'id_article' => $id_article));
340                        }
341                        pipeline('post_edition',
342                                array(
343                                        'args' => array(
344                                                'operation' => 'editer_mots',
345                                                'table' => 'spip_articles',
346                                                'id_objet' => $id_article
347                                        ),
348                                        'data' => null
349                                )
350                        );
351                }
352        }
353        // Dans le cas de la traduction d'un article
354        // NB : Trouver la fonction de traduction d'un article plutot
355        else if($lier_trad != 0){
356                $valeurs['id_trad'] = $lier_trad;
357                $id_article = sql_insertq("spip_articles", $valeurs);
358                        // controler si le serveur n'a pas renvoye une erreur
359                if ($id_article > 0)
360                        sql_insertq('spip_auteurs_articles', array('id_auteur' => $GLOBALS['visiteur_session']['id_auteur'], 'id_article' => $id_article));
361
362                $invalider = true;
363                $message_ok = _T('emballe_medias:fin_article_traduire');
364        }
365        // Cas de la modification d'un article
366        else{
367                // Méthode reprise depuis ecrire/action/editer_article.php
368                $err = '';
369
370                /*
371                 * On traite les mots clés obligatoires ou pas
372                 * Les mots ne devraient pas être dans $valeurs
373                 */
374                include_spip('inc/editer_mots');
375                $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
376
377                /*
378                 * On traite chaque groupe séparément
379                 * L'article n'est pas nouveau, donc il se peut qu'il faille supprimer les anciens mots
380                 * On fait une vérifications sur chaque groupe
381                 */
382                foreach($groupes_possibles as $groupe){
383                        $mots = sql_fetsel('mot.id_mot','spip_mots as mot left join spip_mots_articles as articles ON mot.id_mot=articles.id_mot','id_groupe='.intval($groupe).' AND id_article='.intval($id_article));
384                        /*
385                         * Si le select est multiple
386                         */
387                        if(is_array(_request('groupe_'.$groupe))){
388                                foreach(_request('groupe_'.$groupe) as $cle => $mot){
389                                        /*
390                                         * Si le mot est déja dans les mots, on le supprime juste
391                                         * de l'array des mots originaux
392                                         */
393                                        if(in_array($mot, $mots)){
394                                                unset($mots[$cle]);
395                                        }
396                                        else{
397                                                sql_insertq('spip_mots_articles', array('id_mot' =>$mot,  'id_article' => $id_article));
398                                        }
399                                }
400                        }
401                        /*
402                         * Si le select est simple
403                         */
404                        else{
405                                if(!is_array($mots)){
406                                        $mots_tmp[] = $mots;
407                                        $mots = $mots_tmp;
408                                }
409                                if(in_array(_request('groupe_'.$groupe), $mots)){
410                                        unset($mots);
411                                }
412                                else{
413                                        sql_insertq('spip_mots_articles', array('id_mot' =>_request('groupe_'.$groupe),  'id_article' => $id_article));
414                                }
415                        }
416                        /*
417                         * S'il reste quelque chose dans les mots d'origine, on les délie d l'article
418                         */
419                        if(count($mots)>0){
420                                spip_log('on supprime des mots','emballe_media');
421                                spip_log($mots);
422                                sql_delete('spip_mots_articles','id_article='.intval($id_article).' AND id_mot IN ('.implode(',',$mots).')');
423                        }
424                }
425                include_spip('inc/modifier');
426                revision_article($id_article, $valeurs);
427
428                // Modification de statut, changement de rubrique ?
429                include_spip('action/editer_article');
430                $c = array('date' => $valeurs['date'],'statut' => $valeurs['statut'], 'id_parent' => $valeurs['id_rubrique']);
431                $err .= instituer_article($id_article, $c);
432
433                $invalider = false; // L'invalidation a déja été faite dans instituer_article
434                $message_ok = _T('emballe_medias:fin_article_update');
435        }
436
437        if($invalider){
438                include_spip('inc/invalideur');
439                suivre_invalideur("1",true);
440        }
441
442        $res = array();
443
444        if($valeurs['statut'] == 'publie'){
445                $redirect = generer_url_entite($id_article,'article');
446        }
447        if(($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prop')){
448                $message_ok = $message_ok.'<br />'._T('diogene:message_article_prop_prop');
449        }
450        else if (($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prepa')){
451                $message_ok = $message_ok.'<br />'._T('diogene:message_article_prop_prepa');
452        }
453        else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'prepa')){
454                $message_ok = $message_ok.'<br />'._T('diogene:message_article_publie_prepa');
455        }
456        else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'publie')){
457                $message_ok = $message_ok.'<br />'._T('diogene:message_voir_en_ligne',array('url'=>$redirect));
458        }
459
460        $res['redirect'] = $redirect;
461        $res['message_ok'] = $message_ok;
462        $res['editable'] = true;
463
464        $res = pipeline('diogene_ajout_media_post_traiter',
465                array(
466                        'args' => array(
467                                'id_article' => $id_article,
468                                'valeurs' => $valeurs
469                        ),
470                        'data' => $res,
471                )
472        );
473        return $res;
474}
475
476/**
477 * RécupÚre l'ensemble des champs textes de la configuration
478 * Retourne un array des champs disponibles dans le formulaire
479 *
480 * @return array
481 */
482function diogene_champs_textes() {
483        //charge les valeurs de chaque champs proposés dans le formulaire
484        foreach (lire_config('diogene/texte/') as $clef => $valeur) {
485                preg_match('/^(.*)(?:_obligatoire)/i', $clef, $resultat);
486
487                if ((!empty($resultat[1])) && (lire_config('diogene/texte/'.$resultat[1]) == 'on')) {
488                        $valeurs[] = $resultat[1];
489                }
490        }
491        $autres_champs = pipeline('diogene_champs_texte',
492                array(
493                        'args' => array(
494                                'valeurs' => $valeurs
495                        ),
496                        'data' => array()
497                )
498        );
499        if(is_array($autres_champs)){
500                $valeurs = array_merge($valeurs,$autres_champs);
501        }
502        return $valeurs;
503}
504
505
506/**
507 * RécupÚre les champs de textes de la configuration.
508 * Retourne un array bidimentionnel en récupérant la valeur postée depuis le formulaire
509 *
510 * @return array
511 */
512function diogene_recuperer_champs(){
513        foreach (lire_config('diogene/texte/') as $clef => $valeur) {
514                preg_match('/^(.*)(?:_obligatoire)/i', $clef, $resultat);
515                $valeurs[$resultat[1]] = _request($resultat[1]);
516        }
517        return $valeurs;
518}
519?>
Note: See TracBrowser for help on using the repository browser.