/** * Supprimer une structure (mode multi-structures) * * @param int $BASE * @return void */ public static function supprimer_multi_structure($BASE) { // Paramètres de connexion à la base de données $BD_name = 'sac_base_' . $BASE; $BD_user = '******' . $BASE; // Limité à 16 caractères // Supprimer la base de données d'une structure, et son utilisateur MySQL une fois défait de ses droits. DB_WEBMESTRE_WEBMESTRE::DB_supprimer_base_structure_et_user_mysql($BD_name, $BD_user); // Supprimer le fichier de connexion FileSystem::supprimer_fichier(CHEMIN_DOSSIER_MYSQL . 'serveur_sacoche_structure_' . $BASE . '.php'); // Retirer l'enregistrement d'une structure dans la base du webmestre DB_WEBMESTRE_WEBMESTRE::DB_supprimer_structure($BASE); // Supprimer les dossiers de fichiers temporaires par établissement foreach (FileSystem::$tab_dossier_tmp_structure as $dossier) { FileSystem::supprimer_dossier($dossier . $BASE); } // Supprimer les éventuels fichiers de blocage LockAcces::supprimer_fichiers_blocage($BASE); // Log de l'action SACocheLog::ajouter('Suppression de la structure n°' . $BASE . '.'); }
if($action=='bloquer') { ajouter_log_PHP( 'Maintenance' /*log_objet*/ , 'Application fermée.' /*log_contenu*/ , __FILE__ /*log_fichier*/ , __LINE__ /*log_ligne*/ , FALSE /*only_sesamath*/ ); LockAcces::bloquer_application($_SESSION['USER_PROFIL_TYPE'],'0',$motif); exit('<label class="erreur">Application fermée : '.html($motif).'</label>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Vérification des dossiers additionnels par établissement // //////////////////////////////////////////////////////////////////////////////////////////////////// if($action=='verif_dir_etabl') { // Récupérer les ids des structures $tab_bases = array_keys( DB_WEBMESTRE_WEBMESTRE::DB_lister_structures_id() ); // Récupérer les dossiers additionnels par établissement $tab_dossiers = array(); foreach(FileSystem::$tab_dossier_tmp_structure as $dossier_key => $dossier_dir) { $tab_dossiers[$dossier_dir] = array_fill_keys ( FileSystem::lister_contenu_dossier($dossier_dir) , TRUE ); unset($tab_dossiers[$dossier_dir]['index.htm']); ksort($tab_dossiers[$dossier_dir],SORT_NATURAL); } // Pour l'affichage du retour $thead = '<tr><td colspan="2">Vérification des dossiers additionnels par établissement - '.date('d/m/Y H:i:s').'</td></tr>'; $tbody_ok = ''; $tbody_pb = ''; // On parcourt les dossiers devant exister : ok ou création. foreach($tab_bases as $base_id) {
<hr /> <table id="table_action" class="form hsort"> <thead> <tr> <th>Identifiant</th> <th>Ordre</th> <th>Nom</th> <th class="nu"><q class="ajouter" title="Ajouter une zone."></q></th> </tr> </thead> <tbody> <?php // Lister les zones $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_zones(); if (!empty($DB_TAB)) { foreach ($DB_TAB as $DB_ROW) { // Afficher une ligne du tableau echo '<tr id="id_' . $DB_ROW['geo_id'] . '">'; echo '<td>' . $DB_ROW['geo_id'] . '</td>'; echo '<td>' . $DB_ROW['geo_ordre'] . '</td>'; echo '<td>' . html($DB_ROW['geo_nom']) . '</td>'; echo '<td class="nu">'; echo '<q class="modifier" title="Modifier cette zone."></q>'; echo '<q class="dupliquer" title="Dupliquer cette zone."></q>'; // La zone d'id 1 ne peut être supprimée, c'est la zone par défaut. echo $DB_ROW['geo_id'] != 1 ? '<q class="supprimer" title="Supprimer cette zone."></q>' : '<q class="supprimer_non" title="La zone par défaut ne peut pas être supprimée."></q>'; echo '</td>'; echo '</tr>' . NL; }
if( ($action=='lister_admin') && $base_id ) { charger_parametres_mysql_supplementaires($base_id); exit( HtmlForm::afficher_select(DB_STRUCTURE_WEBMESTRE::DB_OPT_administrateurs_etabl() , FALSE /*select_nom*/ , FALSE /*option_first*/ , FALSE /*selection*/ , '' /*optgroup*/) ); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Modifier le mdp d'un administrateur et envoyer les identifiants par courriel au contact // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='initialiser_mdp') && $base_id && $admin_id ) { charger_parametres_mysql_supplementaires($base_id); // Informations sur la structure, notamment coordonnées du contact. $DB_ROW = DB_WEBMESTRE_WEBMESTRE::DB_recuperer_structure_by_Id($base_id); if(empty($DB_ROW)) { exit('Erreur : structure introuvable !'); } $denomination = $DB_ROW['structure_denomination']; $contact_nom = $DB_ROW['structure_contact_nom']; $contact_prenom = $DB_ROW['structure_contact_prenom']; $contact_courriel = $DB_ROW['structure_contact_courriel']; // Informations sur l'admin : nom / prénom / login. $DB_ROW = DB_STRUCTURE_WEBMESTRE::DB_recuperer_admin_identite($admin_id); if(empty($DB_ROW)) { exit('Erreur : administrateur introuvable !'); } $admin_nom = $DB_ROW['user_nom'];
// Vérifier le domaine du serveur mail (multi-structures donc serveur ouvert sur l'extérieur). list($mail_domaine, $is_domaine_valide) = tester_domaine_courriel_valide($contact_courriel); if (!$is_domaine_valide) { $tab_erreur['mail']['nb']++; } // Vérifier que la date est correcte if (!tester_date($date)) { $tab_erreur['date']['nb']++; } // Vérifier que le nom de fichier est cohérent if (substr($fichier_nom, 0, 13) != 'dump_SACoche_' || substr($fichier_nom, -4) != '.zip') { $tab_erreur['fichier']['nb']++; } // Vérifier que l'identifiant est disponible if ($import_id) { if (isset($tab_nouvel_id[$import_id]) || DB_WEBMESTRE_WEBMESTRE::DB_tester_structure_Id($import_id) !== NULL) { $tab_erreur['id']['nb']++; } $tab_nouvel_id[$import_id] = TRUE; } } } FileSystem::supprimer_fichier(CHEMIN_DOSSIER_IMPORT . $fichier_csv_nom); if (!$nb_lignes_trouvees) { exit('Erreur : aucune ligne du fichier ne semble correcte !'); } $info_lignes_trouvees = $nb_lignes_trouvees > 1 ? $nb_lignes_trouvees . ' lignes trouvées' : '1 ligne trouvée'; foreach ($tab_erreur as $key => $tab) { if ($tab['nb']) { $s = $tab['nb'] > 1 ? 's' : ''; exit('Erreur : ' . $info_lignes_trouvees . ' mais ' . $tab['nb'] . ' ligne' . $s . $tab['txt']);
require(CHEMIN_DOSSIER_INCLUDE.'fonction_dump.php'); // //////////////////////////////////////////////////////////////////////////////////////////////////// // Récupération de la liste des structures avant recherche des anomalies éventuelles // //////////////////////////////////////////////////////////////////////////////////////////////////// if( $nb_bases ) { // Mémoriser les données des structures $_SESSION['tmp'] = array(); $_SESSION['tmp']['base_id'] = array(); $_SESSION['tmp']['structure_denomination'] = array(); $_SESSION['tmp']['niveau_alerte'] = array(); $_SESSION['tmp']['messages'] = array(); $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_structures( implode(',',$tab_base_id) ); foreach($DB_TAB as $DB_ROW) { $_SESSION['tmp']['infos']['base_id'][] = $DB_ROW['sacoche_base']; $_SESSION['tmp']['infos']['structure_denomination'][] = $DB_ROW['structure_denomination']; } // Retour $max = $nb_bases + 1 ; // La dernière étape consistera à vider la session temporaire et à renvoyer les totaux exit('ok-'.$max); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Etape de récupération des recherches des anomalies éventuelles // //////////////////////////////////////////////////////////////////////////////////////////////////// if( $num && $max && ($num<$max) )
$max = (isset($_POST['max'])) ? Clean::entier($_POST['max']) : 0 ; // Nombre d'étapes à effectuer $pack = 10 ; // Nombre de mails envoyés à chaque étape // //////////////////////////////////////////////////////////////////////////////////////////////////// // Préparation d'une lettre d'informations avant envoi // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='envoyer') && $titre && $contenu && $nb_bases ) { // Mémoriser en session le nb d'envoi / le titre / le contenu de la lettre d'informations $_SESSION['tmp']['nombre'] = $nb_bases ; $_SESSION['tmp']['titre'] = $titre ; $_SESSION['tmp']['contenu'] = $contenu ; // Mémoriser en session les données des contacts concernés par la lettre $_SESSION['tmp']['infos'] = array(); $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_contacts_cibles( implode(',',$tab_base_id) ); foreach($DB_TAB as $DB_ROW) { $_SESSION['tmp']['infos'][] = array( 'base_id' => $DB_ROW['contact_id'] , 'contact_nom' => $DB_ROW['contact_nom'] , 'contact_prenom' => $DB_ROW['contact_prenom'] , 'contact_courriel' => $DB_ROW['contact_courriel'] , ); } // Retour $max = 1 + floor($nb_bases/$pack) + 1 ; // La dernière étape consistera uniquement à vider la session temporaire exit('ok-'.$max); } // ////////////////////////////////////////////////////////////////////////////////////////////////////
<table id="table_action" class="form hsort"> <thead> <tr> <th>Id</th> <th>Dénomination</th> <th>Nom</th> <th>Prénom</th> <th>Courriel</th> <th>Connecteurs</th> <th class="nu"><q class="ajouter" title="Ajouter un partenaire conventionné."></q></th> </tr> </thead> <tbody> <?php // Lister les partenaires ENT conventionnés $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_partenaires_conventionnes(); if(!empty($DB_TAB)) { foreach($DB_TAB as $DB_ROW) { // Afficher une ligne du tableau echo'<tr id="id_'.$DB_ROW['partenaire_id'].'">'; echo '<td>'.$DB_ROW['partenaire_id'].'</td>'; echo '<td>'.html($DB_ROW['partenaire_denomination']).'</td>'; echo '<td>'.html($DB_ROW['partenaire_nom']).'</td>'; echo '<td>'.html($DB_ROW['partenaire_prenom']).'</td>'; echo '<td>'.html($DB_ROW['partenaire_courriel']).'</td>'; echo '<td>'.html($DB_ROW['partenaire_connecteurs']).'</td>'; echo '<td class="nu">'; echo '<q class="modifier" title="Modifier ce partenaire."></q>'; echo '<q class="initialiser_mdp" title="Générer un nouveau mdp pour ce partenaire."></q>';
// //////////////////////////////////////////////////////////////////////////////////////////////////// $num = (isset($_POST['num'])) ? (int)$_POST['num'] : 0 ; // Numéro de l'étape en cours $max = (isset($_POST['max'])) ? (int)$_POST['max'] : 0 ; // Nombre d'étapes à effectuer // //////////////////////////////////////////////////////////////////////////////////////////////////// // 1/3 : Récupération de la liste des structures avant collecte des stats // //////////////////////////////////////////////////////////////////////////////////////////////////// if((!$num)||(!$max)) { // Pour mémoriser les totaux $_SESSION['tmp']['totaux'] = array( 'personnel_use'=>0 , 'eleve_use'=>0 , 'evaluation_use'=>0 , 'validation_use'=>0 ); // Mémoriser les données des structures concernées par les stats $_SESSION['tmp']['infos'] = array(); $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_structures(); foreach($DB_TAB as $DB_ROW) { $_SESSION['tmp']['infos'][] = array( 'base_id' => $DB_ROW['sacoche_base'], 'structure' => $DB_ROW['structure_uai'].' '.$DB_ROW['structure_denomination'], 'geo' => $DB_ROW['geo_nom'], ); } // Retour $max = count($DB_TAB) + 1 ; // La dernière étape consistera à vider la session temporaire et à renvoyer les totaux exit('ok-'.$max); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // 2/3 : Etape de récupération des stats
<thead> <tr> <th class="nu"></th> <th class="nu"><q class="cocher_tout" title="Tout cocher."></q><br /><q class="cocher_rien" title="Tout décocher."></q></th> <th>Id</th> <th>Localisation</th> <th>Établissement</th> <th>Contact</th> <th>Date</th> <th class="nu"><q class="ajouter" title="Ajouter un établissement."></q></th> </tr> </thead> <tbody> <?php // Lister les structures $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_structures( FALSE /*listing_base_id*/ , $geo_id ); foreach($DB_TAB as $DB_ROW) { // Formater la date $date_mysql = $DB_ROW['structure_inscription_date']; $date_affich = ($date_mysql!=SORTIE_DEFAUT_MYSQL) ? convert_date_mysql_to_french($date_mysql) : '-' ; // Afficher une ligne du tableau $img = (LockAcces::tester_blocage('webmestre',$DB_ROW['sacoche_base'])===NULL) ? '<img class="bloquer" src="./_img/etat/acces_oui.png" title="Bloquer cet établissement." />' : '<img class="debloquer" src="./_img/etat/acces_non.png" title="Débloquer cet établissement." />' ; echo'<tr id="id_'.$DB_ROW['sacoche_base'].'">'; echo '<td class="nu"><a href="#id_0">'.$img.'</a></td>'; echo '<td class="nu"><input type="checkbox" name="f_ids" value="'.$DB_ROW['sacoche_base'].'" /></td>'; echo '<td class="label">'.$DB_ROW['sacoche_base'].'</td>'; echo '<td class="label"><i>'.sprintf($geo_ordre_format,$DB_ROW['geo_ordre']).'</i>'.html($DB_ROW['geo_nom']).'<br />'.html($DB_ROW['structure_localisation']).'</td>'; echo '<td class="label">'.html($DB_ROW['structure_denomination']).'<br />'.html($DB_ROW['structure_uai']).'</td>'; echo '<td class="label"><span>'.html($DB_ROW['structure_contact_nom']).'</span> <span>'.html($DB_ROW['structure_contact_prenom']).'</span><div>'.html($DB_ROW['structure_contact_courriel']).'</div></td>'; echo '<td class="label">'.$date_affich.'</td>';
if(!$courriel_bilan) { exit('Erreur lors de l\'envoi du courriel !'); } // On affiche le retour echo'<ok>'; echo'Le mot de passe de<BR />'.html($prenom.' '.$nom).',<BR />partenaire conventionné<BR />"'.html($denomination).'",<BR />vient d\'être réinitialisé.<BR /><BR />'; echo'Les nouveaux identifiants<BR />ont été envoyés<BR />à son adresse de courriel<BR />'.html($courriel).'.'; exit(); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Retirer un partenaire conventionné existant // //////////////////////////////////////////////////////////////////////////////////////////////////// if( ($action=='supprimer') && $partenaire_id ) { // Supprimer l'enregistrement DB_WEBMESTRE_WEBMESTRE::DB_supprimer_partenaire_conventionne($partenaire_id); // Afficher le retour exit('<td>ok</td>'); } // //////////////////////////////////////////////////////////////////////////////////////////////////// // On ne devrait pas en arriver là ! // //////////////////////////////////////////////////////////////////////////////////////////////////// exit('Erreur avec les données transmises !'); ?>
/** * Créer les tables de la base du webmestre et les remplir (mode multi-structures) * * @param void * @return void */ public static function DB_creer_remplir_tables_webmestre() { $tab_files = FileSystem::lister_contenu_dossier(CHEMIN_DOSSIER_SQL_WEBMESTRE); foreach($tab_files as $file) { $extension = pathinfo($file,PATHINFO_EXTENSION); if($extension=='sql') { $requetes = file_get_contents(CHEMIN_DOSSIER_SQL_WEBMESTRE.$file); DB::query(SACOCHE_WEBMESTRE_BD_NAME , $requetes ); // Attention, sur certains LCS ça bloque au dela de 40 instructions MySQL (mais un INSERT multiple avec des milliers de lignes ne pose pas de pb). /* La classe PDO a un bug. Si on envoie plusieurs requêtes d'un coup ça passe, mais si on recommence juste après alors on récolte : "Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute." La seule issue est de fermer la connexion après chaque requête multiple en utilisant exceptionnellement la méthode ajouté par SebR suite à mon signalement : DB::close(nom_de_la_connexion); */ DB::close(SACOCHE_WEBMESTRE_BD_NAME); } } // Il est arrivé que la fonction DB_modifier_parametres() retourne une erreur disant que la table n'existe pas. // Comme si les requêtes précédentes étaient en cache, et pas encore toutes passées (parcequ'au final, quand on va voir la base, toutes les tables sont bien là). // Est-ce que c'est possible au vu du fonctionnement de la classe de connexion ? Et, bien sûr, y a-t-il quelque chose à faire pour éviter ce problème ? // En attendant une réponse de SebR, j'ai mis ce sleep(1)... sans trop savoir si cela pouvait aider... @sleep(1); // Renseigner la version de la base du webmestre DB_WEBMESTRE_WEBMESTRE::DB_modifier_parametre('version_base',VERSION_BASE_WEBMESTRE); }
// Afficher le retour echo'<td>'.$id.'</td>'; echo'<td>'.$ordre.'</td>'; echo'<td>'.html($nom).'</td>'; echo'<td class="nu">'; echo '<q class="modifier" title="Modifier cette zone."></q>'; echo '<q class="dupliquer" title="Dupliquer cette zone."></q>'; // La zone d'id 1 ne peut être supprimée, c'est la zone par défaut. echo ($id!=1) ? '<q class="supprimer" title="Supprimer cette zone."></q>' : '<q class="supprimer_non" title="La zone par défaut ne peut pas être supprimée."></q>' ; echo'</td>'; } // //////////////////////////////////////////////////////////////////////////////////////////////////// // Supprimer une zone existante // //////////////////////////////////////////////////////////////////////////////////////////////////// else if( ($action=='supprimer') && ($id>1) && $nom ) { // Effacer l'enregistrement DB_WEBMESTRE_WEBMESTRE::DB_supprimer_zone($id); // Log de l'action SACocheLog::ajouter('Suppression de la zone géographique "'.$nom.'" (n°'.$id.').'); // Afficher le retour echo'<td>ok</td>'; } else { echo'Erreur avec les données transmises !'; } ?>
<thead> <tr> <th class="nu"></th> <th class="nu"><q class="cocher_tout" title="Tout cocher."></q><br /><q class="cocher_rien" title="Tout décocher."></q></th> <th>Id</th> <th>Localisation</th> <th>Établissement</th> <th>Contact</th> <th>Date</th> <th class="nu"><q class="ajouter" title="Ajouter un établissement."></q></th> </tr> </thead> <tbody> <?php // Lister les structures $DB_TAB = DB_WEBMESTRE_WEBMESTRE::DB_lister_structures(FALSE, $geo_id); foreach ($DB_TAB as $DB_ROW) { // Formater la date $date_mysql = $DB_ROW['structure_inscription_date']; $date_affich = $date_mysql != SORTIE_DEFAUT_MYSQL ? convert_date_mysql_to_french($date_mysql) : '-'; // Afficher une ligne du tableau $img = LockAcces::tester_blocage('webmestre', $DB_ROW['sacoche_base']) === NULL ? '<img class="bloquer" src="./_img/etat/acces_oui.png" title="Bloquer cet établissement." />' : '<img class="debloquer" src="./_img/etat/acces_non.png" title="Débloquer cet établissement." />'; echo '<tr id="id_' . $DB_ROW['sacoche_base'] . '">'; echo '<td class="nu"><a href="#id_0">' . $img . '</a></td>'; echo '<td class="nu"><input type="checkbox" name="f_ids" value="' . $DB_ROW['sacoche_base'] . '" /></td>'; echo '<td class="label">' . $DB_ROW['sacoche_base'] . '</td>'; echo '<td class="label"><i>' . sprintf("%06u", $DB_ROW['geo_ordre']) . '</i>' . html($DB_ROW['geo_nom']) . '<br />' . html($DB_ROW['structure_localisation']) . '</td>'; echo '<td class="label">' . html($DB_ROW['structure_denomination']) . '<br />' . html($DB_ROW['structure_uai']) . '</td>'; echo '<td class="label"><span>' . html($DB_ROW['structure_contact_nom']) . '</span> <span>' . html($DB_ROW['structure_contact_prenom']) . '</span><div>' . html($DB_ROW['structure_contact_courriel']) . '</div></td>'; echo '<td class="label">' . $date_affich . '</td>'; echo '<td class="nu">';