[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / action / referencer_traduction.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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 * Gestion de l'action referencer_traduction gérant les liens de traductions
15 *
16 * @package SPIP\Core\Action
17 */
18
19 if (!defined('_ECRIRE_INC_VERSION')) {
20 return;
21 }
22
23 /**
24 * Définir le lien de traduction vers un objet de réference
25 *
26 * Plusieurs cas :
27 * - id_trad=0 : déréference le lien de traduction de id_objet
28 * - id_trad=NN : référence le lien de traduction de id_objet vers NN
29 * - id_objet=id_trad actuel et id_trad=new_id_trad : modifie la référence
30 * de tout le groupe de traduction
31 *
32 * @param string $objet
33 * Type d'objet
34 * @param int $id_objet
35 * Identifiant de l'objet
36 * @param int $id_trad
37 * Identifiant de la référence de traduction
38 * @return bool
39 * - False si on ne trouve pas l'objet de référence
40 * - True sinon
41 */
42 function action_referencer_traduction_dist($objet, $id_objet, $id_trad) {
43
44 // ne rien faire si id_trad est ambigu
45 if (!is_numeric($id_trad)) {
46 return false;
47 }
48
49 $table_objet_sql = table_objet_sql($objet);
50 $id_table_objet = id_table_objet($objet);
51
52 // on a fourni un id_trad : affectation ou modification du groupe de trad
53 if ($id_trad) {
54 // selectionner l'objet cible, qui doit etre different de nous-meme,
55 // et quitter s'il n'existe pas
56 $id_lier = sql_getfetsel('id_trad', $table_objet_sql,
57 "$id_table_objet=" . intval($id_trad) . " AND NOT($id_table_objet=" . intval($id_objet) . ")");
58 if ($id_lier === null) {
59 spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)");
60
61 return false;
62 }
63
64 // $id_lier est le numero du groupe de traduction
65 // Si l'objet vise n'est pas deja traduit, son identifiant devient
66 // le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux
67 // objets
68 if ($id_lier == 0) {
69 sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "$id_table_objet IN ($id_trad, $id_objet)");
70 } // si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad
71 elseif ($id_lier == $id_objet) {
72 sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "id_trad = $id_lier");
73 } // sinon ajouter notre objet dans le groupe
74 else {
75 sql_updateq($table_objet_sql, array("id_trad" => $id_lier), "$id_table_objet=" . intval($id_objet));
76 }
77 } // on a fourni un id_trad nul : sortir id_objet du groupe de trad
78 else {
79 $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=" . intval($id_objet));
80 // supprimer le lien de traduction
81 sql_updateq($table_objet_sql, array("id_trad" => 0), "$id_table_objet=" . intval($id_objet));
82
83 // Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero.
84 $cpt = sql_countsel($table_objet_sql, "id_trad=" . intval($old_id_trad));
85 if ($cpt == 1) {
86 sql_updateq($table_objet_sql, array("id_trad" => 0), "id_trad=" . intval($old_id_trad));
87 }
88 }
89
90 return true;
91 }