PageRenderTime 38ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/main/class/class_group.php

http://github.com/FSB/Fire-Soft-Board-2
PHP | 412 lines | 274 code | 40 blank | 98 comment | 46 complexity | 18af94ebc60ae7ac018d013b14395cc0 MD5 | raw file
  1. <?php
  2. /**
  3. * Fire-Soft-Board version 2
  4. *
  5. * @package FSB2
  6. * @author Genova <genova@fire-soft-board.com>
  7. * @version $Id$
  8. * @license http://opensource.org/licenses/gpl-2.0.php GNU GPL 2
  9. */
  10. /**
  11. * Methodes permettants de gerer les groupes du forum (ajout, validation, suppression, etc..)
  12. */
  13. class Group extends Fsb_model
  14. {
  15. /**
  16. * Ajoute un groupe
  17. *
  18. * @param array $data Tableau d'informations sur le groupe (g_name, g_description, etc..)
  19. * @param array $modo_idx Tableau d'ID des moderateurs
  20. */
  21. public static function add($data, $modo_idx)
  22. {
  23. Fsb::$db->insert('groups', $data);
  24. $group_id = Fsb::$db->last_id();
  25. self::update_moderators($group_id, $data['g_type'], $modo_idx, $data['g_rank']);
  26. Fsb::$db->destroy_cache('groups_');
  27. }
  28. /**
  29. * Edite un groupe
  30. *
  31. * @param int $group_id ID du groupe
  32. * @param array $data Tableau d'informations sur le groupe (g_name, g_description, etc..)
  33. * @param array $modo_idx Tableau d'ID des moderateurs
  34. */
  35. public static function edit($group_id, $data, $modo_idx)
  36. {
  37. Fsb::$db->update('groups', $data, 'WHERE g_id = ' . $group_id);
  38. self::update_moderators($group_id, $data['g_type'], $modo_idx, $data['g_rank']);
  39. Fsb::$db->destroy_cache('groups_');
  40. // Mise a jour de la couleur
  41. $sql = 'SELECT u_id
  42. FROM ' . SQL_PREFIX . 'groups_users
  43. WHERE g_id = ' . $group_id;
  44. $result = Fsb::$db->query($sql);
  45. $idx = array();
  46. while ($row = Fsb::$db->row($result))
  47. {
  48. $idx[] = $row['u_id'];
  49. }
  50. Fsb::$db->free($result);
  51. if ($idx)
  52. {
  53. self::update_colors($idx);
  54. }
  55. }
  56. /**
  57. * Mise a jour des moderateurs et des rangs du groupe
  58. *
  59. * @param int $group_id ID du groupe
  60. * @param int $group_type Type du groupe
  61. * @param array $modo_idx Tableau d'ID des moderateurs
  62. * @param int $group_rank ID du rang du groupe
  63. */
  64. public static function update_moderators($group_id, $group_type, $modo_idx, $group_rank)
  65. {
  66. // Ajout / Suppression de moderateurs dans le grouoe
  67. if ($group_type != GROUP_SPECIAL && $modo_idx)
  68. {
  69. // Ajout des moderateurs dans le groupe
  70. self::add_users($modo_idx, $group_id, GROUP_MODO);
  71. // On passe en non moderateurs les autres membres du groupe
  72. Fsb::$db->update('groups_users', array(
  73. 'gu_status' => GROUP_USER,
  74. ), 'WHERE u_id NOT IN (' . implode(', ', $modo_idx) . ') AND gu_status = ' . GROUP_MODO . ' AND g_id = ' . $group_id);
  75. }
  76. else if ($group_type != GROUP_SPECIAL)
  77. {
  78. // Aucun moderateur de groupe
  79. Fsb::$db->update('groups_users', array(
  80. 'gu_status' => GROUP_USER,
  81. ), 'WHERE gu_status = ' . GROUP_MODO . ' AND g_id = ' . $group_id);
  82. }
  83. // Si un rang a ete cree, on assigne le rang aux membres du groupe sans rang
  84. if ($group_rank)
  85. {
  86. $sql = 'UPDATE ' . SQL_PREFIX . 'users
  87. SET u_rank_id = ' . $group_rank . '
  88. WHERE u_id IN (
  89. SELECT u_id
  90. FROM ' . SQL_PREFIX . 'groups_users
  91. WHERE g_id = ' . $group_id . '
  92. ) AND u_rank_id = 0';
  93. Fsb::$db->query($sql);
  94. }
  95. }
  96. /**
  97. * Supprime un groupe
  98. *
  99. * @param int $group_id ID du groupe
  100. */
  101. public static function delete($group_id)
  102. {
  103. // Membres du groupe
  104. $sql = 'SELECT u_id
  105. FROM ' . SQL_PREFIX . 'groups_users
  106. WHERE g_id = ' . $group_id;
  107. $result = Fsb::$db->query($sql);
  108. $idx = array();
  109. while ($row = Fsb::$db->row($result))
  110. {
  111. $idx[] = $row['u_id'];
  112. }
  113. Fsb::$db->free($result);
  114. // Suppressions des donnees du groupe
  115. $sql = 'DELETE FROM ' . SQL_PREFIX . 'groups
  116. WHERE g_id = ' . $group_id;
  117. Fsb::$db->query($sql);
  118. $sql = 'DELETE FROM ' . SQL_PREFIX . 'groups_users
  119. WHERE g_id = ' . $group_id ;
  120. Fsb::$db->query($sql);
  121. $sql = 'DELETE FROM ' . SQL_PREFIX . 'groups_auth
  122. WHERE g_id = ' . $group_id;
  123. Fsb::$db->query($sql);
  124. Fsb::$db->destroy_cache('groups_');
  125. // On regarde si les membres changent de status (moderateur ou non)
  126. self::update_auths($idx);
  127. }
  128. /**
  129. * Ajoute un ou plusieurs utilisateurs a un groupe
  130. *
  131. * @param array $idx ID ou tableau d'ID de utilisateurs
  132. * @param int $group_id ID du groupe
  133. * @param int $state Status du membre dans le groupe (GROUP_MODO | GROUP_USER | GROUP_WAIT)
  134. * @param bool $update Mise a jour ou non des autorisations des membres
  135. * @param bool $is_single_groupe true s'il s'agit d'un membre unique, dans ce cas on ne met pas a jour le groupe par defaut
  136. * @param bool $update_default true si on souhaite mettre a jour le groupe par defaut
  137. */
  138. public static function add_users($idx, $group_id, $state, $update = true, $is_single_groupe = false, $update_default = true)
  139. {
  140. if (!is_array($idx))
  141. {
  142. $idx = array($idx);
  143. }
  144. if (!$idx)
  145. {
  146. return ;
  147. }
  148. // Ajout des utilisateurs
  149. foreach ($idx AS $id)
  150. {
  151. if ($id == VISITOR_ID)
  152. {
  153. continue;
  154. }
  155. Fsb::$db->insert('groups_users', array(
  156. 'g_id' => array($group_id, true),
  157. 'u_id' => array($id, true),
  158. 'gu_status' => $state,
  159. ), 'REPLACE', true);
  160. }
  161. Fsb::$db->query_multi_insert();
  162. // Mise a jour du groupe par defaut de ces utilisateurs, s'ils etaient sans groupe.
  163. if (!self::is_special_group($group_id) && !$is_single_groupe && $update_default)
  164. {
  165. Fsb::$db->update('users', array(
  166. 'u_default_group_id' => $group_id,
  167. ), 'WHERE u_id IN (' . implode(', ', $idx) . ') AND u_default_group_id = ' . GROUP_SPECIAL_USER);
  168. }
  169. // Si les membres ajoutes sont en attentes, inutile de recalculer leurs autorisations
  170. if ($update && $state != GROUP_WAIT)
  171. {
  172. self::update_auths($idx);
  173. }
  174. }
  175. /**
  176. * Supprime une ou plusieurs utilisateurs d'un groupe
  177. *
  178. * @param array $idx ID ou tableau d'ID de utilisateurs
  179. * @param int $group_id ID du groupe
  180. * @param bool $update Mise a jour ou non des autorisations des membres
  181. * @param bool $delete_modo Suppression des moderateurs du groupe ?
  182. */
  183. public static function delete_users($idx, $group_id, $update = true, $delete_modo = true)
  184. {
  185. if (!is_array($idx))
  186. {
  187. $idx = array($idx);
  188. }
  189. $sql = 'DELETE FROM ' . SQL_PREFIX . 'groups_users
  190. WHERE g_id = ' . $group_id
  191. . (($idx) ? ' AND u_id IN (' . implode(', ', $idx) . ')' : '')
  192. . ((!$delete_modo) ? ' AND gu_status <> ' . GROUP_MODO : '');
  193. Fsb::$db->query($sql);
  194. if ($update)
  195. {
  196. self::update_auths($idx);
  197. }
  198. }
  199. /**
  200. * Met a jour le niveau d'autorisation des membres, leur groupe par defaut et leur couleur
  201. *
  202. * @param array $idx ID ou tableau d'ID d'utilisateurs. Si $idx est vide on met l'ensemble des utilisateurs du forum a jour.
  203. */
  204. public static function update_auths($idx = array())
  205. {
  206. if (!is_array($idx))
  207. {
  208. $idx = array($idx);
  209. }
  210. // On recupere la liste des groupes, leurs membres et si ce sont des groupes moderateurs
  211. $sql = 'SELECT g.g_id, gu.u_id, g.g_name, ga.f_id, ga.ga_moderator
  212. FROM ' . SQL_PREFIX . 'groups g
  213. INNER JOIN ' . SQL_PREFIX . 'groups_users gu
  214. ON g.g_id = gu.g_id
  215. LEFT JOIN ' . SQL_PREFIX . 'groups_auth ga
  216. ON g.g_id = ga.g_id
  217. WHERE g.g_id <> ' . GROUP_SPECIAL_USER . '
  218. AND gu.gu_status <> ' . GROUP_WAIT
  219. . (($idx) ? ' AND gu.u_id IN (' . implode(', ', $idx) . ')' : '');
  220. $result = Fsb::$db->query($sql);
  221. $list = array();
  222. while ($row = Fsb::$db->row($result))
  223. {
  224. if ($row['g_id'] == GROUP_SPECIAL_ADMIN)
  225. {
  226. $list[$row['u_id']] = ADMIN;
  227. }
  228. else if ($row['g_id'] == GROUP_SPECIAL_MODOSUP && (!isset($list[$row['u_id']]) || $list[$row['u_id']] < MODOSUP))
  229. {
  230. $list[$row['u_id']] = MODOSUP;
  231. }
  232. else if ($row['ga_moderator'] && (!isset($list[$row['u_id']]) || $list[$row['u_id']] < MODO))
  233. {
  234. $list[$row['u_id']] = MODO;
  235. }
  236. }
  237. Fsb::$db->free($result);
  238. // On regroupe les membres par type de groupes
  239. $newlist = array(ADMIN => array(), MODOSUP => array(), MODO => array());
  240. foreach ($list AS $user_id => $auth)
  241. {
  242. $newlist[$auth][] = $user_id;
  243. }
  244. $list_users = array_keys($list);
  245. // On recupere la liste des moderateurs et de leurs groupes speciaux
  246. $sql = 'SELECT u_id, u_auth, u_default_group_id
  247. FROM ' . SQL_PREFIX . 'users
  248. WHERE u_auth >= ' . MODO;
  249. $result = Fsb::$db->query($sql);
  250. $modo_groups = array();
  251. while ($row = Fsb::$db->row($result))
  252. {
  253. $modo_groups[$row['u_id']] = array(
  254. 'group' => $row['u_default_group_id'],
  255. 'auth' => $row['u_auth'],
  256. );
  257. }
  258. Fsb::$db->free($result);
  259. // Tous les membres concernes repassent en status membre (sauf le fondateur)
  260. Fsb::$db->update('users', array(
  261. 'u_auth' => USER,
  262. ), 'WHERE u_id <> ' . VISITOR_ID . ' AND u_auth < ' . FONDATOR . (($idx) ? ' AND u_id IN (' . implode(',', $idx) . ')' : ''));
  263. // Le visiteur redevient à son tour visiteur, au cas où il
  264. // aurait reçu des droits de modération avant
  265. Fsb::$db->update('users', array(
  266. 'u_auth' => VISITOR,
  267. ), 'WHERE u_id = ' . VISITOR_ID);
  268. // Mise a jour des administrateurs, moderateurs globaux et moderateurs
  269. foreach (array(ADMIN => GROUP_SPECIAL_ADMIN, MODOSUP => GROUP_SPECIAL_MODOSUP, MODO => GROUP_SPECIAL_MODO) AS $auth_level => $auth_group)
  270. {
  271. self::delete_users($idx, $auth_group, false);
  272. if ($newlist[$auth_level])
  273. {
  274. Fsb::$db->update('users', array(
  275. 'u_auth' => $auth_level,
  276. ), 'WHERE u_id IN (' . implode(', ', $newlist[$auth_level]) . ') AND u_auth < ' . $auth_level);
  277. // Mise a jour des couleurs des membres
  278. $list = array();
  279. foreach ($modo_groups AS $def_id => $def_data)
  280. {
  281. if ($def_data['auth'] == $auth_level && $def_data['group'] != $auth_group)
  282. {
  283. $list[] = $def_id;
  284. }
  285. }
  286. $modo_groups_sql = ($list) ? ' AND u_id NOT IN (' . implode(', ', $list) . ') ' : '';
  287. Fsb::$db->update('users', array(
  288. 'u_default_group_id' => $auth_group,
  289. ), 'WHERE u_id IN (' . implode(', ', $newlist[$auth_level]) . ') ' . $modo_groups_sql . ' AND u_auth = ' . $auth_level);
  290. self::add_users($newlist[$auth_level], $auth_group, GROUP_USER, false);
  291. }
  292. }
  293. self::update_default($idx);
  294. self::update_colors($idx);
  295. Sync::signal(Sync::SESSION);
  296. Fsb::$db->destroy_cache('groups_auth_');
  297. }
  298. /**
  299. * Enter description here...
  300. *
  301. * @param array $idx ID ou tableau d'ID d'utilisateurs. Si $idx est vide on met l'ensemble des utilisateurs du forum a jour.
  302. */
  303. public static function update_default($idx = array())
  304. {
  305. if (!is_array($idx))
  306. {
  307. $idx = array($idx);
  308. }
  309. $sql = 'UPDATE ' . SQL_PREFIX . 'users
  310. SET u_default_group_id = ' . GROUP_SPECIAL_USER . '
  311. WHERE u_default_group_id NOT IN (
  312. SELECT g_id
  313. FROM ' . SQL_PREFIX . 'groups_users gu
  314. WHERE ' . SQL_PREFIX . 'users.u_id = gu.u_id
  315. ) ' . (($idx) ? ' AND u_id IN (' . implode(', ', $idx) . ')' : '');
  316. Fsb::$db->query($sql);
  317. }
  318. /**
  319. * Met a jour la couleur des utilisateurs en fonction de leur groupe par defaut
  320. *
  321. * @param array $idx ID ou tableau d'ID d'utilisateurs. Si $idx est vide on met l'ensemble des utilisateurs du forum a jour.
  322. */
  323. public static function update_colors($idx = array())
  324. {
  325. if (!is_array($idx))
  326. {
  327. $idx = array($idx);
  328. }
  329. switch (SQL_DBAL)
  330. {
  331. case 'pgsql' :
  332. $sql = 'UPDATE ' . SQL_PREFIX . 'users
  333. SET u_color = g_color
  334. FROM ' . SQL_PREFIX . 'groups
  335. WHERE u_default_group_id = g_id
  336. AND u_id <> ' . VISITOR_ID
  337. . (($idx) ? ' AND u_id IN (' . implode(', ', $idx) . ')' : '');
  338. break;
  339. default :
  340. $sql = 'UPDATE ' . SQL_PREFIX . 'users u, ' . SQL_PREFIX . 'groups g
  341. SET u.u_color = g.g_color
  342. WHERE u.u_default_group_id = g.g_id
  343. AND u.u_id <> ' . VISITOR_ID
  344. . (($idx) ? ' AND u.u_id IN (' . implode(', ', $idx) . ')' : '');
  345. break;
  346. }
  347. Fsb::$db->query($sql);
  348. // Mise a jour de la couleur du dernier membre inscrit
  349. if (!$idx || in_array(Fsb::$cfg->get('last_user_id'), $idx))
  350. {
  351. $sql = 'UPDATE ' . SQL_PREFIX . 'config
  352. SET cfg_value = (
  353. SELECT u_color
  354. FROM ' . SQL_PREFIX . 'users
  355. WHERE u_id = ' . Fsb::$cfg->get('last_user_id') . '
  356. ) WHERE cfg_name = \'last_user_color\'';
  357. Fsb::$db->query($sql);
  358. Fsb::$cfg->destroy_cache();
  359. }
  360. }
  361. /**
  362. * Verifie si un groupe est special
  363. *
  364. * @param int $group_id ID du groupe
  365. * @return bool
  366. */
  367. public static function is_special_group($group_id)
  368. {
  369. return (in_array($group_id, array(GROUP_SPECIAL_USER, GROUP_SPECIAL_MODO, GROUP_SPECIAL_MODOSUP, GROUP_SPECIAL_ADMIN)) ? true : false);
  370. }
  371. }
  372. /* EOF */