[SPIP] ~v3.2.5-->v3.2.7
[lhc/web/www.git] / www / plugins-dist / medias / action / ordonner_liens_documents.php
1 <?php
2
3 /**
4 * Action ordonnant un lien sur une table de liens
5 *
6 * @plugin Medias
7 * @copyright 2017
8 * @author Matthieu Marcillaud
9 * @licence GNU/GPL
10 * @package SPIP\Ordoc\Action
11 */
12
13 if (!defined('_ECRIRE_INC_VERSION')) {
14 return;
15 }
16
17 function action_ordonner_liens_documents_dist() {
18 action_ordonner_liens_dist();
19 }
20
21
22 function action_ordonner_liens_dist() {
23 include_spip('inc/autoriser');
24 include_spip('base/objets');
25 include_spip('action/editer_liens');
26
27 // source (table spip_xx_liens)
28 $objet = objet_type(_request('objet_source'));
29
30 // objet lié
31 $objet_lie = objet_type(_request('objet_lie'));
32 $id_objet_lie = intval(_request('id_objet_lie'));
33
34 // ordre des éléments
35 $ordre = _request('ordre');
36
37 if (!$objet or !$objet_lie or !$id_objet_lie or !$ordre or !is_array($ordre) or !objet_associable($objet)) {
38 return envoyer_json_erreur(_T('medias:erreur_objet_absent') . ' ' . _T('medias:erreur_deplacement_impossible'));
39 }
40
41 if (!autoriser('modifier', $objet_lie, $id_objet_lie)) {
42 return envoyer_json_erreur(_T('medias:erreur_autorisation') . ' ' . _T('medias:erreur_deplacement_impossible'));
43 }
44
45 list($_id_objet, $table_liens) = objet_associable($objet);
46
47 $success = $errors = array();
48
49 $actuels = sql_allfetsel(
50 array($_id_objet . ' AS id', 'rang_lien'),
51 $table_liens,
52 array(
53 sql_in($_id_objet, $ordre),
54 'objet = ' . sql_quote($objet_lie),
55 'id_objet = ' . sql_quote($id_objet_lie)
56 )
57 );
58
59 $futurs = array_flip($ordre);
60 // ordre de 1 à n (pas de 0 à n).
61 array_walk($futurs, function(&$v) { $v++; });
62
63 $updates = array();
64
65 foreach ($actuels as $l) {
66 if ($futurs[$l['id']] !== $l['rang_lien']) {
67 $updates[$l['id']] = $futurs[$l['id']];
68 }
69 }
70
71 if ($updates) {
72 foreach ($updates as $id => $ordre) {
73 sql_updateq(
74 $table_liens,
75 array('rang_lien' => $ordre),
76 array(
77 $_id_objet . ' = ' . $id,
78 'objet = ' . sql_quote($objet_lie),
79 'id_objet = ' . sql_quote($id_objet_lie)
80 )
81 );
82 }
83 }
84
85 return envoyer_json_envoi(array(
86 'done' => true,
87 'success' => $success,
88 'errors' => $errors,
89 ));
90 }
91
92 function envoyer_json_envoi($data) {
93 header('Content-Type: application/json; charset=' . $GLOBALS['meta']['charset']);
94 echo json_encode($data);
95 }
96
97 function envoyer_json_erreur($msg) {
98 return envoyer_json_envoi(array(
99 'done' => false,
100 'success' => array(),
101 'errors' => array($msg)
102 ));
103 }