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

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

Un peu moins de log...
On invalide mieux...
Une erreur sur un lire_config d'emballe_medias qui au final ne devrait plus être là (dans un pipeline post_traiter certainement)

File size: 17.2 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        // charger une seule fois la config
8        $config = lire_config('diogene/statuts/');
9        if(!$id_auteur){
10                $valeurs['editable'] = false;
11                $valeurs['message_erreur'] = _T('emballe_medias:droits_insuffisants').'<br />'._T('emballe_medias:connection_obligatoire');
12        }
13
14        else{
15                $auteur_statut = $visiteur_session['statut'];
16
17                // on cherche un article deja existant seulement si la configuration le permet
18                if ($config['chercher_article']=='oui') {
19                        if(!intval($id_article)){
20                                $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");
21                                if(!intval($id_article)){
22                                        $id_article = 'new';
23                                }
24                        }
25                }
26
27                include_spip('inc/autoriser');
28                $auteur_info = $config['statuts'];
29
30                // On vérifie si l'auteur connecté a les droits nécessaires pour créer l'article
31                if(is_array($auteur_info)){
32                        if(autoriser('diogene_publier')){
33                                $valeurs['editable'] = true;
34                        }
35                        else{
36                                $valeurs['message_erreur'] = _T('emballe_medias:droits_insuffisants');
37                                $valeurs['editable'] = false;
38                        }
39                }
40                else{
41                        $valeurs['editable'] = false;
42                        $valeurs['message_erreur'] = _T('emballe_medias:configurer_auteurs');
43                }
44                if($valeurs['editable'] && ($id_article != 'new') && (!_request('valider'))){
45
46                        // Si l'article existe déjà, on récupÚre ses anciennes valeurs
47                        $valeurs = sql_fetsel("*","spip_articles","id_article=$id_article");
48
49                        // Le textarea pour le texte dans le public est dénommé textearticle
50                        $valeurs['textearticle'] = $valeurs['texte'];
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('emballe_medias:message_article_prop_prop');
98                                }
99                                else if (($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prepa')){
100                                        $valeurs['message_ok'] = _T('emballe_medias:message_article_prop_prepa');
101                                }
102                                else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'prepa')){
103                                        $valeurs['message_ok'] = _T('emballe_medias: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 = array();
153
154    //initilise 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        $invalider = true;
214        $config = lire_config('diogene/statuts/');
215
216        $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
217
218        // si dans le charger() on avait trouve un id_article deja exisant, il se trouve
219        // dans le parametre diogenet_id_article
220        if ($art = _request('diogene_id_article')) {
221                $id_article = $art;
222        }
223
224    //initialise le tableau de valeurs $champs => $valeur
225    $valeurs = array();
226
227        //récupere la liste des champs possible
228        $champs = diogene_champs_textes();
229
230        //gere la correspondance champs -> _request(champs)
231        foreach($champs as $clef => $valeur) {
232                $valeurs[$valeur] = _request($valeur);
233        }
234
235        $valeurs['titre'] = _request('titre');
236        $valeurs['texte'] = $valeurs['textearticle'];
237        unset($valeurs['textearticle']);
238
239        $valeurs['id_rubrique'] = _request('rubrique') ? _request('rubrique') : $id_rubrique;
240        unset($valeurs['rubrique']);
241
242        if(lire_config('diogene/statuts/statut_visible') != 'on'){
243                $valeurs['statut'] = lire_config('diogene/statuts/statut_article_defaut');
244        }else{
245                $valeurs['statut'] = _request('statut',lire_config('diogene/statuts/statut_article_defaut'));
246        }
247
248        // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
249        // dans la premiere rubrique racine
250        if (!$valeurs['id_rubrique'] OR ($id_rubrique == 0) OR !intval($id_rubrique)) {
251                $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1");
252                $id_rubrique = $row['id_rubrique'];
253        } else $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique");
254
255        $id_secteur = $row['id_secteur'];
256        $lang_rub = $row['lang'];
257
258        $lang = _request('choix_langue');
259
260        if($lang){
261                $choisie = 'oui';
262        }
263        // La langue a la creation : si les liens de traduction sont autorises
264        // dans les rubriques, on essaie avec la langue de l'auteur,
265        // ou a defaut celle de la rubrique
266        // Sinon c'est la langue de la rubrique qui est choisie + heritee
267        else{
268                if ($GLOBALS['meta']['multi_articles'] == 'oui') {
269                        lang_select($GLOBALS['visiteur_session']['lang']);
270                        if (in_array($GLOBALS['spip_lang'],
271                        explode(',', $GLOBALS['meta']['langues_multilingue']))) {
272                                $lang = $GLOBALS['spip_lang'];
273                                $choisie = 'oui';
274                        }
275                }
276                if (!$lang) {
277                        $choisie = 'non';
278                        $lang = $lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site'];
279                }
280        }
281
282        if(lire_config('emballe_medias/fichiers/gerer_types') == 'on'){
283                $valeurs['objet_type'] = $type;
284        }else{
285                $valeurs['objet_type'] = 'normal';
286        }
287
288        $valeurs['lang'] = $lang;
289        $valeurs['langue_choisie'] = $choisie;
290
291        $valeurs['accepter_forum'] = substr($GLOBALS['meta']['forums_publics'],0,3);
292
293        // Dans le cas de la création d'un nouvel article
294        // NB trouver la fonction d'insertion d'articles plutot
295        if($id_article == 'new'){
296                include_spip('action/editer_article');
297
298                $rubriques = lire_config('diogene/texte/rubrique',array(0=>1));
299                $id_parent = lire_config('diogene/texte/rubrique_defaut', $rubriques[0]);
300                $id_article = insert_article($id_parent);
301
302                $message_ok = _T('emballe_medias:fin_article_cree');
303                $editable = false;
304                $invalider = true;
305                $valeurs['formulaire_documents'] = true;
306
307                /*
308                 * On traite les mots clés obligatoires ou pas
309                 * Les mots ne devraient pas être dans $valeurs
310                 */
311                $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
312                /*
313                 * On traite chaque groupe séparément
314                 * L'article est nouveau donc on ne fait pas de vérification sur les mots
315                 */
316                foreach($groupes_possibles as $groupe){
317                        /*
318                         * Si le select est multiple
319                         */
320                        if(is_array(_request('groupe_'.$groupe))){
321                                foreach(_request('groupe_'.$groupe) as $cle => $mot){
322                                        sql_insertq('spip_mots_articles', array('id_mot' =>$mot,  'id_article' => $id_article));
323                                }
324                        }
325                        /*
326                         * Si le select est simple
327                         */
328                        else{
329                                sql_insertq('spip_mots_articles', array('id_mot' =>_request('groupe_'.$groupe),  'id_article' => $id_article));
330                        }
331                        pipeline('post_edition',
332                                array(
333                                        'args' => array(
334                                                'operation' => 'editer_mots',
335                                                'table' => 'spip_articles',
336                                                'id_objet' => $id_article
337                                        ),
338                                        'data' => null
339                                )
340                        );
341                }
342        }
343        // Dans le cas de la traduction d'un article
344        // NB : Trouver la fonction de traduction d'un article plutot
345        else if($lier_trad != 0){
346                $valeurs['id_trad'] = $lier_trad;
347                $id_article = sql_insertq("spip_articles", $valeurs);
348                        // controler si le serveur n'a pas renvoye une erreur
349                if ($id_article > 0)
350                        sql_insertq('spip_auteurs_articles', array('id_auteur' => $GLOBALS['visiteur_session']['id_auteur'], 'id_article' => $id_article));
351
352                $invalider = true;
353                $message_ok = _T('emballe_medias:fin_article_traduire');
354        }
355        // Cas de la modification d'un article
356        else{
357                // Méthode reprise depuis ecrire/action/editer_article.php
358                $err = '';
359
360                /*
361                 * On traite les mots clés obligatoires ou pas
362                 * Les mots ne devraient pas être dans $valeurs
363                 */
364                include_spip('inc/editer_mots');
365                $groupes_possibles = array_merge(lire_config('diogene/texte/mots_obligatoires',array()),lire_config('diogene/texte/mots_facultatifs',array()));
366
367                /*
368                 * On traite chaque groupe séparément
369                 * L'article n'est pas nouveau, donc il se peut qu'il faille supprimer les anciens mots
370                 * On fait une vérifications sur chaque groupe
371                 */
372                foreach($groupes_possibles as $groupe){
373                        $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));
374                        /*
375                         * Si le select est multiple
376                         */
377                        if(is_array(_request('groupe_'.$groupe))){
378                                foreach(_request('groupe_'.$groupe) as $cle => $mot){
379                                        /*
380                                         * Si le mot est déja dans les mots, on le supprime juste
381                                         * de l'array des mots originaux
382                                         */
383                                        if(in_array($mot, $mots)){
384                                                unset($mots[$cle]);
385                                        }
386                                        else{
387                                                sql_insertq('spip_mots_articles', array('id_mot' =>$mot,  'id_article' => $id_article));
388                                        }
389                                }
390                        }
391                        /*
392                         * Si le select est simple
393                         */
394                        else{
395                                if(!is_array($mots)){
396                                        $mots_tmp[] = $mots;
397                                        $mots = $mots_tmp;
398                                }
399                                if(in_array(_request('groupe_'.$groupe), $mots)){
400                                        unset($mots);
401                                }
402                                else{
403                                        sql_insertq('spip_mots_articles', array('id_mot' =>_request('groupe_'.$groupe),  'id_article' => $id_article));
404                                }
405                        }
406                        /*
407                         * S'il reste quelque chose dans les mots d'origine, on les délie d l'article
408                         */
409                        if(count($mots)>0){
410                                sql_delete('spip_mots_articles','id_article='.intval($id_article).' AND id_mot IN ('.implode(',',$mots).')');
411                        }
412                }
413                include_spip('inc/modifier');
414                revision_article($id_article, $valeurs);
415
416                // Modification de statut, changement de rubrique ?
417                include_spip('action/editer_article');
418                $c = array('date' => $valeurs['date'],'statut' => $valeurs['statut'], 'id_parent' => $valeurs['id_rubrique']);
419                $err .= instituer_article($id_article, $c);
420
421                $invalider = false; // L'invalidation a déja été faite dans instituer_article
422                $message_ok = _T('emballe_medias:fin_article_update');
423        }
424
425        $res = array();
426
427        if($valeurs['statut'] == 'publie'){
428                $redirect = generer_url_entite($id_article,'article');
429        }
430        if(($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prop')){
431                $message_ok = $message_ok.'<br />'._T('diogene:message_article_prop_prop');
432        }
433        else if (($config['statut_article'] == 'prop') && ($valeurs['statut'] == 'prepa')){
434                $message_ok = $message_ok.'<br />'._T('diogene:message_article_prop_prepa');
435        }
436        else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'prepa')){
437                $message_ok = $message_ok.'<br />'._T('diogene:message_article_publie_prepa');
438        }
439        else if(($config['statut_article'] == 'publie') && ($valeurs['statut'] == 'publie')){
440                $message_ok = $message_ok.'<br />'._T('diogene:message_voir_en_ligne',array('url'=>$redirect));
441        }
442
443        $res['redirect'] = $redirect ? $redirect : self();
444        $res['message_ok'] = $message_ok;
445        $res['editable'] = true;
446
447        $res = pipeline('diogene_ajout_media_post_traiter',
448                array(
449                        'args' => array(
450                                'id_article' => $id_article,
451                                'valeurs' => $valeurs
452                        ),
453                        'data' => $res,
454                )
455        );
456
457        if($invalider){
458                include_spip('inc/invalideur');
459                suivre_invalideur("id='id_article/$id_article'",true);
460        }
461        return $res;
462}
463
464/**
465 * RécupÚre l'ensemble des champs textes de la configuration
466 * Retourne un array des champs disponibles dans le formulaire
467 *
468 * @return array
469 */
470function diogene_champs_textes() {
471        //charge les valeurs de chaque champs proposés dans le formulaire
472        foreach (lire_config('diogene/texte/') as $clef => $valeur) {
473                preg_match('/^(.*)(?:_obligatoire)/i', $clef, $resultat);
474
475                if ((!empty($resultat[1])) && (lire_config('diogene/texte/'.$resultat[1]) == 'on')) {
476                        $valeurs[] = $resultat[1];
477                }
478        }
479        $autres_champs = pipeline('diogene_champs_texte',
480                array(
481                        'args' => array(
482                                'valeurs' => $valeurs
483                        ),
484                        'data' => array()
485                )
486        );
487        if(is_array($autres_champs)){
488                $valeurs = array_merge($valeurs,$autres_champs);
489        }
490        return $valeurs;
491}
492
493
494/**
495 * RécupÚre les champs de textes de la configuration.
496 * Retourne un array bidimentionnel en récupérant la valeur postée depuis le formulaire
497 *
498 * @return array
499 */
500function diogene_recuperer_champs(){
501        foreach (lire_config('diogene/texte/') as $clef => $valeur) {
502                preg_match('/^(.*)(?:_obligatoire)/i', $clef, $resultat);
503                $valeurs[$resultat[1]] = _request($resultat[1]);
504        }
505        return $valeurs;
506}
507?>
Note: See TracBrowser for help on using the repository browser.