/** * Ajout d'un log dans un fichier d'actions sensibles (un fichier par structure) * Nécessite que la session soit ouverte. * * @param string $contenu description de l'action * @return void */ public static function ajouter($contenu) { $tab_ligne = array(); $tab_ligne[] = '<?php /*'; $tab_ligne[] = date('d-m-Y H:i:s'); $tab_ligne[] = html($_SESSION['USER_PROFIL_NOM_COURT'].' ['.$_SESSION['USER_ID'].'] '.$_SESSION['USER_NOM'].' '.$_SESSION['USER_PRENOM']); $tab_ligne[] = html($contenu); $tab_ligne[] = '*/ ?>'."\r\n"; FileSystem::ecrire_fichier( SACocheLog::chemin_fichier_log($_SESSION['BASE']) , implode("\t",$tab_ligne) , FILE_APPEND ); }
} } // // On passe maintenant au commentaire texte // // Supprimer un éventuel fichier précédent if ($msg_url && mb_strpos($msg_url, $url_dossier_devoir) === 0) { // Il peut ne pas être présent sur le serveur en cas de restauration de base ailleurs, etc. FileSystem::supprimer_fichier(url_to_chemin($msg_url), TRUE); } // Mise à jour dans la base if ($msg_data) { $fichier_nom = 'devoir_' . $devoir_id . '_eleve_' . $_SESSION['USER_ID'] . '_' . 'texte' . '_' . $_SERVER['REQUEST_TIME'] . '.' . 'txt'; // pas besoin de le rendre inaccessible -> fabriquer_fin_nom_fichier__date_et_alea() inutilement lourd DB_STRUCTURE_COMMENTAIRE::DB_remplacer_devoir_commentaire($devoir_id, $_SESSION['USER_ID'], 'texte', $url_dossier_devoir . $fichier_nom); // et enregistrement du fichier FileSystem::ecrire_fichier($chemin_devoir . $fichier_nom, $msg_data); } else { if ($msg_autre == 'oui') { DB_STRUCTURE_COMMENTAIRE::DB_remplacer_devoir_commentaire($devoir_id, $_SESSION['USER_ID'], 'texte', ''); } else { DB_STRUCTURE_COMMENTAIRE::DB_supprimer_devoir_commentaire($devoir_id, $_SESSION['USER_ID']); } } // Terminé exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
} $action = isset($_POST['f_action']) ? Clean::texte($_POST['f_action']) : ''; $chemin_logs = isset($_POST['f_chemin_logs']) ? Clean::texte($_POST['f_chemin_logs']) : ''; $etabl_id_listing = isset($_POST['f_etabl_id_listing']) ? Clean::texte($_POST['f_etabl_id_listing']) : ''; $fichier_logs = isset($_POST['f_fichier']) ? Clean::fichier($_POST['f_fichier']) : ''; // //////////////////////////////////////////////////////////////////////////////////////////////////// // Modifier les paramètres de debug // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'modifier_debug') { $debug = 0; $tab_debug = array('PHP' => 1, 'PHPCAS' => 2, 'SQL' => 4, 'SESSION' => 8, 'POST' => 16, 'GET' => 32, 'FILES' => 64, 'COOKIE' => 128, 'SERVER' => 256, 'CONST' => 512); foreach ($tab_debug as $debug_mode => $debug_val) { $debug += isset($_POST['f_debug_' . $debug_mode]) ? $debug_val : 0; } if ($debug) { FileSystem::ecrire_fichier(CHEMIN_FICHIER_DEBUG_CONFIG, $debug); } else { FileSystem::supprimer_fichier(CHEMIN_FICHIER_DEBUG_CONFIG, TRUE); } exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Modifier les paramètres des logs phpCAS // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'modifier_phpCAS' && $chemin_logs) { $chemin_logs = substr($chemin_logs, -1) == DS ? $chemin_logs : $chemin_logs . DS; // Vérifier chemin valide if (!is_dir($chemin_logs)) { exit('Chemin invalide (le dossier n\'existe pas) !'); } // Tester droits en écriture
} // Mémorisation des pages de début et de fin pour chaque élève pour découpe et archivage ultérieur if ($make_action == 'imprimer') { $page_debut = isset($page_fin) ? $page_fin + 1 : 1; $page_fin = $releve_PDF->page; $page_nombre = $page_fin - $page_debut + 1; $tab_pages_decoupe_pdf[$eleve_id][$numero_tirage] = array($eleve_nom . ' ' . $eleve_prenom, $page_debut . '-' . $page_fin, $page_nombre); } } } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On enregistre les sorties HTML et PDF // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($make_html) { FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier_nom . '.html', $releve_HTML); } if ($make_pdf) { FileSystem::ecrire_sortie_PDF(CHEMIN_DOSSIER_EXPORT . $fichier_nom . '.pdf', $releve_PDF); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On fabrique les options js pour le diagramme graphique // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($make_graph && count($tab_graph_data)) { $js_graph .= '<SCRIPT>'; // Matières sur l'axe des abscisses $js_graph .= 'ChartOptions.title.text = null;'; $js_graph .= 'ChartOptions.xAxis.categories = [' . implode(',', $tab_graph_data['categories']) . '];'; // Second axe des ordonnés pour les moyennes if (!$_SESSION['OFFICIEL']['BULLETIN_MOYENNE_SCORES']) { $js_graph .= 'delete ChartOptions.yAxis[1];';
$tab_eleves[$DB_ROW['user_id']] = $DB_ROW['user_reference']; } // Récupérer les notes enregistrées ; convertir si besoin en nombre de points correspondants $tab_points = array(); $DB_TAB = DB_STRUCTURE_BREVET::DB_lister_brevet_notes_eleves($listing_eleve_id); if (count($DB_TAB)) { foreach ($DB_TAB as $DB_ROW) { if ($DB_ROW['brevet_epreuve_code'] == CODE_BREVET_EPREUVE_TOTAL) { $tab_points[$DB_ROW['eleve_id']][$DB_ROW['brevet_epreuve_code']] = $DB_ROW['saisie_note']; } elseif ($DB_ROW['brevet_epreuve_point_sup_10']) { $tab_points[$DB_ROW['eleve_id']][$DB_ROW['brevet_epreuve_code']] = max(0, $DB_ROW['saisie_note'] - 10); } else { $tab_points[$DB_ROW['eleve_id']][$DB_ROW['brevet_epreuve_code']] = is_numeric($DB_ROW['saisie_note']) ? $DB_ROW['saisie_note'] * $DB_ROW['brevet_epreuve_coefficient'] : $DB_ROW['saisie_note']; } } } // Fabriquer le fichier csv $csv_contenu = ''; $csv_separateur = '|'; foreach ($tab_eleves as $eleve_id => $user_reference) { foreach ($tab_points[$eleve_id] as $epreuve_code => $points) { $csv_code = $epreuve_code != CODE_BREVET_EPREUVE_TOTAL ? (string) $epreuve_code : 'TOT'; $format = $epreuve_code != CODE_BREVET_EPREUVE_TOTAL ? "%05.2f" : "%06.2f"; $csv_note = is_numeric($points) ? sprintf($format, $points) : (string) $points; $csv_contenu .= $user_reference . $csv_separateur . $csv_code . $csv_separateur . $csv_note . $csv_separateur . NL; } } // Enregistrer le fichier csv / Retour $fichier_nom = 'export_notanet' . '_' . Clean::fichier($_SESSION['WEBMESTRE_UAI']) . '_' . fabriquer_fin_nom_fichier__date_et_alea() . '.txt'; FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier_nom, To::csv($csv_contenu)); exit($fichier_nom);
$tab_users_fichier[$id] = array(NULL, NULL, $nom, $prenom, NULL, NULL, 1, $nb_retard_nj); } else { $tab_users_fichier[$id][6] += 1; $tab_users_fichier[$id][7] += 1; } $memo_date_debut = min($memo_date_debut, $date); $memo_date_fin = max($memo_date_fin, $date); } } } $nb_eleves_trouves = count($tab_users_fichier, COUNT_NORMAL); if (!$nb_eleves_trouves) { exit('Erreur : aucun élève trouvé dans le fichier !'); } // On enregistre FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT . $fichier_memo, serialize($tab_users_fichier)); // On affiche la demande de confirmation exit('ok' . ']¤[' . $objet . ']¤[' . html($nb_eleves_trouves) . ']¤[' . convert_date_mysql_to_french($memo_date_debut) . ']¤[' . convert_date_mysql_to_french($memo_date_fin)); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Traitement d'un fichier d'import déjà réceptionné // //////////////////////////////////////////////////////////////////////////////////////////////////// if (in_array($action, array('traitement_import_sconet', 'traitement_import_siecle', 'traitement_import_gepi', 'traitement_import_pronote')) && $periode_id) { $mode = substr($action, strrpos($action, '_') + 1); // Récupération des données déjà extraites du fichier if (!is_file(CHEMIN_DOSSIER_IMPORT . $fichier_memo)) { exit('Erreur : le fichier ' . CHEMIN_DOSSIER_IMPORT . $fichier_memo . ' contenant les données à traiter est introuvable !'); } $contenu = file_get_contents(CHEMIN_DOSSIER_IMPORT . $fichier_memo); $tab_users_fichier = @unserialize($contenu); if ($tab_users_fichier === FALSE) {
else { $id_checked = (mb_strpos(str_replace(' ','',$ref),$masque_recherche)===0) ? $niveau_id : ''; } if($id_checked) { break; } } $nom_groupe = ($tab_groupes_fichier['nom'][$i_groupe]) ? $tab_groupes_fichier['nom'][$i_groupe] : $ref ; $lignes_add .= '<tr><th><input id="add_'.$i_groupe.'" name="add_'.$i_groupe.'" type="checkbox" checked /> '.html($ref).'<input id="add_ref_'.$i_groupe.'" name="add_ref_'.$i_groupe.'" type="hidden" value="'.html($ref).'" /></th><td>Niveau : <select id="add_niv_'.$i_groupe.'" name="add_niv_'.$i_groupe.'">'.str_replace('value="'.$id_checked.'"','value="'.$id_checked.'" selected',$select_niveau).'</select> Nom complet : <input id="add_nom_'.$i_groupe.'" name="add_nom_'.$i_groupe.'" size="15" type="text" value="'.html($nom_groupe).'" maxlength="20" /></td></tr>'.NL; } } // On enregistre (tableau mis à jour) $tab_liens_id_base = array('classes'=>$tab_i_classe_TO_id_base,'groupes'=>$tab_i_groupe_TO_id_base,'users'=>$tab_i_fichier_TO_id_base); FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT.'import_'.$import_origine.'_'.$import_profil.'_'.$_SESSION['BASE'].'_'.session_id().'_liens_id_base.txt',serialize($tab_liens_id_base)); // On affiche echo'<p><label class="valide">Veuillez vérifier le résultat de l\'analyse des groupes.</label></p>'.NL; // Pour sconet_professeurs_directeurs, les groupes ne figurent pas forcément dans le fichier si les services ne sont pas présents -> on ne procède qu'à des ajouts éventuels. if($lignes_del) { echo'<p class="danger">Des groupes non trouvés sont proposés à la suppression. Il se peut que les services / affectations manquent dans le fichier. Veuillez cochez ces suppressions pour les confirmer.</p>'.NL; } echo'<table>'.NL; if($mode=='complet') { echo '<tbody>'.NL; echo '<tr><th colspan="2">Groupes actuels à conserver</th></tr>'.NL; echo($lignes_ras) ? $lignes_ras : '<tr><td colspan="2">Aucun</td></tr>'.NL; echo '</tbody>'.NL; }
/** * Vérifier qu'une arborescence XML d'un référentiel est syntaxiquement valide. * * @param string $arbreXML * @return string "ok" ou "Erreur..." */ public static function verifier_arborescence_XML($arbreXML) { // On ajoute déclaration et doctype au fichier (évite que l'utilisateur ait à se soucier de cette ligne et permet de le modifier en cas de réorganisation // Attention, le chemin du DTD est relatif par rapport à l'emplacement du fichier XML (pas celui du script en cours) ! $fichier_adresse = CHEMIN_DOSSIER_IMPORT.'referentiel_'.fabriquer_fin_nom_fichier__date_et_alea().'.xml'; $fichier_contenu = '<?xml version="1.0" encoding="UTF-8"?>'."\r\n".'<!DOCTYPE arbre SYSTEM "../../_dtd/referentiel.dtd">'."\r\n".$arbreXML; $fichier_contenu = To::deleteBOM(To::utf8($fichier_contenu)); // Mettre en UTF-8 si besoin et retirer le BOM éventuel // On enregistre temporairement dans un fichier pour analyse FileSystem::ecrire_fichier($fichier_adresse,$fichier_contenu); // On lance le test $test_XML_valide = ServeurCommunautaire::analyser_XML($fichier_adresse); // On efface le fichier temporaire FileSystem::supprimer_fichier($fichier_adresse); return $test_XML_valide; }
/** * Bloquer l'accès à SACoche (les profils concernés dépendent du profil qui exerce le blocage). * * @param string $profil_demandeur (webmestre|administrateur|automate) * @param int $base_id (0 si demande mono-structure ou du webmestre multi-structures de bloquer tous les établissements) * @param string $motif * @return void */ public static function bloquer_application($profil_demandeur, $base_id, $motif) { FileSystem::ecrire_fichier(LockAcces::chemin_fichier_blocage($profil_demandeur, $base_id), $motif); // Log de l'action SACocheLog::ajouter('Blocage de l\'accès à l\'application [' . $motif . '].'); }
$bulletin_matiere = HtmlForm::afficher_select(DB_STRUCTURE_COMMUN::DB_OPT_matieres_professeur($_SESSION['USER_ID']) , 'f_rubrique' /*select_nom*/ , FALSE /*option_first*/ , FALSE /*selection*/ , '' /*optgroup*/); } $bulletin_form = '<li><form id="form_report_bulletin"><fieldset><button id="bouton_report" type="button" class="eclair">Report forcé</button> vers le bulletin <em>SACoche</em> '.$bulletin_periode.'<input type="hidden" id="f_eleves_moyennes" name="f_eleves_moyennes" value="'.implode('x',$tab_bulletin_input).'" /> '.$bulletin_matiere.'</fieldset></form><label id="ajax_msg_report"></label></li>'; $bulletin_alerte = '<div class="danger">Un report forcé interrompt le report automatique des moyennes pour le bulletin et la matière concernée.</div>' ; } else { $bulletin_form = '<li>Report forcé vers un bulletin sans objet : aucune moyenne chiffrée n\'a pu être produite.</li>'; } } $moyenne_affichee = sprintf("%04.1f",$moyenne_moyenne_scores/5); $bulletin_PDF->derniere_ligne( $info_ponderation_complete , $moyenne_affichee , $moyenne_pourcentage_acquis ); $bulletin_head = '<thead><tr><th>Élève</th><th>Moyenne '.$info_ponderation_complete.' sur 20<br />(des scores d\'acquisitions)</th><th>Élément d\'appréciation<br />(pourcentage d\'items acquis)</th></tr></thead>'.NL; $bulletin_body = '<tbody>'.NL.$bulletin_body.'</tbody>'.NL; $bulletin_foot = '<tfoot><tr><th>Moyenne '.$info_ponderation_complete.' sur 20</th><th>'.$moyenne_affichee.'</th><th>'.$moyenne_pourcentage_acquis.'% d\'items acquis</th></tr></tfoot>'.NL; $bulletin_html = '<h1>Bilan '.$tab_titre[$releve_modele].'</h1>'; $bulletin_html .= '<h2>'.html($matiere_et_groupe).'</h2>'; $bulletin_html .= '<h2>'.$texte_periode.'</h2>'; $bulletin_html .= '<h2>Moyenne sur 20 / Élément d\'appréciation</h2>'; $bulletin_html .= '<table id="export20" class="hsort">'.NL.$bulletin_head.$bulletin_foot.$bulletin_body.'</table>'.NL; $bulletin_html .= '<script type="text/javascript">$("#export20").tablesorter({ headers:{2:{sorter:false}} });</script>'.NL; // On enregistre les sorties HTML / PDF / CSV FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.str_replace('<REPLACE>','bulletin',$fichier_nom).'.html',$bulletin_html); FileSystem::ecrire_sortie_PDF(CHEMIN_DOSSIER_EXPORT.str_replace('<REPLACE>','bulletin',$fichier_nom).'.pdf' ,$bulletin_PDF ); foreach($tab_bulletin_csv_gepi as $type_donnees => $bulletin_csv_gepi_contenu) { FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT.str_replace('<REPLACE>','bulletin_'.$type_donnees,$fichier_nom).'.csv',utf8_decode($bulletin_csv_gepi_contenu)); } } ?>
$date_affich = $DB_ROW['user_sortie_date'] != SORTIE_DEFAUT_MYSQL ? convert_date_mysql_to_french($DB_ROW['user_sortie_date']) : '-'; $lignes .= '<tr' . $class . '><td>' . html($DB_ROW['user_sconet_id']) . '</td><td>' . html($DB_ROW['user_sconet_elenoet']) . '</td><td>' . html($DB_ROW['user_reference']) . '</td><td>' . html($champ) . '</td><td>' . html($DB_ROW['user_nom']) . '</td><td>' . html($DB_ROW['user_prenom']) . '</td><td' . $class . '>' . html($DB_ROW['user_login']) . '</td>' . $td_password . '<td>' . $date_affich . '</td></tr>' . NL; } } $s_debut_actuel = $nb_debut_actuel > 1 ? 's' : ''; $s_debut_ancien = $nb_debut_ancien > 1 ? 's' : ''; $s_fin_actuel = $nb_fin_actuel > 1 ? 's' : ''; $s_fin_ancien = $nb_fin_ancien > 1 ? 's' : ''; $s_mod = $nb_mod > 1 ? 's' : ''; $s_add = $nb_add > 1 ? 's' : ''; $s_del = $nb_del > 1 ? 's' : ''; if ($nb_add) { // On archive les nouveaux identifiants dans un fichier tableur (csv tabulé) $profil = $import_profil == 'eleve' ? 'eleve' : ($import_profil == 'parent' ? 'parent' : 'personnel'); $fnom = 'identifiants_' . $_SESSION['BASE'] . '_' . $profil . '_' . fabriquer_fin_nom_fichier__date_et_alea(); FileSystem::ecrire_fichier(CHEMIN_DOSSIER_LOGINPASS . $fnom . '.csv', To::csv($fcontenu_csv)); // On archive les nouveaux identifiants dans un fichier pdf (classe fpdf + script étiquettes) $pdf = new PDF_Label(array('paper-size' => 'A4', 'metric' => 'mm', 'marginLeft' => 5, 'marginTop' => 5, 'NX' => 3, 'NY' => 8, 'SpaceX' => 7, 'SpaceY' => 5, 'width' => 60, 'height' => 30, 'font-size' => 11)); $pdf->AddFont('Arial', '', 'arial.php'); $pdf->SetFont('Arial'); // Permet de mieux distinguer les "l 1" etc. que la police Times ou Courrier $pdf->AddPage(); $pdf->SetFillColor(245, 245, 245); $pdf->SetDrawColor(145, 145, 145); sort($fcontenu_pdf_tab); foreach ($fcontenu_pdf_tab as $text) { $pdf->Add_Label(To::pdf($text)); } FileSystem::ecrire_sortie_PDF(CHEMIN_DOSSIER_LOGINPASS . $fnom . '.pdf', $pdf); } $champ = $import_profil == 'eleve' ? 'Classe' : 'Profil';
/** * Tâches pseudo-planifiées exécutées lors de la connexion d'un utilisateur d'un établissement * * @param void * @return void */ public static function cron() { // On essaye de faire en sorte que plusieurs connexions ne lancent pas ces procédures simultanément $fichier_lock = CHEMIN_DOSSIER_TMP.'lock.txt'; if(!file_exists($fichier_lock)) { // On écrit un marqueur FileSystem::ecrire_fichier($fichier_lock,''); // On efface les fichiers temporaires obsolètes FileSystem::nettoyer_fichiers_temporaires($_SESSION['BASE']); // On rend visibles les notifications en attente et on supprime les notifications obsolètes Sesamail::envoyer_notifications(); DB_STRUCTURE_NOTIFICATION::DB_supprimer_log_anciens(); // On efface le marqueur FileSystem::supprimer_fichier($fichier_lock); } // Si le fichier témoin du nettoyage existe, on vérifie que sa présence n'est pas anormale (cela s'est déjà produit...) else { if( $_SERVER['REQUEST_TIME'] - filemtime($fichier_lock) > 30 ) { FileSystem::supprimer_fichier($fichier_lock); } } }
/** * recuperer_infos_Laclasse * * @param string $UAI * @return array|string */ function recuperer_infos_Laclasse($UAI) { // Appeler l'annuaire ENT Laclasse.com $tab_Laclasse = Laclasse::get_info_from_annuaire( $UAI , '' , FALSE /*exit_if_error*/ , TRUE /*with_details*/ ); // Enregistrer la réponse pour aider au débuggage si besoin FileSystem::ecrire_fichier( CHEMIN_DOSSIER_IMPORT.'Laclasse_'.$UAI.'_recup_IdEnt_'.fabriquer_fin_nom_fichier__date_et_alea().'.txt' , print_r($tab_Laclasse,TRUE) ); // On examine la réponse if(!is_array($tab_Laclasse)) { exit($tab_Laclasse); } // Pour récupérer les données des utilisateurs $tab_users_annuaire = array(); $tab_users_annuaire['ordre'] = array(); $tab_users_annuaire['profil'] = array(); $tab_users_annuaire['id_ent'] = array(); $tab_users_annuaire['nom'] = array(); $tab_users_annuaire['prenom'] = array(); $tab_users_annuaire['id_sconet'] = array(); // Ne servira que pour les élèves if(!empty($tab_Laclasse['personnel'])) { foreach($tab_Laclasse['personnel'] as $tab_infos) { $user_profil = NULL; if( in_array( $tab_infos['profil_id'] , array('DIR','DOC','ENS') ) ) { // Personnels de direction, enseignants y compris professeur documentaliste $ordre = 1; $user_profil = $tab_infos['profil_id']; } else if($tab_infos['profil_id']=='ETA') { if($tab_infos['libelle']=='EDUCATION') { // CPE $ordre = 1; $user_profil = 'EDU'; } elseif($tab_infos['description']=='ENCADRE. SUR. DES ELEVES (HORS INTERNAT)') { // Surveillants $ordre = 4; $user_profil = 'SUR'; } elseif($tab_infos['libelle']=='ASSISTANT D\'EDUCATION') { // AED $ordre = 4; $user_profil = 'AED'; } elseif($tab_infos['libelle']=='ORIENTATION') { // Co-Psy $ordre = 4; $user_profil = 'ORI'; } elseif($tab_infos['libelle']=='PERSONNELS ADMINISTRATIFS') { // Personnels administratifs $ordre = 4; $user_profil = 'ADF'; } } else if($tab_infos['profil_id']=='EVS') { // Personnels medico-sociaux $ordre = 4; $user_profil = 'MDS'; } if($user_profil) { $tab_users_annuaire['ordre' ][] = $ordre; $tab_users_annuaire['profil' ][] = $user_profil; $tab_users_annuaire['id_ent' ][] = Clean::id_ent($tab_infos['id_ent']); $tab_users_annuaire['nom' ][] = Clean::nom($tab_infos['nom']); $tab_users_annuaire['prenom' ][] = Clean::prenom($tab_infos['prenom']); $tab_users_annuaire['id_sconet'][] = NULL; } } } // Les élèves if(!empty($tab_Laclasse['eleves'])) { foreach($tab_Laclasse['eleves'] as $tab_infos) { $tab_users_annuaire['ordre' ][] = 2; $tab_users_annuaire['profil' ][] = 'ELV'; $tab_users_annuaire['id_ent' ][] = Clean::id_ent($tab_infos['id_ent']); $tab_users_annuaire['nom' ][] = Clean::nom($tab_infos['nom']); $tab_users_annuaire['prenom' ][] = Clean::prenom($tab_infos['prenom']); $tab_users_annuaire['id_sconet'][] = Clean::entier($tab_infos['id_sconet']); } } // Les parents if(!empty($tab_Laclasse['parents'])) { foreach($tab_Laclasse['parents'] as $tab_infos) { $tab_users_annuaire['ordre' ][] = 3; $tab_users_annuaire['profil' ][] = 'TUT'; $tab_users_annuaire['id_ent' ][] = Clean::id_ent($tab_infos['id_ent']); $tab_users_annuaire['nom' ][] = Clean::nom($tab_infos['nom']); $tab_users_annuaire['prenom' ][] = Clean::prenom($tab_infos['prenom']); $tab_users_annuaire['id_sconet'][] = NULL; } } // On trie array_multisort( $tab_users_annuaire['ordre'] , SORT_ASC,SORT_NUMERIC, $tab_users_annuaire['profil'], SORT_ASC,SORT_STRING, $tab_users_annuaire['nom'] , SORT_ASC,SORT_STRING, $tab_users_annuaire['prenom'], SORT_ASC,SORT_STRING, $tab_users_annuaire['id_ent'], $tab_users_annuaire['id_sconet'] ); // On retire l'ordre dont on n'a plus besoin unset($tab_users_annuaire['ordre']); // On retourne le tableau return $tab_users_annuaire; }
/** * Nettoyer les fichiers temporaires * Fonction appeler lors d'une nouvelle connexion d'un utilisateur d'un établissement (pas mis en page d'accueil sinon c'est appelé trop souvent) * * @param int $BASE * @return void */ public static function nettoyer_fichiers_temporaires($BASE) { // On verifie que certains sous-dossiers existent : $tab_sous_dossier = array( CHEMIN_DOSSIER_DEVOIR , // n'a été ajouté qu'en mars 2012, CHEMIN_DOSSIER_DEVOIR.$BASE.DS , CHEMIN_DOSSIER_OFFICIEL , // n'a été ajouté qu'en mai 2012, CHEMIN_DOSSIER_OFFICIEL.$BASE.DS , CHEMIN_DOSSIER_PARTENARIAT , // n'a été ajouté qu'en juin 2013, ); foreach($tab_sous_dossier as $sous_dossier) { if(!is_dir($sous_dossier)) { FileSystem::creer_dossier($sous_dossier); FileSystem::ecrire_fichier($sous_dossier.'index.htm','Circulez, il n\'y a rien à voir par ici !'); } } $nb_mois = (defined('FICHIER_DUREE_CONSERVATION')) ? FICHIER_DUREE_CONSERVATION : 12 ; // Une fois tous les devoirs ont été supprimés sans raison claire : nettoyage simultané avec une mise à jour ? FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_LOGINPASS , 10 ); // Nettoyer ce dossier des fichiers antérieurs à 10 minutes FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_EXPORT , 60,TRUE); // Nettoyer ce dossier des fichiers antérieurs à 1 heure + sous-dossiers temporaires d'un zip qui ne serait pas allé au bout (pb de mémoire...) FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_DUMP , 60,TRUE); // Nettoyer ce dossier des fichiers antérieurs à 1 heure + sous-dossiers temporaires d'un zip qui ne serait pas allé au bout (pb de mémoire...) FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_IMPORT , 10080 ); // Nettoyer ce dossier des fichiers antérieurs à 1 semaine FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_TMP , 219000 ); // Nettoyer ce dossier des fichiers antérieurs à 6 mois FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_RSS.$BASE , 43800 ); // Nettoyer ce dossier des fichiers antérieurs à 1 mois FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_OFFICIEL.$BASE , 438000 ); // Nettoyer ce dossier des fichiers antérieurs à 10 mois FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_BADGE.$BASE , 481800 ); // Nettoyer ce dossier des fichiers antérieurs à 11 mois FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_COOKIE.$BASE , 525600 ); // Nettoyer ce dossier des fichiers antérieurs à 1 an FileSystem::effacer_fichiers_temporaires(CHEMIN_DOSSIER_DEVOIR.$BASE , 43800*$nb_mois); // Nettoyer ce dossier des fichiers antérieurs à la date fixée par le webmestre (1 an par défaut) }
} } $fichier_extension = ($action=='export_lpc') ? 'xml' : 'zip' ; $fichier_nom = str_replace('export_','import-',$action).'-'.Clean::fichier($_SESSION['WEBMESTRE_UAI']).'_'.fabriquer_fin_nom_fichier__date_et_alea().'.'.$fichier_extension; // LPC recommande le modèle "import-lpc-{timestamp}.xml" if($action=='export_lpc') { $xml.= ' </donnees>'."\r\n"; $xml.= '</lpc>'."\r\n"; // Pour LPC, ajouter la signature via un appel au serveur sécurisé $xml = utf8_decode($xml); $xml = ServeurCommunautaire::signer_exportLPC( $_SESSION['SESAMATH_ID'] , $_SESSION['SESAMATH_KEY'] , $xml ); // fonction sur le modèle de envoyer_arborescence_XML() if(substr($xml,0,5)!='<?xml') { exit(html($xml)); } FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fichier_nom , $xml ); $fichier_lien = './force_download.php?fichier='.$fichier_nom; } else { $xml.= ' </donnees>'."\r\n"; $xml.= '</sacoche>'."\r\n"; // L'export pour SACoche on peut le zipper (le gain est très significatif : facteur 40 à 50 !) FileSystem::zip( CHEMIN_DOSSIER_EXPORT.$fichier_nom , 'import_validations.xml' , $xml ); $fichier_lien = URL_DIR_EXPORT.$fichier_nom; } // Afficher le retour $se = ($nb_eleves>1) ? 's' : '' ; $sp = ($nb_piliers>1) ? 's' : '' ; $si = ($nb_items>1) ? 's' : '' ; $in = $only_positives ? '' : '(in)-' ;
$fichier_csv_nom = 'bases_dump_' . $_SESSION['datetime'] . '_' . $_SESSION['alea'] . '.csv'; $fichier_zip_nom = 'bases_dump_' . $_SESSION['datetime'] . '_' . $_SESSION['alea'] . '.zip'; $separateur = ';'; require CHEMIN_DOSSIER_INCLUDE . 'fonction_dump.php'; // //////////////////////////////////////////////////////////////////////////////////////////////////// // Récupération de la liste des structures avant export des bases // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'exporter' && $nb_bases) { // Mémoriser dans un fichier les données des structures concernées par les stats $fichier_texte = 'Id_Export' . $separateur . 'Id_Import' . $separateur . 'Id_Zone' . $separateur . 'Localisation' . $separateur . 'Dénomination' . $separateur . 'UAI' . $separateur . 'Contact_Nom' . $separateur . 'Contact_Prénom' . $separateur . 'Contact_Courriel' . $separateur . 'Date_Inscription' . $separateur . 'Nom_fichier' . "\r\n"; $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_structures(implode(',', $tab_base_id)); foreach ($DB_TAB as $DB_ROW) { $fichier_nom = 'dump_SACoche_' . $DB_ROW['sacoche_base'] . '_' . $_SESSION['datetime'] . '_' . mt_rand() . '.zip'; $fichier_texte .= $DB_ROW['sacoche_base'] . $separateur . $separateur . $DB_ROW['geo_id'] . $separateur . $DB_ROW['structure_localisation'] . $separateur . $DB_ROW['structure_denomination'] . $separateur . $DB_ROW['structure_uai'] . $separateur . $DB_ROW['structure_contact_nom'] . $separateur . $DB_ROW['structure_contact_prenom'] . $separateur . $DB_ROW['structure_contact_courriel'] . $separateur . $DB_ROW['structure_inscription_date'] . $separateur . $fichier_nom . "\r\n"; } FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier_csv_nom, $fichier_texte); $max = $nb_bases + 1; // La dernière étape consiste à zipper les fichiers de sauvegarde et à faire le ménage. // Créer ou vider le dossier temporaire qui contiendra le zip des zip FileSystem::creer_ou_vider_dossier($dossier_temp_zip); exit(']¤[' . $max); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Etape d'export d'une base // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($action == 'exporter' && $num && $max && $num < $max) { // Récupérer la ligne de données $fichier_texte = file_get_contents(CHEMIN_DOSSIER_EXPORT . $fichier_csv_nom); $tab_ligne = explode("\r\n", $fichier_texte); // Récupérer une série d'infos, sachant que seuls $export_id et $fichier_nom sont utiles list($export_id, $import_id, $geo_id, $localisation, $denomination, $uai, $contact_nom, $contact_prenom, $contact_courriel, $date, $fichier_nom) = explode($separateur, $tab_ligne[$num]);
$dossier_install = '.'.DS; // // 1. Récupération de l'archive <em>ZIP</em>... // if($action=='verif_file_appli_etape1') { $tab_post = array(); $tab_post['verification'] = 1; $tab_post['version'] = VERSION_PROG; $contenu_zip = cURL::get_contents( SERVEUR_TELECHARGEMENT , $tab_post , 60 /*timeout*/ ); if(substr($contenu_zip,0,6)=='Erreur') { exit(']¤['.'pb'.']¤['.$contenu_zip); } FileSystem::ecrire_fichier($fichier_import,$contenu_zip); exit(']¤['.'ok'.']¤['."Décompression de l'archive…"); } // // 2. Décompression de l'archive... // if($action=='verif_file_appli_etape2') { if(is_dir($dossier_dezip)) { FileSystem::supprimer_dossier($dossier_dezip); } // Dezipper dans le dossier temporaire $code_erreur = FileSystem::unzip( $fichier_import , CHEMIN_DOSSIER_IMPORT , TRUE /*use_ZipArchive*/ ); if($code_erreur)
$options_horizontal_gauche = str_replace('"' . $_SESSION['ENVELOPPE']['HORIZONTAL_GAUCHE'] . '"', '"' . $_SESSION['ENVELOPPE']['HORIZONTAL_GAUCHE'] . '" selected', fabriquer_chaine_option(90, 120)); $options_horizontal_milieu = str_replace('"' . $_SESSION['ENVELOPPE']['HORIZONTAL_MILIEU'] . '"', '"' . $_SESSION['ENVELOPPE']['HORIZONTAL_MILIEU'] . '" selected', fabriquer_chaine_option(85, 115)); $options_horizontal_droite = str_replace('"' . $_SESSION['ENVELOPPE']['HORIZONTAL_DROITE'] . '"', '"' . $_SESSION['ENVELOPPE']['HORIZONTAL_DROITE'] . '" selected', fabriquer_chaine_option(15, 25)); $options_vertical_haut = str_replace('"' . $_SESSION['ENVELOPPE']['VERTICAL_HAUT'] . '"', '"' . $_SESSION['ENVELOPPE']['VERTICAL_HAUT'] . '" selected', fabriquer_chaine_option(40, 60)); $options_vertical_milieu = str_replace('"' . $_SESSION['ENVELOPPE']['VERTICAL_MILIEU'] . '"', '"' . $_SESSION['ENVELOPPE']['VERTICAL_MILIEU'] . '" selected', fabriquer_chaine_option(35, 55)); $options_vertical_bas = str_replace('"' . $_SESSION['ENVELOPPE']['VERTICAL_BAS'] . '"', '"' . $_SESSION['ENVELOPPE']['VERTICAL_BAS'] . '" selected', fabriquer_chaine_option(15, 25)); // Formulaire avec la liste des directeurs et professeurs $select_user = HtmlForm::afficher_select(DB_STRUCTURE_COMMUN::DB_OPT_professeurs_directeurs_etabl(1), 'f_user', 'tampon_structure', FALSE, 'profs_directeurs'); // Récupérer les signatures existantes, dont le tampon de l'établissement. $li_signatures = ''; $DB_TAB = DB_STRUCTURE_IMAGE::DB_lister_signatures_avec_identite(); foreach ($DB_TAB as $DB_ROW) { // Enregistrer temporairement le fichier sur le disque $texte = $DB_ROW['user_id'] ? 'Signature ' . $DB_ROW['user_nom'] . ' ' . $DB_ROW['user_prenom'] : 'Tampon de l\'établissement'; $fichier_nom = 'signature_' . $_SESSION['BASE'] . '_' . $DB_ROW['user_id'] . '_' . fabriquer_fin_nom_fichier__date_et_alea() . '.' . $DB_ROW['image_format']; FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier_nom, base64_decode($DB_ROW['image_contenu'])); // Générer la balise html pour afficher l'image list($width, $height) = dimensions_affichage_image($DB_ROW['image_largeur'], $DB_ROW['image_hauteur'], 200, 200); $li_signatures .= '<li id="sgn_' . $DB_ROW['user_id'] . '">' . html($texte) . ' : <img src="' . URL_DIR_EXPORT . $fichier_nom . '" alt="' . html($texte) . '" width="' . $width . '" height="' . $height . '" /><q class="supprimer" title="Supprimer cette image (aucune confirmation ne sera demandée)."></q></li>'; } $li_signatures = $li_signatures ? $li_signatures : '<li id="sgn_none">Aucun fichier image trouvé !</li>'; ?> <div><span class="manuel"><a class="pop_up" href="<?php echo SERVEUR_DOCUMENTAIRE; ?> ?fichier=releves_bilans__reglages_syntheses_bilans#toggle_officiel_mise_en_page">DOC : Réglages synthèses & bilans → Mise en page des bilans officiels</a></span></div> <hr /> <form action="#" method="post" id="form_mise_en_page">
$releve_HTML_table_foot1 .= '<th class="nu"> </th>'.Html::td_score($moyenne_moyenne_scores,'score','%').'<th class="nu"> </th>'.$entete_vide.$checkbox_vide.'</tr>'.NL; $releve_HTML_table_foot2 .= '<th class="nu"> </th><th class="nu"> </th>'.Html::td_score($moyenne_pourcentage_acquis,'score','%').$entete_vide.$checkbox_vide.'</tr>'.NL; $row_entete .= ($repeter_entete) ? '<th class="nu"> </th><th class="nu"> </th><th class="nu"> </th>'.$entete_vide.$checkbox_vide.'</tr>'.NL : '' ; $row_checkbox .= ($affichage_checkbox) ? '<th class="nu"> </th><th class="nu"> </th><th class="nu"> </th>'.$entete_vide.$checkbox_vide.'</tr>'.NL : '' ; $releve_HTML_table_foot = '<tfoot>'.NL.'<tr class="vide"><td class="nu" colspan="'.$colspan.'"> </td><td class="nu"></td><td class="nu"><td class="nu">'.$entete_vide.$checkbox_vide.'</tr>'.NL.$releve_HTML_table_foot1.$releve_HTML_table_foot2.$row_entete.$row_checkbox.'</tfoot>'.NL; // pour la sortie HTML, on peut placer les tableaux de synthèse au début $num_hide = ($tableau_synthese_format=='eleve') ? $item_nb+1 : $eleve_nb+1 ; $num_hide_add1 = ($affichage_checkbox || $repeter_entete) ? ','.($num_hide+3).':{sorter:false}' : '' ; $num_hide_add2 = ($affichage_checkbox && $repeter_entete) ? ','.($num_hide+4).':{sorter:false}' : '' ; $releve_HTML_synthese .= '<hr />'.NL.'<h2>SYNTHESE (selon l\'objet et le mode de tri choisis)</h2>'.NL; $releve_HTML_synthese .= ($affichage_checkbox) ? '<form id="form_synthese" action="#" method="post">'.NL : '' ; $releve_HTML_synthese .= '<table id="table_s" class="bilan_synthese vsort">'.NL.$releve_HTML_table_head.$releve_HTML_table_foot.$releve_HTML_table_body.'</table>'.NL; $releve_HTML_synthese .= ($affichage_checkbox) ? HtmlForm::afficher_synthese_exploitation('eleves + eleves-items + items').'</form>'.NL : ''; $releve_HTML_synthese .= '<script type="text/javascript">$("#table_s").tablesorter({ headers:{'.$num_hide.':{sorter:false}'.$num_hide_add1.$num_hide_add2.'} });</script>'.NL; // Non placé dans le fichier js car mettre une variable à la place d'une valeur pour $num_hide ne fonctionne pas // On enregistre les sorties HTML et PDF FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fichier_nom_type2.'.html' , $releve_HTML_synthese ); FileSystem::ecrire_sortie_PDF( CHEMIN_DOSSIER_EXPORT.$fichier_nom_type2.'.pdf' , $releve_PDF ); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Affichage du résultat // //////////////////////////////////////////////////////////////////////////////////////////////////// if($affichage_direct) { echo'<hr />'.NL; echo'<ul class="puce">'.NL; echo '<li><a target="_blank" href="'.URL_DIR_EXPORT.$fichier_nom_type1.'.pdf"><span class="file file_pdf">Archiver / Imprimer (format <em>pdf</em>).</span></a></li>'.NL; echo'</ul>'.NL; echo $releve_HTML_individuel; }
echo'<p class="danger">Le fichier n\'existe pas : probablement qu\'aucune action sensible n\'a encore été effectuée !</p>'.NL; } else { // 1 En extraire le plus récent (les 100 derniers enregistrements) $table_log_extrait = '<table class="p"><thead><tr><th>Date & Heure</th><th>Utilisateur</th><th>Action</th></tr></thead><tbody>'; $tab_lignes = extraire_lignes($fichier_log_contenu); $indice_ligne_debut = count($tab_lignes)-1 ; $indice_ligne_fin = max(-1 , $indice_ligne_debut-100) ; $nb_lignes = $indice_ligne_debut - $indice_ligne_fin ; $s = ($nb_lignes>1) ? 's' : '' ; for( $indice_ligne=$indice_ligne_debut ; $indice_ligne>$indice_ligne_fin ; $indice_ligne-- ) { list( $balise_debut , $date_heure , $utilisateur , $action , $balise_fin ) = explode("\t",$tab_lignes[$indice_ligne]); $table_log_extrait .= '<tr><td>'.$date_heure.'</td><td>'.$utilisateur.'</td><td>'.$action.'</td></tr>'; // Pas de html(), cela a déjà été fait lors de l'enregistrement des logs } $table_log_extrait .= '</tbody></table>'; // 2 Enregistrer un csv récupérable $fichier_log_contenu = str_replace(array('<?php /*','*/ ?>'),'',$fichier_log_contenu); $fichier_export_nom = 'log_'.$_SESSION['BASE'].'_'.fabriquer_fin_nom_fichier__date_et_alea(); FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fichier_export_nom.'.csv' , To::csv($fichier_log_contenu) ); // Afficher tout ça echo'<ul class="puce">'.NL; echo '<li><a target="_blank" href="./force_download.php?fichier='.$fichier_export_nom.'.csv"><span class="file file_txt">Récupérer le fichier complet (format <em>csv</em>).</span></a></li>'.NL; echo '<li>Consulter les derniers logs ('.$nb_lignes.' ligne'.$s.') :</li>'.NL; echo'</ul>'.NL; echo $table_log_extrait; } ?>
/** * sauvegarder_tables_base_etablissement * Remplir le dossier temporaire avec les fichiers de svg des tables * Pour une sauvegarde individuelle, scindé en plusieurs étapes pour éviter un dépassement du max_execution_time sur de grosses bases. * Par contre pour une sauvegarde par un webmestre d'un ensemble de structures, c'était trop compliqué à découper, on fait tout d'un coup. * * @param string $dossier * @param int $etape (0 si tout d'un coup) * @return string */ function sauvegarder_tables_base_etablissement($dossier_temp, $etape) { if ($etape == 0 || $etape == 1) { // Nombre d'enregistrements à récupérer par "SELECT * FROM table_nom" et donc ensuite inséré par "INSERT INTO table_nom VALUES (...),(...),(...)" $nb_lignes_maxi = determiner_nombre_lignes_maxi_par_paquet(); // Lister les tables présentes et le nombre de boucles à effectuer afin de récupérer les données des grosses tables (nombre d'enregistrements / nb_lignes_maxi) // On met ça en session pour les appels suivants si sauvegarde en plusieurs étapes. $_SESSION['tab_tables_info'] = array(); $DB_TAB = DB_STRUCTURE_COMMUN::DB_recuperer_tables_informations(); foreach ($DB_TAB as $DB_ROW) { // $nb_lignes_maxi est prévu pour "sacoche_saisie" qui comporte beaucoup de lignes, mais les tables avec des champs longs deviennent lourdes avec moins de lignes switch ($DB_ROW['Name']) { case 'sacoche_image': $nb_lignes_maxi_for_table = $nb_lignes_maxi / 100; break; case 'sacoche_user': $nb_lignes_maxi_for_table = $nb_lignes_maxi / 4; break; case 'sacoche_officiel_saisie': $nb_lignes_maxi_for_table = $nb_lignes_maxi / 2; break; default: $nb_lignes_maxi_for_table = $nb_lignes_maxi; } $nombre_boucles = max(ceil($DB_ROW['Rows'] / $nb_lignes_maxi_for_table), 1); // Parcourir au moins une fois la boucle pour une table sans enregistrement for ($numero_boucle = 0; $numero_boucle < $nombre_boucles; $numero_boucle++) { $_SESSION['tab_tables_info'][] = array('TableNom' => $DB_ROW['Name'], 'NombreLignes' => $nb_lignes_maxi_for_table, 'NombreBoucles' => $nombre_boucles, 'NumeroBoucle' => $numero_boucle); } } if ($etape == 1) { // Fin de la première étape return 'Sauvegarde de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée'; } } // Créer les fichiers sql table par table, et morceau par morceau... if (count($_SESSION['tab_tables_info'])) { $i_stop = $etape ? min(10, count($_SESSION['tab_tables_info'])) : count($_SESSION['tab_tables_info']); for ($i = 0; $i < $i_stop; $i++) { $tab_table_info = array_shift($_SESSION['tab_tables_info']); extract($tab_table_info); // TableNom NombreLignes NombreBoucles NumeroBoucle $fichier_contenu = ''; // ... la structure if ($NumeroBoucle == 0) { $fichier_contenu .= 'DROP TABLE IF EXISTS ' . $TableNom . ';' . "\r\n"; $DB_ROW = DB_STRUCTURE_COMMUN::DB_recuperer_table_structure($TableNom); $fichier_contenu .= str_replace('`', '', $DB_ROW['Create Table']) . ';' . "\r\n"; $fichier_contenu .= 'ALTER TABLE ' . $TableNom . ' DISABLE KEYS;' . "\r\n"; } // ... les données $tab_ligne_insert = array(); $from = $NumeroBoucle * $NombreLignes; $DB_TAB = DB_STRUCTURE_COMMUN::DB_recuperer_table_donnees($TableNom, $from, $NombreLignes); if (!empty($DB_TAB)) { foreach ($DB_TAB as $DB_ROW) { $DB_ROW = array_map('formater_valeur', $DB_ROW); $tab_ligne_insert[] = '(' . implode(',', $DB_ROW) . ')'; } $fichier_contenu .= 'INSERT INTO ' . $TableNom . ' VALUES ' . "\r\n" . implode(',' . "\r\n", $tab_ligne_insert) . ';' . "\r\n"; } if ($NumeroBoucle == $NombreBoucles - 1) { $fichier_contenu .= 'ALTER TABLE ' . $TableNom . ' ENABLE KEYS;' . "\r\n"; } // Enregistrer le fichier $fichier_sql_nom = 'dump_' . $TableNom . '_' . sprintf("%03u", $NumeroBoucle) . '.sql'; FileSystem::ecrire_fichier($dossier_temp . $fichier_sql_nom, $fichier_contenu); } if ($etape > 0) { return 'Sauvegarde de la base en cours ; étape n°' . sprintf("%02u", $etape) . ' réalisée'; } else { unset($_SESSION['tab_tables_info']); return TRUE; } } else { // A la dernière étape on ne fait rien ici, on zippe juste les fichiers après appel de cette fonction unset($_SESSION['tab_tables_info']); return 'Sauvegarde de la base terminée'; } }
public static function execute() { if(!isset($_COOKIE[SESSION_NOM])) { // 1. Aucune session transmise Session::open_new(); Session::init(); if(!Session::$tab_droits_page['public']) { // 1.1. Demande d'accès à une page réservée (donc besoin d'identification) : session perdue / expirée, ou demande d'accès direct (lien profond) -> redirection pour une nouvelle identification $_SESSION['MEMO_GET'] = $_GET ; // On mémorise $_GET pour un lien profond hors SSO, mais pas d'initialisation de session sinon la redirection avec le SSO tourne en boucle. Session::exit_sauf_SSO('Session absente / perdue / expirée / incompatible.'); // Si SSO au prochain coup on ne passera plus par là. } else { // 1.2 Accès à une page publique : RAS } } else { // 2. id de session transmis Session::open_old(); if(!isset($_SESSION['USER_PROFIL_SIGLE'])) { // 2.1. Pas de session retrouvée (sinon cette variable serait renseignée) if(!Session::$tab_droits_page['public']) { // 2.1.1. Session perdue ou expirée et demande d'accès à une page réservée : redirection pour une nouvelle identification Session::close__open_new__init( TRUE /*memo_GET*/ ); Session::exit_sauf_SSO('Session absente / perdue / expirée / incompatible.'); // On peut initialiser la session avant car si SSO au prochain coup on ne passera plus par là. } else { // 2.1.2. Session perdue ou expirée et page publique : création d'une nouvelle session, pas de message d'alerte pour indiquer que la session est perdue Session::close__open_new__init( TRUE /*memo_GET*/ ); } } elseif($_SESSION['USER_PROFIL_SIGLE'] == 'OUT') { // 2.2. Session retrouvée, utilisateur non identifié if(!Session::$tab_droits_page['public']) { // 2.2.1. Espace non identifié => Espace identifié : redirection pour identification $_SESSION['MEMO_GET'] = $_GET ; // On mémorise $_GET pour un lien profond hors SSO, mais pas d'initialisation de session sinon la redirection avec le SSO tourne en boucle. Session::exit_sauf_SSO('Authentification manquante ou perdue (onglets incompatibles ouverts ?).'); } else { // 2.2.2. Espace non identifié => Espace non identifié : RAS } } // On ne teste un vol de session que pour les utilisateurs identifiés car un établissement peut paramétrer d'éviter cette vérification elseif( $tab_info_pb = Session::TestAnomalieSession() ) { // 2.3. Session retrouvée, mais pb détecté (IP changée, navigateur différent) list( $msg_pb , $avant , $apres ) = $tab_info_pb; // Enregistrement du détail $fichier_nom = 'session_anomalie_'.$_SESSION['BASE'].'_'.$_SESSION['SESSION_ID'].'.txt'; $fichier_contenu = 'Appel anormal : '.$msg_pb.'.'."\r\n\r\n".'Avant : '.$avant."\r\n".'Après : '.$apres."\r\n"; FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fichier_nom , $fichier_contenu ); // Game over Session::close__open_new__init( TRUE /*memo_GET*/ ); Session::exit_sauf_SSO('Appel anormal : '.$msg_pb.' (<a href="'.URL_DIR_EXPORT.$fichier_nom.'" target="_blank">détail</a>).'); } else { // 2.4. Session retrouvée, utilisateur identifié if(Session::$tab_droits_page[$_SESSION['USER_PROFIL_TYPE']]) { // 2.4.1. Espace identifié => Espace identifié identique : RAS } elseif(Session::$tab_droits_page['public']) { // 2.4.2. Espace identifié => Espace non identifié : création d'une nouvelle session vierge, pas de message d'alerte pour indiquer que la session est perdue // A un moment il fallait tester que ce n'était pas un appel ajax, pour éviter une déconnexion si appel au calendrier qui était dans l'espace public, mais ce n'est plus le cas... // Par contre il faut conserver la session de SimpleSAMLphp pour laisser à l'utilisateur le choix de se déconnecter ou non de son SSO. $SimpleSAMLphp_SESSION = ( ($_SESSION['CONNEXION_MODE']=='gepi') && (isset($_SESSION['SimpleSAMLphp_SESSION'])) ) ? $_SESSION['SimpleSAMLphp_SESSION'] : FALSE ; // isset() pour le cas où l'admin vient de cocher le mode Gepi mais c'est connecté sans juste avant Session::close__open_new__init( FALSE /*memo_GET*/ ); if($SimpleSAMLphp_SESSION) { $_SESSION['SimpleSAMLphp_SESSION'] = $SimpleSAMLphp_SESSION; } } elseif(!Session::$tab_droits_page['public']) // (forcément) { // 2.4.3. Espace identifié => Autre espace identifié incompatible : redirection pour une nouvelle identification // Pas de redirection SSO sinon on tourne en boucle (il faudrait faire une déconnexion SSO préalable). Session::close__open_new__init( FALSE /*memo_GET*/ ); // FALSE car sinon on peut tourner en boucle (toujours redirigé vers une page qui ne correspond pas au profil utilisé) Session::exit_sauf_SSO('Appel incompatible avec votre identification actuelle.'); } } } }
/** * Mettre à jour le fichier RSS d'un prof avec une demande d'évaluation d'élève. * * @param string $fichier_chemin * @param string $titre * @param string $texte * @param string $guid * @return void */ public static function modifier_fichier_prof($prof_id, $titre, $texte, $guid) { $fichier_nom = RSS::nom_fichier_prof($prof_id); $fichier_chemin = CHEMIN_DOSSIER_RSS . $_SESSION['BASE'] . DS . $fichier_nom; $fichier_url = URL_DIR_RSS . $_SESSION['BASE'] . '/' . $fichier_nom; // S'il n'existe pas, en créer un vierge. if (!file_exists($fichier_chemin)) { RSS::creer_fichier($fichier_chemin, $fichier_url); } // Ajouter l'article $date = date('r', $_SERVER['REQUEST_TIME']); $fichier_contenu = file_get_contents($fichier_chemin); $article = ' <item>' . "\r\n"; $article .= ' <title>' . html($titre) . '</title>' . "\r\n"; $article .= ' <link>' . URL_INSTALL_SACOCHE . '</link>' . "\r\n"; $article .= ' <description>' . html($texte) . '</description>' . "\r\n"; $article .= ' <pubDate>' . $date . '</pubDate>' . "\r\n"; $article .= ' <guid isPermaLink="false">' . $guid . '</guid>' . "\r\n"; $article .= ' </item>' . "\r\n\r\n"; $bad = ' </image>' . "\r\n\r\n"; $bon = ' </image>' . "\r\n\r\n" . $article; $fichier_contenu = str_replace($bad, $bon, $fichier_contenu); // Mettre à jour la date de reconstruction $pbad = '#<lastBuildDate>(.*?)</lastBuildDate>#'; $pbon = '<lastBuildDate>' . $date . '</lastBuildDate>'; $fichier_contenu = preg_replace($pbad, $pbon, $fichier_contenu); // Couper si le fichier est long (on le ramène à 100Ko) ; ça laisse encore environ 250 entrées dans le flux. if (mb_strlen($fichier_contenu) > 120000) { $pos = mb_strpos($fichier_contenu, '</item>', 100000); $fichier_contenu = mb_substr($fichier_contenu, 0, $pos) . '</item>' . "\r\n\r\n" . '</channel>' . "\r\n" . '</rss>' . "\r\n"; } // Enregistrer FileSystem::ecrire_fichier($fichier_chemin, $fichier_contenu); }
else { unset($tab_donnees_csv[$rubrique_id][$eleve_id]['appreciation']); } } } } } if(!$nb_modifs) { exit('Erreur : aucune différence trouvée avec ce qui est déjà enregistré !'); } // On enregistre FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT.$fichier_nom.'_'.session_id().'.txt',serialize($tab_donnees_csv)); // On affiche le retour ; AJAX Upload ne permet pas de faire remonter du HTML en quantité alors on s'y prend en 2 fois... FileSystem::ecrire_fichier(CHEMIN_DOSSIER_IMPORT.$fichier_nom.'_rapport.txt','<thead><tr><th colspan="3">'.html($titre).'</th></tr></thead><tbody>'.$list_tr.'</tbody>'); exit($fichier_nom); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Cas 3 : confirmer le traitement d'un import csv (saisie déportée) // //////////////////////////////////////////////////////////////////////////////////////////////////// if($ACTION=='enregistrer_saisie_csv') { if(!$import_info) { exit('Erreur : valeur pour récupérer les informations manquante !'); } $tab_infos = explode('_',$import_info); if(count($tab_infos)!=11)
/** * Enregistrer les choix mémorisées d'un formulaire. * * @param string $page * @return void */ public static function save_choix($page) { switch($page) { case 'grille_referentiel' : global $eleves_ordre,$matiere_id,$niveau_id,$type_generique,$type_individuel,$type_synthese,$tableau_synthese_format,$tableau_tri_mode,$repeter_entete,$retroactif,$only_socle,$aff_coef,$aff_socle,$aff_lien,$cases_nb,$cases_largeur,$remplissage,$colonne_bilan,$colonne_vide,$orientation,$couleur,$fond,$legende,$marge_min,$pages_nb; $tab_choix_new = compact('eleves_ordre','matiere_id','niveau_id','type_generique','type_individuel','type_synthese','tableau_synthese_format','tableau_tri_mode','repeter_entete','retroactif','only_socle','aff_coef','aff_socle','aff_lien','cases_nb','cases_largeur','remplissage','colonne_bilan','colonne_vide','orientation','couleur','fond','legende','marge_min','pages_nb'); break; case 'releve_items' : global $eleves_ordre,$matiere_id,$type_individuel,$type_synthese,$type_bulletin,$releve_individuel_format,$aff_etat_acquisition,$aff_moyenne_scores,$aff_pourcentage_acquis,$conversion_sur_20,$tableau_synthese_format,$tableau_tri_mode,$repeter_entete,$with_coef,$retroactif,$only_socle,$aff_coef,$aff_socle,$aff_lien,$aff_domaine,$aff_theme,$cases_nb,$cases_largeur,$orientation,$couleur,$fond,$legende,$marge_min,$pages_nb; $tab_choix_new = compact('eleves_ordre','matiere_id','type_individuel','type_synthese','type_bulletin','releve_individuel_format','aff_etat_acquisition','aff_moyenne_scores','aff_pourcentage_acquis','conversion_sur_20','tableau_synthese_format','tableau_tri_mode','repeter_entete','with_coef','retroactif','only_socle','aff_coef','aff_socle','aff_lien','aff_domaine','aff_theme','cases_nb','cases_largeur','orientation','couleur','fond','legende','marge_min','pages_nb'); break; case 'bilan_chronologique' : global $eleves_ordre,$mode_synthese,$fusion_niveaux,$indicateur,$conversion_sur_20,$retroactif,$only_socle,$echelle; $tab_choix_new = compact('eleves_ordre','mode_synthese','fusion_niveaux','indicateur','conversion_sur_20','retroactif','only_socle','echelle'); break; case 'releve_synthese' : global $eleves_ordre,$matiere_id,$mode_synthese,$fusion_niveaux,$retroactif,$only_socle,$only_niveau,$aff_coef,$aff_socle,$aff_lien,$aff_start,$couleur,$fond,$legende,$marge_min; $tab_choix_new = compact('eleves_ordre','matiere_id','mode_synthese','fusion_niveaux','retroactif','only_socle','only_niveau','aff_coef','aff_socle','aff_lien','aff_start','couleur','fond','legende','marge_min'); break; case 'releve_socle' : global $eleves_ordre,$palier_id,$only_presence,$aff_coef,$aff_socle,$aff_lien,$aff_start,$aff_socle_PA,$aff_socle_EV,$mode,$couleur,$fond,$legende,$marge_min; $tab_choix_new = compact('eleves_ordre','palier_id','only_presence','aff_coef','aff_socle','aff_lien','aff_start','aff_socle_PA','aff_socle_EV','mode','couleur','fond','legende','marge_min'); case 'releve_synthese_socle' : global $eleves_ordre,$palier_id,$type,$mode,$couleur,$fond,$legende,$marge_min; $tab_choix_new = compact('eleves_ordre','palier_id','type','mode','couleur','fond','legende','marge_min'); break; case 'validation_socle_item' : global $eleves_ordre,$palier_id,$mode; $tab_choix_new = compact('eleves_ordre','palier_id','mode'); break; case 'validation_socle_pilier' : global $eleves_ordre,$palier_id; $tab_choix_new = compact('eleves_ordre','palier_id'); break; case 'matiere' : global $matiere_id; $tab_choix_new = compact('matiere_id'); break; case 'palier' : global $palier_id; $tab_choix_new = compact('palier_id'); break; case 'evaluation_cartouche' : global $orientation,$couleur,$fond,$legende,$marge_min,$cart_detail,$cart_cases_nb,$cart_contenu; $tab_choix_new = compact('orientation','couleur','fond','legende','marge_min','cart_detail','cart_cases_nb','cart_contenu'); break; case 'evaluation_statistiques' : case 'evaluation_archivage' : global $couleur,$fond; $tab_choix_new = compact('couleur','fond'); break; case 'evaluation_gestion' : global $eleves_ordre; $tab_choix_new = compact('eleves_ordre'); break; default : $tab_choix_new = array(); } // Récupération du contenu du "cookie", surchargé avec les choix effectués Form::load_choix_memo(); Form::$tab_choix = array_merge( Form::$tab_choix , $tab_choix_new ); /* Remarque : il y a un problème de serialize avec les type float : voir http://fr2.php.net/manual/fr/function.serialize.php#85988 Dans ce cas il faut remplacer serialize(Form::$tab_choix) par private static function callback_float($matches) { return "'d:'.(round($matches[1],9)).';'"; } preg_replace_callback( '/d:([0-9]+(\.[0-9]+)?([Ee][+-]?[0-9]+)?);/', "Form::callback_float", serialize(Form::$tab_choix) ); */ FileSystem::ecrire_fichier(Form::$fichier_cookie,serialize(Form::$tab_choix)); }
// Pour avoir les élèves dans l'ordre alphabétique, il faut utiliser $tab_eleve_id. $archivage_tableau_PDF->SetXY($archivage_tableau_PDF->marge_gauche, $archivage_tableau_PDF->marge_haut + $archivage_tableau_PDF->etiquette_hauteur); foreach ($tab_eleve_id as $eleve_id) { extract($tab_eleve_infos[$eleve_id]); // $eleve_nom $eleve_prenom $date_naissance $eleve_brevet_serie $archivage_tableau_PDF->moyennes_reference_eleve($eleve_id, $eleve_nom . ' ' . $eleve_prenom); $archivage_tableau_CSV .= '"' . $eleve_nom . ' ' . $eleve_prenom . '"'; foreach ($tab_brevet_serie as $serie_ref => $serie_nom) { foreach ($tab_brevet_epreuve[$serie_ref] as $epreuve_ref => $epreuve_nom) { $note = isset($tab_saisie[$eleve_id][$serie_ref . $epreuve_ref]) ? $tab_saisie[$eleve_id][$serie_ref . $epreuve_ref] : NULL; $archivage_tableau_PDF->moyennes_note($eleve_id, $epreuve_ref, $note, TRUE); $archivage_tableau_CSV .= $separateur . '"' . str_replace('.', ',', $note) . '"'; // Remplacer le point décimal par une virgule pour le tableur. } } $archivage_tableau_PDF->SetXY($archivage_tableau_PDF->marge_gauche, $archivage_tableau_PDF->GetY() + $archivage_tableau_PDF->cases_hauteur); $archivage_tableau_CSV .= "\r\n"; } } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Enregistrement et affichage du retour. // //////////////////////////////////////////////////////////////////////////////////////////////////// $fichier_export = 'saisies_' . $bilan_type . '_' . $annee_session_brevet . '_' . Clean::fichier($classe_nom) . '_' . $action . '_' . fabriquer_fin_nom_fichier__date_et_alea(); FileSystem::ecrire_sortie_PDF(CHEMIN_DOSSIER_EXPORT . $fichier_export . '.pdf', $archivage_tableau_PDF); echo '<a target="_blank" href="' . URL_DIR_EXPORT . $fichier_export . '.pdf"><span class="file file_pdf">' . $tab_actions[$action] . ' (format <em>pdf</em>).</span></a>'; // Et le csv éventuel if ($action == 'imprimer_donnees_eleves_moyennes') { FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier_export . '.csv', To::csv($archivage_tableau_CSV)); echo '<br />' . NL . '<a target="_blank" href="./force_download.php?fichier=' . $fichier_export . '.csv"><span class="file file_txt">' . $tab_actions[$action] . ' (format <em>csv</em>).</span></a>'; } exit;
} } else { echo'<tr class="vide"><td class="nu" colspan="15"></td><td class="nu"></td></tr>'.NL; } ?> </tbody> </table> <?php if( $find_doublon && !empty($DB_TAB) ) { // Finalisation de l'export CSV (archivage dans un fichier) $fnom = 'extraction_doublons_responsables_'.fabriquer_fin_nom_fichier__date_et_alea(); FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fnom.'.csv' , To::csv($export_csv) ); echo'<p><ul class="puce"><li><a target="_blank" href="./force_download.php?fichier='.$fnom.'.csv"><span class="file file_txt">Récupérer les données dans un fichier (format <em>csv</em></span>).</a></li></ul></p>'.NL; } ?> <div id="zone_actions" style="margin-left:3em"> <div class="p"><span class="u">Pour les utilisateurs cochés :</span> <input id="listing_ids" name="listing_ids" type="hidden" value="" /><label id="ajax_msg_actions"> </label></div> <button id="retirer" type="button" class="user_desactiver">Retirer</button> (date de sortie au <?php echo TODAY_FR ?>).<br /> <button id="reintegrer" type="button" class="user_ajouter">Réintégrer</button> (retrait de la date de sortie).<br /> <button id="supprimer" type="button" class="supprimer">Supprimer</button> sans attendre 3 ans (uniquement si déjà sortis). </div> <form action="#" method="post" id="form_gestion" class="hide"> <h2>Ajouter | Modifier un utilisateur</h2> <p> <label class="tab" for="f_id_ent">Id. ENT <img alt="" src="./_img/bulle_aide.png" width="16" height="16" title="Uniquement en cas d'identification via un ENT." /> :</label><input id="f_id_ent" name="f_id_ent" type="text" value="" size="30" maxlength="63" /><br />
exit('Ce fichier ne peut être appelé directement !'); } $TITRE = "Ajout CSV d'établissements"; // Pas de traduction car pas de choix de langue pour ce profil. // Page réservée aux installations multi-structures ; le menu webmestre d'une installation mono-structure ne permet normalement pas d'arriver ici if (HEBERGEUR_INSTALLATION == 'mono-structure') { echo '<p class="astuce">L\'installation étant de type mono-structure, cette fonctionnalité de <em>SACoche</em> est sans objet vous concernant.</p>' . NL; return; // Ne pas exécuter la suite de ce fichier inclus. } // Créer un csv d'exemple $separateur = ';'; $fichier_csv = 'ajout_structures.csv'; $contenu_csv = 'Id_Import' . $separateur . 'Id_Zone' . $separateur . 'Localisation' . $separateur . 'Dénomination' . $separateur . 'UAI' . $separateur . 'Contact_Nom' . $separateur . 'Contact_Prénom' . $separateur . 'Contact_Courriel' . "\r\n"; $contenu_csv .= '' . $separateur . '1' . $separateur . 'Jolieville' . $separateur . 'CLG du Bonheur' . $separateur . '0123456A' . $separateur . 'EDISON' . $separateur . 'Thomas' . $separateur . '*****@*****.**' . "\r\n"; FileSystem::ecrire_fichier(CHEMIN_DOSSIER_TMP . $fichier_csv, $contenu_csv); ?> <p><span class="manuel"><a class="pop_up" href="<?php echo SERVEUR_DOCUMENTAIRE; ?> ?fichier=support_webmestre__structure_ajout_csv">DOC : Ajout CSV d'établissements (multi-structures).</a></span></p> <ul class="puce"> <li><a target="_blank" href="<?php echo URL_DIR_TMP . $fichier_csv; ?> "><span class="file file_txt">Récupérer le modèle de fichier <em>CSV</em> à utiliser.</span></a></li> </ul> <hr />