[SPIP] v3.2.1-->v3.2.2
[lhc/web/www.git] / www / ecrire / inc / precharger_objet.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2019 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Préchargement les formulaires d'édition d'objets, notament pour les traductions
15 *
16 * @package SPIP\Core\Objets
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 include_spip('inc/autoriser'); // necessaire si appel de l'espace public
24
25
26 /**
27 * Retourne les valeurs à charger pour un formulaire d'édition d'un objet
28 *
29 * Lors d'une création, certains champs peuvent être préremplis
30 * (c'est le cas des traductions)
31 *
32 * @param string $type
33 * Type d'objet (article, breve...)
34 * @param string|int $id_objet
35 * Identifiant de l'objet, ou "new" pour une création
36 * @param int $id_rubrique
37 * Identifiant éventuel de la rubrique parente
38 * @param int $lier_trad
39 * Identifiant éventuel de la traduction de référence
40 * @param string $champ_titre
41 * Nom de la colonne SQL de l'objet donnant le titre : pas vraiment idéal !
42 * On devrait pouvoir le savoir dans la déclaration de l'objet
43 * @return array
44 * Couples clés / valeurs des champs du formulaire à charger.
45 **/
46 function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $champ_titre = 'titre') {
47
48 $table = table_objet_sql($type);
49 $_id_objet = id_table_objet($table);
50
51 // si l'objet existe deja, on retourne simplement ses valeurs
52 if (is_numeric($id_objet)) {
53 return sql_fetsel("*", $table, "$_id_objet=$id_objet");
54 }
55
56 // ici, on demande une creation.
57 // on prerempli certains elements : les champs si traduction,
58 // les id_rubrique et id_secteur si l'objet a ces champs
59 $desc = lister_tables_objets_sql($table);
60 # il faudrait calculer $champ_titre ici
61 $is_rubrique = isset($desc['field']['id_rubrique']);
62 $is_secteur = isset($desc['field']['id_secteur']);
63
64 // si demande de traduction
65 // on recupere les valeurs de la traduction
66 if ($lier_trad) {
67 if ($select = charger_fonction("precharger_traduction_" . $type, 'inc', true)) {
68 $row = $select($id_objet, $id_rubrique, $lier_trad);
69 } else {
70 $row = precharger_traduction_objet($type, $id_objet, $id_rubrique, $lier_trad, $champ_titre);
71 }
72 } else {
73 $row[$champ_titre] = '';
74 if ($is_rubrique) {
75 $row['id_rubrique'] = $id_rubrique;
76 }
77 }
78
79 // calcul de la rubrique
80 # note : comment faire pour des traductions sur l'objet rubriques ?
81 if ($is_rubrique) {
82 // appel du script a la racine, faut choisir
83 // admin restreint ==> sa premiere rubrique
84 // autre ==> la derniere rubrique cree
85 if (!$row['id_rubrique']) {
86 if ($GLOBALS['connect_id_rubrique']) {
87 $row['id_rubrique'] = $id_rubrique = current($GLOBALS['connect_id_rubrique']);
88 } else {
89 $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "", "", "id_rubrique DESC", 1);
90 $row['id_rubrique'] = $id_rubrique = $row_rub['id_rubrique'];
91 }
92 if (!autoriser('creerarticledans', 'rubrique', $row['id_rubrique'])) {
93 // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises
94 $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0");
95 while (!autoriser('creerarticledans', 'rubrique', $row['id_rubrique']) && $row_rub = sql_fetch($res)) {
96 $row['id_rubrique'] = $row_rub['id_rubrique'];
97 }
98 }
99 }
100 }
101
102 // recuperer le secteur, pour affecter les bons champs extras
103 if ($id_rubrique and $is_secteur) {
104 if (!$row['id_secteur']) {
105 $row_rub = sql_getfetsel("id_secteur", "spip_rubriques", "id_rubrique=" . sql_quote($id_rubrique));
106 $row['id_secteur'] = $row_rub;
107 }
108 }
109
110 return $row;
111 }
112
113
114 /**
115 * Récupère les valeurs d'une traduction de référence pour la création
116 * d'un objet (préremplissage du formulaire).
117 *
118 * @param string $type
119 * Type d'objet (article, breve...)
120 * @param string|int $id_objet
121 * Identifiant de l'objet, ou "new" pour une création
122 * @param int $id_rubrique
123 * Identifiant éventuel de la rubrique parente
124 * @param int $lier_trad
125 * Identifiant éventuel de la traduction de référence
126 * @param string $champ_titre
127 * Nom de la colonne SQL de l'objet donnant le titre
128 * @return array
129 * Couples clés / valeurs des champs du formulaire à charger
130 **/
131 function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $champ_titre = 'titre') {
132 $table = table_objet_sql($type);
133 $_id_objet = id_table_objet($table);
134
135 // Recuperer les donnees de l'objet original
136 $row = sql_fetsel("*", $table, "$_id_objet=$lier_trad");
137 if ($row) {
138 include_spip('inc/filtres');
139 $row[$champ_titre] = filtrer_entites(objet_T($type, 'info_nouvelle_traduction')) . ' ' . $row[$champ_titre];
140 } else {
141 $row = array();
142 }
143
144 // on met l'objet dans une rubrique si l'objet le peut
145 $desc = lister_tables_objets_sql($table);
146 $is_rubrique = isset($desc['field']['id_rubrique']);
147
148 if ($is_rubrique) {
149 if ($id_rubrique) {
150 $row['id_rubrique'] = $id_rubrique;
151
152 return $row;
153 }
154 $id_rubrique = $row['id_rubrique'];
155
156
157 // Regler la langue, si possible, sur celle du redacteur
158 // Cela implique souvent de choisir une rubrique ou un secteur
159 if (in_array($GLOBALS['spip_lang'],
160 explode(',', $GLOBALS['meta']['langues_multilingue']))) {
161
162 // Si le menu de langues est autorise sur l'objet,
163 // on peut changer la langue quelle que soit la rubrique
164 // donc on reste dans la meme rubrique
165 if (in_array($table, explode(',', $GLOBALS['meta']['multi_objets']))) {
166 $row['id_rubrique'] = $row['id_rubrique']; # explicite :-)
167
168 // Sinon, chercher la rubrique la plus adaptee pour
169 // accueillir l'objet dans la langue du traducteur
170 } elseif ($is_rubrique and $GLOBALS['meta']['multi_rubriques'] == 'oui') {
171 if ($GLOBALS['meta']['multi_secteurs'] == 'oui') {
172 $id_parent = 0;
173 } else {
174 // on cherche une rubrique soeur dans la bonne langue
175 $row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_rubrique");
176 $id_parent = $row_rub['id_parent'];
177 }
178
179 $row_rub = sql_fetsel("id_rubrique", "spip_rubriques",
180 "lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=$id_parent");
181 if ($row_rub) {
182 $row['id_rubrique'] = $row_rub['id_rubrique'];
183 }
184 }
185 }
186 }
187
188 return $row;
189 }