$value) { $return[$key] = trim($value); } return $return; } /** * Ajoute des accès à un tableau existant. * * @param string $_string Les accès à ajouter. * @param array $_array Le tableau existant. * @return array Le tableau mis à jour. */ private static function addInArray(string $_string, array $_array) { return array_unique(array_merge(self::splitAccess($_string), $_array)); } /** * Récupère la liste des types d'utilisateurs, avec des exceptions optionnelles. * * @param array|null $_idExceptions Les IDs à exclure (optionnel). * @return array|bool La liste des types ou FALSE en cas d'erreur. */ public static function getListTypeUser(?array $_idExceptions = NULL ) { $return = array(); db::query("SELECT id, type FROM " . DB_T_TYPE_USER); try { $return = []; foreach (db::resultset() as $value) { if(is_null($_idExceptions) OR (!is_null($_idExceptions) AND !in_array($value["id"], $_idExceptions)) ){ $return[$value["id"]] = $value["type"]; } } return $return; } catch (Exception $e) { return FALSE; } } /** * Affiche une ligne de tableau pour les accès. * * @param array $valueAccess Les données d'accès. * @return void */ public static function printRenderAccessRow(array $valueAccess){ if (!is_null($valueAccess["exception"])) { $tooltip = ''; } else { $tooltip = ''; } echo ''; echo '' . $valueAccess["label"] . $tooltip . ''; $tmp = []; foreach ($valueAccess["access"] as $keyRole => $valueRole) { $tmp[$keyRole] = '
'; $tmp[$keyRole] .= self::getSelectAccess($valueAccess["access"][$keyRole], $valueAccess["exception"]); $tmp[$keyRole] .= '
'; } echo $tmp[1]; // Administrateur echo $tmp[4]; // Modérateur du CMS echo $tmp[5]; // Bureau du CSE echo $tmp[6]; // Elu du CSE echo $tmp[7]; // Comptable echo $tmp[3]; // Assistance sociale echo ''; } /** * Génère un menu déroulant pour les accès. * * @param array|null $_access Les données d'accès (optionnel). * @param string|null $_exception L'exception associée (optionnel). * @return string Le HTML du menu déroulant. */ private static function getSelectAccess(?array $_access = NULL, ?string $_exception = NULL){ if (!is_null($_exception)) { $options = [ 1 => 'Autorisé', 0 => '-', 2 => 'Partiellement' ]; } else { $options = [ 1 => 'Autorisé', 0 => '-', ]; } $bgColors = [ 1 => 'background-color:#d4edda;', 0 => 'background-color:#f8d7da;', 2 => 'background-color:#ffeeba;' ]; $disabled = ($_access["id_type"] == 1 OR $_access["id_access"] == 3) ? ' disabled' : ''; $disabledStyle = ($_access["id_type"] == 1 OR $_access["id_access"] == 3) ? ' opacity: 0.5; cursor: not-allowed;' : ''; $style = isset($bgColors[$_access["access"]]) ? $bgColors[$_access["access"]] : ''; $return = ''; return $return; } /** * Complète les accès avec des valeurs par défaut. * * @param string $_idAccess L'ID de l'accès. * @param array|null $_access Les données d'accès existantes (optionnel). * @return array Les accès complétés. */ private static function completeIdemAccess(string $_idAccess, ?array $_access = NULL){ $roles = self::getListTypeUser([2]); // Tous les types sauf les contrôleurs foreach ($roles as $keyRole => $valueRole) { if(empty($_access["access"][$keyRole])){ $tmp = []; $tmp["id_type_access"] = $keyRole . "#" . $_access["id_access"]; $tmp["id_type"] = $keyRole; $tmp["id_access"] = $_idAccess; $tmp["type"] = $valueRole; $tmp["access"] = ($keyRole == 1) ? 1 : 0; $return[$keyRole] = $tmp; } else { $return[$keyRole] = $_access["access"][$keyRole]; } } return $return; } /** * Récupère la liste complète des accès. * * @return array La liste complète des accès. */ public static function finalCompletAccess(){ $access = access::getTypesAccessRecording(); $return = []; foreach ($access as $keyAccess => $valueAccess) { $completeAccess = access::completeIdemAccess($valueAccess["id_access"], $valueAccess); unset($valueAccess["access"]); $valueAccess["access"] = $completeAccess; $return[] = $valueAccess; } return $return; } /** * Récupère les types d'accès. * * @return array|bool Les types d'accès ou FALSE en cas d'erreur. */ private static function getTypesAccess(){ db::query("SELECT " . DB_T_ACCESS . ".id, " . DB_T_ACCESS . ".label, " . DB_T_ACCESS . ".show, " . DB_T_ACCESS . ".add, " . DB_T_TYPE_ACCESS . ".id AS id_type_access, " . DB_T_TYPE_ACCESS . ".id_type, " . "exception1.exception AS exception_type, " . "exception2.exception AS exception, " . DB_T_TYPE_USER . ".type " . "FROM " . DB_T_ACCESS . " " . "LEFT JOIN " . DB_T_ACCESS_EXCEPTION . " AS exception1 ON exception1.id_access = " . DB_T_ACCESS . ".id " . "LEFT JOIN " . DB_T_TYPE_ACCESS . " ON " . DB_T_TYPE_ACCESS . ".id_access = " . DB_T_ACCESS . ".id " . "LEFT JOIN " . DB_T_TYPE_USER . " ON " . DB_T_TYPE_ACCESS . ".id_type = " . DB_T_TYPE_USER . ".id " . "LEFT JOIN " . DB_T_ACCESS_EXCEPTION . " AS exception2 ON " . DB_T_TYPE_ACCESS . ".id_exception = exception2.id " . "ORDER BY " . DB_T_ACCESS . ".id"); try { $tmp = db::resultset(); return $tmp; } catch (Exception $e) { return FALSE; } } /** * Génère un libellé pour un accès. * * @param array $_array Les données de l'accès. * @return string Le libellé généré. */ private static function getTitleLabel(array $_array){ if ($_array["show"] == 1 AND $_array["add"] == 0) { return "Accès à " . $_array["label"] . " en lecture"; } elseif ($_array["show"] == 0 AND $_array["add"] == 1) { return "Accès à " . $_array["label"] . " en écriture"; } else { return "Accès à " . $_array["label"] . " en lecture et écriture"; } } /** * Récupère les types d'accès pour l'enregistrement. * * @return array Les types d'accès. */ public static function getTypesAccessRecording(){ $return = []; foreach (self::getTypesAccess() as $valueAccess) { $return[$valueAccess["id"]]["id_access"] = $valueAccess["id"]; $return[$valueAccess["id"]]["label"] = self::getTitleLabel($valueAccess); $return[$valueAccess["id"]]["show"] = $valueAccess["show"]; $return[$valueAccess["id"]]["add"] = $valueAccess["add"]; $return[$valueAccess["id"]]["exception"] = $valueAccess["exception_type"]; if(!empty($valueAccess["id_type_access"])) { $return[$valueAccess["id"]]["access"][$valueAccess["id_type"]] = [ "id_type_access" => $valueAccess["id_type_access"], "id_type" => $valueAccess["id_type"], "id_access" => $valueAccess["id"], "type" => $valueAccess["type"], "access" => (empty($valueAccess["exception"])) ? 1 : 2, ]; } } return $return; } /** * Récupère les accès par rôle. * * @return array Les accès par rôle. */ public static function getAccessByRole(){ $getAccessByRole = self::getTypesAccessRecording(); $allTypeRole = self::getTypesUsers(); $return = []; foreach ($getAccessByRole as $valuesGetAccessByRole) { $tmp = []; $tmp["access"] = $valuesGetAccessByRole["label"]; $tmp["exception"] = $valuesGetAccessByRole["exception"]; foreach ($allTypeRole as $valueAllTypeRole) { if(!empty($valuesGetAccessByRole["access"][$valueAllTypeRole["id"]])){ $tmp[$valuesGetAccessByRole["access"][$valueAllTypeRole["id"]]["type"]] = $valuesGetAccessByRole["access"][$valueAllTypeRole["id"]]["access"]; } elseif($valueAllTypeRole["id"] == 1){ $tmp[$valueAllTypeRole["type"]] = 1; } else { $tmp[$valueAllTypeRole["type"]] = 0; } } $return[] = $tmp; } return $return; } /** * Récupère l'ID d'une exception pour un accès donné. * * @param int $_idAccess L'ID de l'accès. * @return array|bool Les données de l'exception ou FALSE en cas d'erreur. */ private static function getIdException(int $_idAccess){ db::query("SELECT " . DB_T_ACCESS_EXCEPTION . ".id, " . DB_T_ACCESS_EXCEPTION . ".exception " . "FROM " . DB_T_ACCESS_EXCEPTION . " " . "WHERE " . DB_T_ACCESS_EXCEPTION . ".id_access = :id_access"); db::bind(':id_access', $_idAccess); try { $tmp = db::single(); return $tmp; } catch (Exception $e) { return FALSE; } } /** * Enregistre les accès dans la base de données. * * @return bool TRUE si l'enregistrement a réussi, FALSE sinon. */ public static function recordAccess(){ $post = core::getPost(); $data = []; foreach ($post as $keyPost => $valuePost) { if($valuePost == 1 OR $valuePost == 2){ $tmp = explode("-", $keyPost); $data[$tmp[1] . "#" . $tmp[2]]["id_access"] = $tmp[2]; $data[$tmp[1] . "#" . $tmp[2]]["id_type"] = $tmp[1]; if($valuePost == 2){ $data[$tmp[1] . "#" . $tmp[2]]["id_exception"] = self::getIdException($tmp[2])["id"]; } else { $data[$tmp[1] . "#" . $tmp[2]]["id_exception"] = NULL; } } } // Vide la table db::query("TRUNCATE TABLE " . DB_T_TYPE_ACCESS); db::execute(); // Reconstruit la table foreach ($data as $keyData => $valueData) { db::query("INSERT INTO " . DB_T_TYPE_ACCESS . " (id, id_type, id_access, id_exception) VALUES (:id, :id_type, :id_access, :id_exception)"); db::bind(':id', $keyData); db::bind(':id_type', $valueData["id_type"]); db::bind(':id_access', $valueData["id_access"]); db::bind(':id_exception', $valueData["id_exception"]); try { db::execute(); } catch (Exception $ex) { alert::recError("Erreur à l'enregistrement des droits"); if(debug::isFile("debug")) { alert::recError("Stack : " . $ex); } return FALSE; } } return TRUE; } }