Exemple #1
0
 /**
  * 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;
 }
Exemple #9
0
 /**
  * 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 . '].');
 }
Exemple #10
0
        $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';
Exemple #12
0
 /**
  * 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;
}
Exemple #14
0
 /**
  * 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&hellip;");
}

//
// 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 &amp; bilans &rarr; 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">&nbsp;</th>'.Html::td_score($moyenne_moyenne_scores,'score','%').'<th class="nu">&nbsp;</th>'.$entete_vide.$checkbox_vide.'</tr>'.NL;
  $releve_HTML_table_foot2 .= '<th class="nu">&nbsp;</th><th class="nu">&nbsp;</th>'.Html::td_score($moyenne_pourcentage_acquis,'score','%').$entete_vide.$checkbox_vide.'</tr>'.NL;
  $row_entete   .= ($repeter_entete)     ? '<th class="nu">&nbsp;</th><th class="nu">&nbsp;</th><th class="nu">&nbsp;</th>'.$entete_vide.$checkbox_vide.'</tr>'.NL : '' ;
  $row_checkbox .= ($affichage_checkbox) ? '<th class="nu">&nbsp;</th><th class="nu">&nbsp;</th><th class="nu">&nbsp;</th>'.$entete_vide.$checkbox_vide.'</tr>'.NL : '' ;
  $releve_HTML_table_foot = '<tfoot>'.NL.'<tr class="vide"><td class="nu" colspan="'.$colspan.'">&nbsp;</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 &amp; 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;
}
?>
Exemple #21
0
/**
 * 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';
    }
}
Exemple #22
0
 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.');
       }
     }
   }
 }
Exemple #23
0
 /**
  * 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)
Exemple #25
0
  /**
   * 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">&nbsp;</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 />