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

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

Le nouveau diogène ... on crée des templates d'articles maintenant

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