source: plugins_spip/import_video/emballe_medias/formulaires/em_ajouter_media.php @ 2648

Last change on this file since 2648 was 2648, checked in by kent1, 10 years ago

On passe l'id_article au retour du formualaire (utile pour certains sous plugins spipicious)

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