$export_csv .= ($with_note) ? $separateur."\r\n" : "\r\n" ; } $export_csv .= "\r\n"; // une valeur NULL donnera une chaine vide } $fnom_export = 'saisie_deportee_'.$_SESSION['BASE'].'_'.$_SESSION['USER_ID'].'_'.Clean::fichier($BILAN_TYPE).'_'.Clean::fichier($periode_nom).'_'.Clean::fichier($groupe_nom).'_'.$BILAN_ETAT.'_'.fabriquer_fin_nom_fichier__date_et_alea().'.csv'; FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fnom_export , To::csv($export_csv) ); exit($fnom_export); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Cas 2 : réception d'un import csv (saisie déportée) // //////////////////////////////////////////////////////////////////////////////////////////////////// if($ACTION=='uploader_saisie_csv') { $fichier_nom = 'saisie_deportee_'.$_SESSION['BASE'].'_'.$_SESSION['USER_ID'].'_'.Clean::fichier($BILAN_TYPE).'_'.$periode_id.'_'.$groupe_id.'_'.$BILAN_ETAT.'_'.fabriquer_fin_nom_fichier__date_et_alea(); $result = FileSystem::recuperer_upload( CHEMIN_DOSSIER_IMPORT /*fichier_chemin*/ , $fichier_nom.'.<EXT>' /*fichier_nom*/ , array('txt','csv') /*tab_extensions_autorisees*/ , NULL /*tab_extensions_interdites*/ , NULL /*taille_maxi*/ , NULL /*filename_in_zip*/ ); if($result!==TRUE) { exit('Erreur : '.$result); } $contenu_csv = file_get_contents(CHEMIN_DOSSIER_IMPORT.FileSystem::$file_saved_name); $contenu_csv = To::deleteBOM(To::utf8($contenu_csv)); // Mettre en UTF-8 si besoin et retirer le BOM éventuel $tab_lignes = extraire_lignes($contenu_csv); // Extraire les lignes du fichier if(count($tab_lignes)<4) { exit('Erreur : absence de données suffisantes (fichier comportant moins de 4 lignes) !'); } $separateur = extraire_separateur_csv($tab_lignes[2]); // Déterminer la nature du séparateur // Données de la ligne d'en-tête $tab_elements = str_getcsv($tab_lignes[0],$separateur);
* si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>. * */ if(!defined('SACoche')) {exit('Ce fichier ne peut être appelé directement !');} /** * Code inclus commun aux pages * [./_inc/code_brevet_fiches_***.php] */ Erreur500::prevention_et_gestion_erreurs_fatales( TRUE /*memory*/ , FALSE /*time*/ ); // Chemins d'enregistrement $fichier_nom = 'fiche_brevet_'.Clean::fichier($groupe_nom).'_'.fabriquer_fin_nom_fichier__date_et_alea() ; // Initialisation de tableaux $tab_eleve_infos = array(); // [eleve_id] => array(eleve_INE,eleve_nom,eleve_prenom,eleve_genre,date_naissance,eleve_brevet_serie) $tab_matiere = array(); // [matiere_id] => matiere_nom $tab_brevet_serie = array(); // [serie_ref] => serie_nom $tab_brevet_epreuve = array(); // [serie_ref][epreuve_code] => epreuve_nom, epreuve_obligatoire, epreuve_note_chiffree, epreuve_point_sup_10, epreuve_note_comptee, epreuve_coefficient, choix_matieres $tab_eleve_saisie = array(); // [eleve_id][epreuve_code][prof_id] => array(prof_info,appreciation,note); avec eleve_id=0 pour note ou appréciation sur la classe // //////////////////////////////////////////////////////////////////////////////////////////////////// // Récupération de l'identité des élèves // //////////////////////////////////////////////////////////////////////////////////////////////////// $tab_eleve_infos = DB_STRUCTURE_BILAN::DB_lister_eleves_cibles( $liste_eleve , 'alpha' /*eleves_ordre*/ , FALSE /*with_gepi*/ , FALSE /*with_langue*/ , TRUE /*with_brevet_serie*/ ); if(!is_array($tab_eleve_infos))
* * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ; * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>. * */ if (!defined('SACoche')) { exit('Ce fichier ne peut être appelé directement !'); } /** * Code inclus commun aux pages * [./pages/releve_socle.ajax.php] * [./_inc/code_officiel_***.php] */ Erreur500::prevention_et_gestion_erreurs_fatales(TRUE, FALSE); // Chemins d'enregistrement $fichier_nom = $make_action != 'imprimer' ? 'releve_socle_detail_' . Clean::fichier(substr($palier_nom, 0, strpos($palier_nom, ' ('))) . '_' . Clean::fichier($groupe_nom) . '_' . fabriquer_fin_nom_fichier__date_et_alea() : 'officiel_' . $BILAN_TYPE . '_' . Clean::fichier($groupe_nom) . '_' . fabriquer_fin_nom_fichier__date_et_alea(); // Tableau des langues require CHEMIN_DOSSIER_INCLUDE . 'tableau_langues_socle.php'; $tab_item_pilier = array(); // id de l'item => id du pilier // Initialisation de tableaux $tab_pilier = array(); // [pilier_id] => pilier_nom; $tab_section = array(); // [pilier_id][section_id] => section_nom; $tab_socle = array(); // [section_id][socle_id] => socle_nom; $tab_entree_id = array(); // [i] => entree_id $tab_eleve_infos = array(); // [eleve_id] => array(eleve_INE,eleve_nom,eleve_prenom,date_naissance,eleve_langue)
$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);
} // Tag date heure initiales (code repris de [code_officiel_imprimer.php] ) $tag_date_heure_initiales = date('d/m/Y H:i') . ' ' . afficher_identite_initiale($_SESSION['USER_PRENOM'], TRUE, $_SESSION['USER_NOM'], TRUE); // Fabrication du PDF $archivage_tableau_PDF = new PDF_archivage_tableau(TRUE, 'portrait', 5, 5, 5, 12, 'non'); unset($tab_eleve_id[0]); $classe_effectif = count($tab_eleve_id); foreach ($tab_eleve_id as $eleve_id => $tab_eleve) { $archivage_tableau_PDF->recapitulatif_initialiser($tab_etabl_coords, $tab_eleve, $classe_nom, $classe_effectif, $annee_affichee, $tag_date_heure_initiales, $tab_nb_lignes[$eleve_id][0]); foreach ($tab_rubriques as $rubrique_id => $rubrique_nom) { $tab_profs = isset($tab_saisies[$eleve_id][$rubrique_id]['professeur']) ? $tab_saisies[$eleve_id][$rubrique_id]['professeur'] : NULL; $moyenne_eleve = $tab_moyennes[$rubrique_id][$eleve_id]; $moyenne_classe = $tab_moyennes[$rubrique_id][0]; $tab_appreciations = isset($tab_saisies[$eleve_id][$rubrique_id]['appreciation']) ? $tab_saisies[$eleve_id][$rubrique_id]['appreciation'] : array(); $archivage_tableau_PDF->recapitulatif_rubrique($tab_nb_lignes[$eleve_id][$rubrique_id], $rubrique_nom, $tab_profs, $moyenne_eleve, $moyenne_classe, $tab_appreciations); } } $periode_nom = 'Année Scolaire'; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Enregistrement et affichage du retour. // //////////////////////////////////////////////////////////////////////////////////////////////////// $fichier_export = 'saisies_' . $BILAN_TYPE . '_' . Clean::fichier($periode_nom) . '_' . 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;
* Libérer de la place mémoire car les scripts de bilans sont assez gourmands. * Supprimer $DB_TAB ne fonctionne pas si on ne force pas auparavant la fermeture de la connexion. * SebR devrait peut-être envisager d'ajouter une méthode qui libère cette mémoire, si c'est possible... */ // //////////////////////////////////////////////////////////////////////////////////////////////////// DB::close(SACOCHE_STRUCTURE_BD_NAME); unset($DB_TAB); // //////////////////////////////////////////////////////////////////////////////////////////////////// // Tableaux et variables pour mémoriser les infos ; dans cette partie on ne fait que les calculs (aucun affichage) // //////////////////////////////////////////////////////////////////////////////////////////////////// $fichier = 'grille_item_'.Clean::fichier($matiere_nom).'_'.Clean::fichier($niveau_nom).'_<REPLACE>_'.fabriquer_fin_nom_fichier__date_et_alea(); $fichier_nom_type1 = ($type_generique) ? str_replace( '<REPLACE>' , 'generique' , $fichier ) : str_replace( '<REPLACE>' , Clean::fichier($groupe_nom).'_individuel' , $fichier ) ; $fichier_nom_type2 = str_replace( '<REPLACE>' , Clean::fichier($groupe_nom).'_synthese' , $fichier ) ; $tab_score_eleve_item = array(); // Retenir les scores / élève / item $tab_score_item_eleve = array(); // Retenir les scores / item / élève $tab_moyenne_scores_eleve = array(); // Retenir la moyenne des scores d'acquisitions / élève $tab_pourcentage_acquis_eleve = array(); // Retenir le pourcentage d'items acquis / élève $tab_moyenne_scores_item = array(); // Retenir la moyenne des scores d'acquisitions / item $tab_pourcentage_acquis_item = array(); // Retenir le pourcentage d'items acquis / item $moyenne_moyenne_scores = 0; // moyenne des moyennes des scores d'acquisitions $moyenne_pourcentage_acquis = 0; // moyenne des moyennes des pourcentages d'items acquis /* Calcul des états d'acquisition (si besoin) et des données nécessaires pour le tableau de synthèse (si besoin). $tab_score_eleve_item[$eleve_id][$item_id] $tab_score_item_eleve[$item_id][$eleve_id] $tab_moyenne_scores_eleve[$eleve_id]
$releve_HTML_body .= '<td class="nu2"></td>'; foreach ($tab as $socle_id => $socle_nom) { $releve_HTML_body .= Html::td_validation('td', $tab_user_entree[$eleve_id][$socle_id], FALSE, $tab_user_pilier[$eleve_id][$pilier_id]['etat']); } } $releve_HTML_body .= '</tr>' . NL; $releve_PDF->validation_eleve($eleve_id, $eleve_nom, $eleve_prenom, $tab_user_pilier, $tab_user_entree, $tab_pilier, $tab_socle, $drapeau_langue); } } $releve_HTML .= $affichage_checkbox ? '<form id="form_synthese" action="#" method="post">' . NL : ''; $releve_HTML .= '<table class="bilan"><thead>' . NL . $releve_HTML_head . '</thead><tbody>' . NL . $releve_HTML_body . '</tbody></table>' . NL; $releve_HTML .= $affichage_checkbox ? HtmlForm::afficher_synthese_exploitation('eleves') . '</form>' . NL : ''; $releve_HTML .= Html::legende(FALSE, FALSE, FALSE, FALSE, $type == 'pourcentage', $type == 'validation', FALSE); $releve_PDF->legende($type); // Chemins d'enregistrement $fichier = 'releve_socle_synthese_' . Clean::fichier(substr($palier_nom, 0, strpos($palier_nom, ' ('))) . '_' . Clean::fichier($groupe_nom) . '_' . $type . '_' . fabriquer_fin_nom_fichier__date_et_alea(); // On enregistre les sorties HTML et PDF FileSystem::ecrire_fichier(CHEMIN_DOSSIER_EXPORT . $fichier . '.html', $releve_HTML); FileSystem::ecrire_sortie_PDF(CHEMIN_DOSSIER_EXPORT . $fichier . '.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 . '.pdf"><span class="file file_pdf">Archiver / Imprimer (format <em>pdf</em>).</span></a></li>' . NL; echo '</ul>' . NL; echo $releve_HTML; } else { echo '<ul class="puce">' . NL; echo '<li><a target="_blank" href="' . URL_DIR_EXPORT . $fichier . '.pdf"><span class="file file_pdf">Archiver / Imprimer (format <em>pdf</em>).</span></a></li>' . NL; echo '<li><a target="_blank" href="./releve_html.php?fichier=' . $fichier . '"><span class="file file_htm">Explorer / Détailler (format <em>html</em>).</span></a></li>' . NL; echo '</ul>' . NL;
FileSystem::supprimer_fichier(CHEMIN_DOSSIER_IMPORT.$fichier_nom); if($code_erreur) { FileSystem::supprimer_dossier($dossier_temp); // Pas seulement vider, au cas où il y aurait des sous-dossiers créés par l'archive. exit('Erreur : votre archive ZIP n\'a pas pu être ouverte ('.FileSystem::$tab_zip_error[$code_erreur].') !'); } // Récupérer la liste des élèves et fabriquer le nom de fichier attendu correspondant à chacun $tab_bad = array( '[sconet_id]' , '[sconet_num]' , '[reference]' , '[nom]' , '[prenom]' , '[login]' , '[ent_id]' ); $champs = 'user_id, user_id_ent, user_sconet_id, user_sconet_elenoet, user_reference, user_nom, user_prenom, user_login' ; $DB_TAB = DB_STRUCTURE_COMMUN::DB_lister_users_regroupement( 'eleve' /*profil_type*/ , 1 /*statut*/ , 'all' /*groupe_type*/ , 0 /*groupe_id*/ , 'alpha' /*eleves_ordre*/ , $champs ); if(!empty($DB_TAB)) { foreach($DB_TAB as $DB_ROW) { $tab_bon = array( $DB_ROW['user_sconet_id'] , $DB_ROW['user_sconet_elenoet'] , Clean::fichier($DB_ROW['user_reference']) , Clean::fichier($DB_ROW['user_nom']) , Clean::fichier($DB_ROW['user_prenom']) , Clean::fichier($DB_ROW['user_login']) , Clean::fichier($DB_ROW['user_id_ent']) ); $tab_fichier_masque[$DB_ROW['user_id']] = Clean::fichier(str_replace( $tab_bad , $tab_bon , $masque )); } } // Pour l'affichage du retour $thead = '<tr><td colspan="2">Import d\'un fichier de photos zippées le '.date('d/m/Y H:i:s').'</td></tr>'; $tbody = ''; // Traiter les fichier un à un $tab_fichier = FileSystem::lister_contenu_dossier($dossier_temp); foreach($tab_fichier as $fichier_nom) { // echo'*'.$fichier_nom; $tab_user_id = array_keys( $tab_fichier_masque , $fichier_nom ); $nb_user_find = count($tab_user_id); if($nb_user_find == 0) { $tbody .= '<tr><td class="r">'.html($fichier_nom).'</td><td>Pas de correspondance trouvée.</td></tr>';
* [./pages/brevet_moyennes.ajax.php] * [./_inc/code_officiel_***.php] */ Erreur500::prevention_et_gestion_erreurs_fatales( TRUE /*memory*/ , FALSE /*time*/ ); /* $type_individuel | $type_synthese | $type_bulletin $releve_modele [ matiere | selection | multimatiere | professeur ] */ $matiere_et_groupe = ($releve_modele=='matiere') ? $matiere_nom.' - '.$groupe_nom : $groupe_nom ; // Chemins d'enregistrement $fichier_nom = ($make_action!='imprimer') ? 'releve_item_'.$releve_modele.'_'.Clean::fichier($groupe_nom).'_<REPLACE>_'.fabriquer_fin_nom_fichier__date_et_alea() : 'officiel_'.$BILAN_TYPE.'_'.Clean::fichier($groupe_nom).'_'.fabriquer_fin_nom_fichier__date_et_alea() ; // Si pas grille générique et si notes demandées ou besoin pour colonne bilan ou besoin pour synthèse $calcul_acquisitions = ( $type_synthese || $type_bulletin || $aff_etat_acquisition ) ? TRUE : FALSE ; // Initialisation de tableaux $tab_item_infos = array(); // [item_id] => array(item_ref,item_nom,item_coef,item_cart,item_socle,item_lien,calcul_methode,calcul_limite,calcul_retroactif); $tab_matiere_item = array(); // [matiere_id][item_id] => item_nom $tab_eleve_infos = array(); // [eleve_id] => array(eleve_INE,eleve_nom,eleve_prenom,date_naissance,eleve_id_gepi) $tab_matiere = array(); // [matiere_id] => array(matiere_nom,matiere_nb_demandes) $tab_eval = array(); // [eleve_id][matiere_id][item_id][devoir] OU [matiere_id][item_id][eleve_id][devoir] => array(note,date,info) // Initialisation de variables if( ($make_html) || ($make_pdf) )
$repartition_type = (isset($_POST['f_repartition_type'])) ? Clean::texte($_POST['f_repartition_type']) : ''; $cart_detail = (isset($_POST['f_detail'])) ? Clean::texte($_POST['f_detail']) : ''; $cart_cases_nb = (isset($_POST['f_cases_nb'])) ? Clean::entier($_POST['f_cases_nb']) : ''; $cart_contenu = (isset($_POST['f_contenu'])) ? Clean::texte($_POST['f_contenu']) : ''; $orientation = (isset($_POST['f_orientation'])) ? Clean::texte($_POST['f_orientation']) : ''; $marge_min = (isset($_POST['f_marge_min'])) ? Clean::texte($_POST['f_marge_min']) : ''; $couleur = (isset($_POST['f_couleur'])) ? Clean::texte($_POST['f_couleur']) : ''; $fond = (isset($_POST['f_fond'])) ? Clean::texte($_POST['f_fond']) : ''; $only_req = (isset($_POST['f_restriction_req'])) ? TRUE : FALSE; $doc_objet = (isset($_POST['f_doc_objet'])) ? Clean::texte($_POST['f_doc_objet']) : ''; $doc_url = (isset($_POST['f_doc_url'])) ? Clean::texte($_POST['f_doc_url']) : ''; $fini = (isset($_POST['f_fini'])) ? Clean::texte($_POST['f_fini']) : ''; $chemin_devoir = CHEMIN_DOSSIER_DEVOIR.$_SESSION['BASE'].DS; $url_dossier_devoir = URL_DIR_DEVOIR.$_SESSION['BASE'].'/'; $fnom_export = $_SESSION['BASE'].'_'.Clean::fichier($groupe_nom).'_'.Clean::fichier($description).'_'.fabriquer_fin_nom_fichier__date_et_alea(); // Si "ref" est renseigné (pour Éditer ou Retirer ou Saisir ou ...), il contient l'id de l'évaluation + '_' + l'initiale du type de groupe + l'id du groupe // Dans le cas d'une duplication, "ref" sert à retrouver l'évaluation d'origine pour évenuellement récupérer l'ordre des items if(mb_strpos($ref,'_')) { list($devoir_id,$groupe_temp) = explode('_',$ref,2); $devoir_id = Clean::entier($devoir_id); // Si "groupe" est transmis en POST (pour Ajouter ou Éditer), il faut le prendre comme référence nouvelle ; sinon, on prend le groupe extrait de "ref" $groupe = ($groupe) ? $groupe : Clean::texte($groupe_temp) ; } else { $devoir_id = 0; }
public static function zip_filename($text) { return Clean::fichier(iconv('CP850','UTF-8',$text)); } // filenames stored in the ZIP archives created on non-Unix systems are encoded in CP850 http://fr.php.net/manual/fr/function.zip-entry-name.php#87130
/** * Récupérer un fichier uploadé, effectuer les vérifications demandées, et l'enregistrer dans le dossier et sous le nom indiqué. * * @param string $fichier_final_chemin * @param string $fichier_final_nom (facultatif) Si pas transmis, ce sera le nom du fichier envoyé (nettoyé) ; si transmis, peut comporter ".<EXT>" qui sera remplacé par l'extension du fichier réceptionné. * @param array $tab_extensions_autorisees (facultatif) tableau des extensions autorisées * @param array $tab_extensions_interdites (facultatif) tableau des extensions interdites * @param int $taille_maxi (facultatif) en Ko * @param string $filename_in_zip (facultatif) nom d'un fichier contenu dans le fichier zippé reçu, à extraire au passage * @return TRUE|string TRUE ou un message d'erreur */ public static function recuperer_upload( $fichier_final_chemin , $fichier_final_nom=NULL , $tab_extensions_autorisees=NULL , $tab_extensions_interdites=NULL , $taille_maxi=NULL , $filename_in_zip=NULL ) { // Si le fichier dépasse les capacités du serveur, il se peut que $_FILES ne soit même pas renseigné. if(!isset($_FILES['userfile'])) { return 'Problème de transfert ! Fichier trop lourd ? '.InfoServeur::minimum_limitations_upload(); } // Si $_FILES est renseigné, il se peut qu'il y ait quand même eu un dépassement des limites ou un problème d'écriture. $tab_file = $_FILES['userfile']; $fichier_tmp_nom = $tab_file['name']; $fichier_tmp_chemin = $tab_file['tmp_name']; $fichier_tmp_taille = $tab_file['size']/1000; // Conversion octets => Ko $fichier_tmp_erreur = $tab_file['error']; if( (!file_exists($fichier_tmp_chemin)) || (!$fichier_tmp_taille) || ($fichier_tmp_erreur) ) { $alerte_open_basedir = InfoServeur::is_open_basedir() ? ' Variable serveur "open_basedir" mal renseignée ?' : '' ; $alerte_upload_size = ' Fichier trop lourd ? '.InfoServeur::minimum_limitations_upload(); return 'Problème de récupération !'.$alerte_open_basedir.$alerte_upload_size; } // Vérification d'une sécurité sur le nom if($fichier_tmp_nom{0}=='.') { return 'Le nom du fichier ne doit pas commencer par un point !'; } // Vérification de l'extension $extension = strtolower(pathinfo($fichier_tmp_nom,PATHINFO_EXTENSION)); if( ($tab_extensions_autorisees!==NULL) && (!in_array($extension,$tab_extensions_autorisees)) ) { return 'L\'extension du fichier transmis n\'est pas conforme !'; } if( ($tab_extensions_interdites!==NULL) && (in_array($extension,$tab_extensions_interdites)) ) { return 'L\'extension du fichier transmis est interdite !'; } // Vérification de la taille if( ($taille_maxi!==NULL) && ($fichier_tmp_taille>$taille_maxi) ) { $conseil = ''; if( ($tab_extensions_autorisees!==NULL) && (in_array('jpg',$tab_extensions_autorisees)) ) { $conseil = (($extension=='jpg')||($extension=='jpeg')) ? ' : réduisez les dimensions de l\'image' : ' : convertissez l\'image au format JPEG' ; } return 'Le fichier dépasse les '.$taille_maxi.' Ko autorisés'.$conseil.' !'; } // On rapatrie le fichier dans l'arborescence SACoche, en en dézippant un fichier précis si demandé $fichier_final_nom = ($fichier_final_nom) ? str_replace('.<EXT>','.'.$extension,$fichier_final_nom) : Clean::fichier($fichier_tmp_nom); if( ($extension!='zip') || ($filename_in_zip===NULL) ) { if(!move_uploaded_file($fichier_tmp_chemin,$fichier_final_chemin.$fichier_final_nom)) { return 'Le fichier n\'a pas pu être enregistré sur le serveur.'; } } else { // Dézipper le fichier (on considère alors que c'est un zip venant de SACoche et contenant import_validations.xml) if(extension_loaded('zip')!==TRUE) { return 'Le serveur ne gère pas les fichiers ZIP ! Renvoyez votre fichier sans compression.'; } // Remarque : la ligne suivante peut balancer un exit sans se poser de questions FileSystem::unzip_one( $fichier_tmp_chemin , $filename_in_zip , $fichier_final_chemin.$fichier_final_nom ); } // C'est bon :) FileSystem::$file_upload_name = $fichier_tmp_nom; FileSystem::$file_saved_name = $fichier_final_nom; return TRUE; }
$xml.= ' <etat>'.$tab_item_infos['etat'].'</etat>'."\r\n"; $xml.= ' <info>'.html($tab_item_infos['info']).'</info>'."\r\n"; } $xml.= ' </renseignement>'."\r\n"; $xml.= ' </item>'."\r\n"; } } $xml.= ' </competence>'."\r\n"; } $xml.= ' </palier>'."\r\n"; } $xml.= ' </eleve>'."\r\n"; } } $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
* * SACoche est distribué dans l’espoir qu’il vous sera utile, mais SANS AUCUNE GARANTIE : * sans même la garantie implicite de COMMERCIALISABILITÉ ni d’ADÉQUATION À UN OBJECTIF PARTICULIER. * Consultez la Licence Publique Générale GNU Affero pour plus de détails. * * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ; * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>. * */ if (!defined('SACoche')) { exit('Ce fichier ne peut être appelé directement !'); } $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');
} // On récupère les photos $listing_user_id = implode(',',array_keys($tab_vignettes)); $DB_TAB = DB_STRUCTURE_IMAGE::DB_lister_images( $listing_user_id , 'photo' ); if(!empty($DB_TAB)) { foreach($DB_TAB as $DB_ROW) { $tab_vignettes[$DB_ROW['user_id']]['img_width'] = $DB_ROW['image_largeur']; $tab_vignettes[$DB_ROW['user_id']]['img_height'] = $DB_ROW['image_hauteur']; $tab_vignettes[$DB_ROW['user_id']]['img_src'] = $DB_ROW['image_contenu']; $tab_vignettes[$DB_ROW['user_id']]['img_title'] = FALSE; } } // Génération de la sortie HTML (affichée directement) et de la sortie PDF (enregistrée dans un fichier) $fnom_pdf = 'trombinoscope_'.$_SESSION['BASE'].'_'.Clean::fichier($groupe_nom).'_'.fabriquer_fin_nom_fichier__date_et_alea().'.pdf'; $trombinoscope_HTML = '<h2>'.html($groupe_nom).'</h2><p><a target="_blank" href="'.URL_DIR_EXPORT.$fnom_pdf.'"><span class="file file_pdf">Archiver / Imprimer (format <em>pdf</em>).</span></a> → <span class="noprint">Afin de préserver l\'environnement, n\'imprimer que si nécessaire !</span></p>'; $trombinoscope_PDF = new PDF_trombinoscope( FALSE /*officiel*/ , 'portrait' /*orientation*/ , 5 /*marge_gauche*/ , 5 /*marge_droite*/ , 5 /*marge_haut*/ , 7 /*marge_bas*/ ); $trombinoscope_PDF->initialiser($groupe_nom); // On passe les élèves en revue (on a toutes les infos déjà disponibles) foreach($tab_vignettes as $user_id => $tab) { $trombinoscope_PDF->vignette($tab); $img_src = ($tab['img_src']) ? ' src="data:'.image_type_to_mime_type(IMAGETYPE_JPEG).';base64,'.$tab['img_src'].'"' : ' src="./_img/trombinoscope_vide.png"' ; $img_title = ($tab['img_title']) ? ' title="absence de photo"' : '' ; $trombinoscope_HTML .= '<div id="div_'.$user_id.'" class="photo"><img width="'.$tab['img_width'].'" height="'.$tab['img_height'].'" alt=""'.$img_src.$img_title.' /><br />'.html($tab['user_nom']).'<br />'.html($tab['user_prenom']).'</div>'; } // Enregistrement du PDF FileSystem::ecrire_sortie_PDF( CHEMIN_DOSSIER_EXPORT.$fnom_pdf , $trombinoscope_PDF ); // Affichage du HTML exit($trombinoscope_HTML);
public static function zip_filename($text) { return Clean::fichier(iconv('CP850', 'UTF-8', $text)); }
// 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;
/* Pour uploader une ressource directement sur le serveur communautaire, le fichier "professeur_referentiel_edition.php" devrait l'appeller dans une iframe (le bouton d'upload du formulaire devant se trouver sur ce serveur). Mais : - une fois l'upload effectué, pour faire remonter l'info au serveur où est installé SACoche, se pose un souci de cross-domain javascript. - il faudrait reproduire côté serveur communautaire tout un environnement (js & css) semblable à celui du serveur d'installation de SACoche Finalement, j'ai opté pour le plus simple même si ce n'est pas le plus économe : uploader sur le serveur SACoche puis transférer vers le serveur communautaire avec cURL::get_contents(). Ca va qu'une limite de 500Ko est imposée... */ if($action=='Uploader_document') { $result = FileSystem::recuperer_upload( CHEMIN_DOSSIER_IMPORT /*fichier_chemin*/ , NULL /*fichier_nom*/ , NULL /*tab_extensions_autorisees*/ , array('bat','com','exe','php','zip') /*tab_extensions_interdites*/ , 500 /*taille_maxi*/ , NULL /*filename_in_zip*/ ); if($result!==TRUE) { exit($result); } $fichier_nom = Clean::fichier(FileSystem::$file_upload_name); $reponse = ServeurCommunautaire::uploader_ressource( $_SESSION['SESAMATH_ID'] , $_SESSION['SESAMATH_KEY'] , $_SESSION['tmp']['matiere_ref'] , $fichier_nom , file_get_contents(CHEMIN_DOSSIER_IMPORT.FileSystem::$file_saved_name) ); FileSystem::supprimer_fichier(CHEMIN_DOSSIER_IMPORT.FileSystem::$file_saved_name); exit($reponse); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Il se peut que rien n'ait été récupéré à cause de l'upload d'un fichier trop lourd // //////////////////////////////////////////////////////////////////////////////////////////////////// if(empty($_POST)) { exit('Erreur : aucune donnée reçue ! Fichier trop lourd ? '.InfoServeur::minimum_limitations_upload()); } // ////////////////////////////////////////////////////////////////////////////////////////////////////
.'<td>'.html($DB_ROW['user_id_gepi']).'</td>' .'<td>'.$DB_ROW['user_sconet_id'].'</td>' .'<td>'.$DB_ROW['user_sconet_elenoet'].'</td>' .'<td>'.html($DB_ROW['user_reference']).'</td>' .'<td>'.html($DB_ROW['user_login']).'</td>' .'<td>'.Html::$tab_genre['adulte'][$DB_ROW['user_genre']].'</td>' .'<td>'.html($DB_ROW['user_nom']).'</td>' .'<td>'.html($DB_ROW['user_prenom']).'</td>' .'<td>'.$DB_ROW['user_profil_sigle'].'</td>' .'</tr>'.NL; } } } // Finalisation de l'export CSV (archivage dans un fichier) $fnom = 'export_infos-professeurs_'.Clean::fichier($groupe_nom).'_'.fabriquer_fin_nom_fichier__date_et_alea(); FileSystem::ecrire_fichier( CHEMIN_DOSSIER_EXPORT.$fnom.'.csv' , To::csv($export_csv) ); // Finalisation de l'export HTML $export_html .= '</tbody></table>'.NL; // Affichage echo'<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 (fichier <em>csv</em></span>).</a></li></ul>'.NL; echo $export_html; exit(); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas arriver jusque là. // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !');
} exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // IMPRIMER ETAPE 3/4 - Le PDF complet est généré ; on découpe individuellement les fiches brevet par élève puis on zippe l'ensemble // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($ACTION == 'imprimer' && $etape == 3) { Erreur500::prevention_et_gestion_erreurs_fatales(FALSE, TRUE); $date = date('Y-m-d'); $tab_pages_non_anonymes = array(); $chemin_temp_pdf = CHEMIN_DOSSIER_EXPORT . 'pdf_' . mt_rand() . DS; FileSystem::creer_ou_vider_dossier($chemin_temp_pdf); foreach ($_SESSION['tmp']['tab_pages_decoupe_pdf'] as $eleve_id => $tab_tirages) { list($eleve_identite, $page_numero) = $tab_tirages[0]; $tab_pages_non_anonymes[] = $page_numero; $fichier_extraction_chemin = $chemin_temp_pdf . 'officiel_' . $bilan_type . '_' . Clean::fichier($eleve_identite) . '_' . $date . '.pdf'; $releve_pdf = new PDFMerger(); $pdf_string = $releve_pdf->addPDF(CHEMIN_DOSSIER_EXPORT . $_SESSION['tmp']['fichier_nom'] . '.pdf', $page_numero)->merge('file', $fichier_extraction_chemin); } FileSystem::zipper_fichiers($chemin_temp_pdf, CHEMIN_DOSSIER_EXPORT, $_SESSION['tmp']['fichier_nom'] . '.zip'); FileSystem::supprimer_dossier($chemin_temp_pdf); $_SESSION['tmp']['pages_non_anonymes'] = implode(',', $tab_pages_non_anonymes); unset($_SESSION['tmp']['tab_pages_decoupe_pdf']); exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // IMPRIMER ETAPE 4/4 - Le PDF complet est généré ; on n'en garde que les fiches brevet officielles // //////////////////////////////////////////////////////////////////////////////////////////////////// if ($ACTION == 'imprimer' && $etape == 4) { $releve_pdf = new PDFMerger(); if ($_SESSION['tmp']['pages_non_anonymes'] != '') {
if( ($ACTION=='imprimer') && ($etape==3) ) { Erreur500::prevention_et_gestion_erreurs_fatales( FALSE /*memory*/ , TRUE /*time*/ ); $date = date('Y-m-d'); $tab_pages_non_anonymes = array(); $tab_pages_nombre_par_bilan = array(); $chemin_temp_pdf = CHEMIN_DOSSIER_EXPORT.'pdf_'.mt_rand().DS; FileSystem::creer_ou_vider_dossier($chemin_temp_pdf); foreach($_SESSION['tmp']['tab_pages_decoupe_pdf'] as $eleve_id => $tab_tirages) { foreach($tab_tirages as $numero_tirage => $tab) { list( $eleve_identite , $page_plage , $page_nombre ) = $tab; $tab_pages_non_anonymes[] = $page_plage; $tab_pages_nombre_par_bilan[] = $page_nombre; $fichier_extraction_chemin = $chemin_temp_pdf.'officiel_'.$BILAN_TYPE.'_'.Clean::fichier($eleve_identite).'_'.$date.'_resp'.$numero_tirage.'.pdf'; $releve_pdf = new PDFMerger; $pdf_string = $releve_pdf -> addPDF( CHEMIN_DOSSIER_EXPORT.$_SESSION['tmp']['fichier_nom'].'.pdf' , $page_plage ) -> merge( 'file' , $fichier_extraction_chemin ); } } FileSystem::zipper_fichiers( $chemin_temp_pdf , CHEMIN_DOSSIER_EXPORT , $_SESSION['tmp']['fichier_nom'].'.zip' ); FileSystem::supprimer_dossier($chemin_temp_pdf); $_SESSION['tmp']['pages_non_anonymes'] = implode(',',$tab_pages_non_anonymes); $_SESSION['tmp']['pages_nombre_par_bilan'] = implode(' ; ',$tab_pages_nombre_par_bilan); unset($_SESSION['tmp']['tab_pages_decoupe_pdf']); exit('ok'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // IMPRIMER ETAPE 4/4 - Le PDF complet est généré ; on n'en garde que les bilans non anonymes // ////////////////////////////////////////////////////////////////////////////////////////////////////
} $tab_eleves = array(); $tab_autres = array(); $tab_groupes = array(); foreach($DB_TAB as $DB_ROW) { if( ($selection_groupe) || !isset($tab_eleves[ $DB_ROW['valeur']]) ) // Un élève peut être une classe + un groupe associé au prof ; dans ce cas on ne garde que la 1e entrée (la classe) { $tab_eleves[ $DB_ROW['valeur']] = $DB_ROW['texte']; $tab_autres[ $DB_ROW['valeur']] = $DB_ROW['texte']; $tab_groupes[$DB_ROW['valeur']] = ($selection_groupe) ? $groupe_nom : $DB_ROW['optgroup'] ; } } $listing_user_id = implode(',', array_keys($tab_eleves) ); // Lister les demandes (et les messages associés) $fnom_export = 'messages_'.$_SESSION['BASE'].'_'.Clean::fichier($matiere_nom).'_'.Clean::fichier($groupe_nom).'_'.fabriquer_fin_nom_fichier__date_et_alea(); $separateur = ';'; $messages_html = '<table><thead><tr><th>Matière - Item</th><th>Groupe - Élève</th><th>Message(s)</th></tr></thead><tbody>'; $fichier_csv = 'Matière'.$separateur.'Item Ref'.$separateur.'Item Nom'.$separateur.'Groupe'.$separateur.'Élève'.$separateur.'Score'.$separateur.'Date'.$separateur.'Message'."\r\n"; $tab_demandes = array(); $DB_TAB = DB_STRUCTURE_DEMANDE::DB_lister_demandes_prof( $_SESSION['USER_ID'] , $matiere_id , $listing_user_id ); if(empty($DB_TAB)) { exit('Aucune demande n\'a été formulée selon les critères indiqués !'); } foreach($DB_TAB as $DB_ROW) { unset($tab_autres[$DB_ROW['eleve_id']]); $tab_demandes[] = $DB_ROW['demande_id']; $score = ($DB_ROW['demande_score']!==NULL) ? $DB_ROW['demande_score'] : FALSE ; $date = convert_date_mysql_to_french($DB_ROW['demande_date']);
* Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ; * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>. * */ if (!defined('SACoche')) { exit('Ce fichier ne peut être appelé directement !'); } /** * Code inclus commun aux pages * [./pages/releve_synthese_matiere.ajax.php] * [./pages/releve_synthese_multimatiere.ajax.php] * [./_inc/code_officiel_***.php] */ Erreur500::prevention_et_gestion_erreurs_fatales(TRUE, FALSE); // Chemins d'enregistrement $fichier_nom = $make_action != 'imprimer' ? 'releve_synthese_' . $synthese_modele . '_' . Clean::fichier($groupe_nom) . '_' . fabriquer_fin_nom_fichier__date_et_alea() : 'officiel_' . $BILAN_TYPE . '_' . Clean::fichier($groupe_nom) . '_' . fabriquer_fin_nom_fichier__date_et_alea(); // Initialisation de tableaux $tab_item = array(); // [item_id] => array(item_ref,item_nom,item_coef,item_cart,item_socle,item_lien,matiere_id,calcul_methode,calcul_limite,calcul_retroactif,synthese_ref); $tab_liste_item = array(); // [i] => item_id $tab_eleve_infos = array(); // [eleve_id] => array(eleve_INE,eleve_nom,eleve_prenom,date_naissance) $tab_matiere = array(); // [matiere_id] => array(matiere_nom,matiere_nb_demandes) $tab_synthese = array(); // [synthese_ref] => synthese_nom $tab_eval = array(); // [eleve_id][item_id][devoir] => array(note,date,info) On utilise un tableau multidimensionnel vu qu'on ne sait pas à l'avance combien il y a d'évaluations pour un élève et un item donnés. // Initialisation de variables if ($make_html || $make_pdf || $make_graph) {
$xml .= ' <etat>' . $tab_item_infos['etat'] . '</etat>' . "\r\n"; $xml .= ' <info>' . html($tab_item_infos['info']) . '</info>' . "\r\n"; } $xml .= ' </renseignement>' . "\r\n"; $xml .= ' </item>' . "\r\n"; } } $xml .= ' </competence>' . "\r\n"; } $xml .= ' </palier>' . "\r\n"; } $xml .= ' </eleve>' . "\r\n"; } } $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";