Exemple #1
0
 /**
  * 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">';