Subversion Repositories Applications.papyrus

Rev

Rev 386 | Rev 460 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/*vim: set expandtab tabstop=4 shiftwidth=4: */ 
// +------------------------------------------------------------------------------------------------------+
// | PHP version 4.1                                                                                      |
// +------------------------------------------------------------------------------------------------------+
// | Copyright (C) 2004 Tela Botanica (accueil@tela-botanica.org)                                         |
// +------------------------------------------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or                                        |
// | modify it under the terms of the GNU Lesser General Public                                           |
// | License as published by the Free Software Foundation; either                                         |
// | version 2.1 of the License, or (at your option) any later version.                                   |
// |                                                                                                      |
// | This library is distributed in the hope that it will be useful,                                      |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of                                       |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                                    |
// | Lesser General Public License for more details.                                                      |
// |                                                                                                      |
// | You should have received a copy of the GNU Lesser General Public                                     |
// | License along with this library; if not, write to the Free Software                                  |
// | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                            |
// +------------------------------------------------------------------------------------------------------+
// CVS : $Id: adsi_site.fonct.php,v 1.23 2005-09-20 17:01:22 ddelon Exp $
/**
* Bibliothèque de fonctions d'admininistration des projets
*
* Contient un ensemble de fonctions permettant à l'application Administrateur de Papyrus, de modifier des informations
* sur les projets (=sites gérés par Papyrus).
*
*@package Admin_site
*@subpackage Fonctions
//Auteur original :
*@author        Jean-Pascal MILCENT <jpm@tela-botanica.org>
//Autres auteurs :
*@author        Alexandre GRANIER <alexandre@tela-botanica.org>
*@author        Laurent COUDOUNEAU <lc@gsite.org>
*@copyright     Tela-Botanica 2000-2004
*@version       $Revision: 1.23 $ $Date: 2005-09-20 17:01:22 $
// +------------------------------------------------------------------------------------------------------+
*/

// +------------------------------------------------------------------------------------------------------+
// |                                            ENTÊTE du PROGRAMME                                       |
// +------------------------------------------------------------------------------------------------------+
if (GEN_FTP_UTILISE) {
    /** Inclusion bibliothèque de PEAR gérant le FTP.*/
    require_once ADSI_CHEMIN_BIBLIOTHEQUE_PEAR.'Net/FTP.php';
}

// +------------------------------------------------------------------------------------------------------+
// |                                            CORPS du PROGRAMME                                        |
// +------------------------------------------------------------------------------------------------------+
/** Fonction ADMIN_afficherListeSites()- Génére le xhtml permettant de choisir un site parmis une liste.
*
* Cette fonction fournie une liste des sites principaux gérés par Génésia.
*
* @param  string   l'objet Pear DB.
* @param  string   l'url de la page à laquelle renvoyer le formulaire.
* @param  string   un message important à destination de l'utilisateur.
* return  string   le code XHTML à retourner.
*/
function ADMIN_afficherFormListeSites(&$db, $url, $message = '')
{
    // Liste des sites principaux
    $requete =  'SELECT * '.
                'FROM gen_site, gen_site_relation '.
                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                'AND gsr_id_site_01 = gs_id_site '.
                'AND gsr_id_valeur IN (102, 103) '.
                'ORDER BY gsr_ordre';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '' ;
    
    //----------------------------------------------------------------------------
    // Création du formulaire
    $form =& new HTML_QuickForm('form_sites', 'post', str_replace('&amp;', '&', $url));
    $tab_index = 1000;
    $squelette =& $form->defaultRenderer();
    $squelette->setFormTemplate("\n".'<form{attributes}>'."\n".'{content}'."\n".'</form>'."\n");
    $squelette->setElementTemplate( '<li>'."\n".'{label}'."\n".'{element}'."\n".
                                    '<!-- BEGIN required --><span class="symbole_obligatoire">*</span><!-- END required -->'."\n".
                                    '<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n".
                                    '</li>'."\n");
    $squelette->setRequiredNoteTemplate("\n".'<p>'."\n".'<span class="symbole_obligatoire">*</span> {requiredNote}'."\n".'</p>'."\n");
    
    $partie_site_debut =    '<fieldset>'."\n".
                            '<legend>Listes des sites</legend>'."\n".
                            '<ul>'."\n";
    $form->addElement('html', $partie_site_debut);
    
    $aso_options = array();
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
        $aso_options[$ligne->gs_id_site] = htmlentities($ligne->gs_nom.' ('.$ligne->gs_code_alpha.')');
    }
    $resultat->free();
    
    $id = 'form_sites_id_site';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
    $label = '<label for="'.$id.'">'.'Listes des sites : '.'</label>';
    $form->addElement('select', $id, $label, $aso_options, $aso_attributs);
    
    $partie_site_fin =  '</ul>'."\n".
                        '</fieldset>'."\n";
    $form->addElement('html', $partie_site_fin);
    
    $liste_bouton_debut = '<ul class="liste_bouton">'."\n";
    $form->addElement('html', $liste_bouton_debut);
    
    $id = 'form_sites_ajouter';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
    $label = 'Ajouter';
    $form->addElement('submit', $id, $label, $aso_attributs);
    
    $id = 'form_sites_modifier';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
    $label = 'Modifier';
    $form->addElement('submit', $id, $label, $aso_attributs);
    
    $id = 'form_sites_supprimer';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'onclick' => 'javascript:return confirm(\''.'Êtes vous sûr de vouloir supprimer ce site ?'.'\');');
    $label = 'Supprimer';
    $form->addElement('submit', $id, $label, $aso_attributs);
    
    $liste_bouton_fin = '</ul>'."\n";
    $form->addElement('html', $liste_bouton_fin);
    
    $sortie = $form->toHTML()."\n";
    
    // Titre de la page:
    $titre = 'Configuration des sites';
    
    // Construction de la page.
    return ADMIN_contruirePage($titre, $sortie, $message);
}

/** Fonction ADMIN_validerFormListesSites() - Valide les données issues du formulaire de liste de sites.
*
* Cette fonction valide les données du formulaire de liste de site.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   le tableau contenant les valeurs du formulaire.
* @return string   retourne les messages d'erreurs sinon rien.
*/
function ADMIN_validerFormListesSites(&$db, $aso_valeurs)
{
    $message = '';
    
    // Validation des données du formulaire
    if (empty($aso_valeurs['form_sites_id_site'])) {
        $message .= '<p class="pap_erreur">Vous devez d\'abord sélectionner un site.</p>';
    }
    
    return $message;
}

/** Fonction ADMIN_afficherFormSite()- Génére un formulaire pour gen_site.
*
* Cette fonction retourne un formulaire pour modification ou pour ajout.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   l'url à laquelle renvoyer le formulaire.
* @param  string   le tableau contenant les valeurs du formulaire.
* @param  string   un message à destination de l'utilisateur.
* return  string   le code XHTML à retourner.
*/
function ADMIN_afficherFormSite(&$db, $url, $aso_valeurs = array(), $message = '')
{
    // Initialisation des valeurs
    $sortie = '';
    $aso_valeurs['modification'] = false;
    $aso_valeurs['defaut'] = false;
    $aso_valeurs['type_site_externe'] = 0;
    // Nous cherchons à savoir si nous somme en modification
    if (isset($aso_valeurs['form_sites_modifier'])) {
        $site_id = $aso_valeurs['form_sites_id_site'];
        // Requete pour récupérer les informations sur le site à modifier
        $requete =  'SELECT * '.
                    'FROM gen_site '.
                    'WHERE gs_id_site = '.$site_id;
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
        }
        $aso_valeurs = $resultat->fetchRow(DB_FETCHMODE_ASSOC);
        $resultat->free();
        
        // Requete pour récupérer les informations issues des relations du site à modifier
        $requete =  'SELECT * '.
                    'FROM gen_site_relation '.
                    'WHERE gsr_id_site_01 = '.$site_id.' '.
                    'AND gsr_id_site_01 = gsr_id_site_02';
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
        }
        
        $tab_type = GEN_retournerTableauTypeSiteExterne($db);
        while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
            if ($ligne->gsr_id_valeur == 101) {// 101 = site par défaut
                $aso_valeurs['defaut'] = true;
            }
            foreach ($tab_type as $cle => $val) {
                if ($ligne->gsr_id_valeur == $val['id']) {// 20x = type de site externe à Papyrus
                    $aso_valeurs['type_site_externe'] = $val['id'];
                }
            }
        }
        $resultat->free();
        
        $aso_valeurs['modification'] = true;
    } else if (isset($aso_valeurs['gs_id_site'])) {
        $aso_valeurs['modification'] = true;
    }
    // Débogage :
    //$GLOBALS['_DEBOGAGE_'] .= '<pre>'.print_r($aso_valeurs, true).'</pre>';
    //-------------------------------------------------------------------------------------------------------------------
    // Information précédent le formulaire (en modification)
    if (isset($aso_valeurs['modification'])) {
        $sortie .= '<p>'.'Identifiant de ce site : '.'<span id="adsi_site_id">'.$aso_valeurs['gs_id_site'].'</span></p>'."\n";
    }
    //-------------------------------------------------------------------------------------------------------------------
    // Création du formulaire
    $form =& new HTML_QuickForm('site', 'post', str_replace('&amp;', '&', $url));
    $tab_index = 1000;
    $squelette =& $form->defaultRenderer();
    $squelette->setFormTemplate("\n".'<form{attributes}>'."\n".'{content}'."\n".'</form>'."\n");
    $squelette->setElementTemplate(  '<li>'."\n".
                                    '{label}'."\n".
                                    '{element}'."\n".
                                    '<!-- BEGIN required --><span class="symbole_obligatoire">*</span><!-- END required -->'."\n".
                                    '<!-- BEGIN error --><span class="erreur">{error}</span><!-- END error -->'."\n".
                                    '</li>'."\n");
    $squelette->setGroupElementTemplate('{label}'."\n".
                                        '{element}'."\n".
                                        '<!-- BEGIN required --><span class="symbole_obligatoire">*</span><!-- END required -->'."\n".
                                        '&nbsp;'."\n"
                                        , 'double');
    $squelette->setRequiredNoteTemplate("\n".'<p><span class="symbole_obligatoire">*</span> {requiredNote}</p>'."\n");
    
    $partie_site_debut = '<fieldset>'."\n".'<legend>Configuration du site</legend>'."\n".'<ul>'."\n";
    $form->addElement('html', $partie_site_debut);
    
    if ($aso_valeurs['modification']) {
        $form->addElement('hidden', 'gs_id_site');
    }
    
    $id = 'gs_nom';
    $aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 45, 'maxlength' => 100, 'value' => 'nom du site');
    $label = '<label for="'.$id.'">'.'Nom du site : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    $form->addRule($id, 'Un nom est requis pour le site !', 'required', '', 'client');
    
    $id = 'gs_code_alpha';
    $aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 20, 'maxlength' => 20, 'value' => 'site_01');
    $label = '<label for="'.$id.'">'.'Code alphanumérique : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    $form->addRule('gs_code_alpha', 'Un code alphanumérique est requis pour le site !', 'required', '', 'client');
    
    $id = 'gs_code_num';
    $aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 20, 'maxlength' => 20, 'value' => 1);
    $label = '<label for="'.$id.'">'.'Code numérique : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    $form->addRule('gs_code_num', 'Un code numérique est requis pour le site !', 'required', '', 'client');
    
    $id = 'gs_raccourci_clavier';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'size' => 1, 'maxlength' => 1, 'value' => 'Z');
    $label = '<label for="'.$id.'">'.'Raccourci clavier : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    
    // Requete pour connaitre les identifications dispo
    $requete =  'SELECT * '.
                'FROM gen_site_auth '.
                'WHERE gsa_id_auth != 0';
    $resultat = $db->query($requete) ;
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    $aso_options = array();
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
        // Test pour connaître le type d'authentification.
        $type = '';
        if ($ligne->gsa_ce_type_auth == '1' ) {
            $type = 'Base de données';
        } else if ($ligne->gsa_ce_type_auth == '2' ) {
            $type = 'LDAP';
        }
        $aso_options[$ligne->gsa_id_auth] = $ligne->gsa_nom.' ('.$type.')';
    }
    $resultat->free();
    $id = 'gs_ce_auth';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
    $label = '<label for="'.$id.'">'.'Identification : '.'</label>';
    $form->addElement('select', $id, $label, $aso_options, $aso_attributs);
    
    // En modification nous affichons la liste des squelettes disponiblent dans
    // le dossier du site.
    if ($aso_valeurs['modification']) {
        $aso_options = array();
        if (!GEN_FTP_UTILISE) {
            $chemin_squelettes =    PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                    $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_SQUELETTE.GEN_SEP;
            $dossier = opendir($chemin_squelettes);
            while(($fichier = readdir($dossier)) !== false) {
                if ($fichier != '.' && $fichier != '..') {
                    $chemin_type = $chemin_squelettes.GEN_SEP.$fichier;
                    if (filetype($chemin_type) != 'dir') {
                        $aso_options[$fichier] = $fichier;
                    }
                }
            }
        } else {
            // ouverture des squelettes présent dans le dossier du site 
            // création de l'objet pear ftp
            $objet_pear_ftp = new Net_FTP(PAP_FTP_SERVEUR, PAP_FTP_PORT);
            // création de la connexion
            $ftp_conn = $objet_pear_ftp->connect(PAP_FTP_SERVEUR, PAP_FTP_PORT);
            // identification
            $ftp_login_result = $objet_pear_ftp->login(PAP_FTP_UTILISATEUR, PAP_FTP_MOT_DE_PASSE);
            // Gestion des erreurs ftp
            if ((PEAR::isError($ftp_conn) || PEAR::isError($ftp_login_result))) {
                die('ERREUR Papyrus admin : impossible de se connecter par ftp.<br />'.
                    'Serveur : '. GEN_FTP_SERVEUR .'<br />'.
                    'Utilisateur : '. GEN_FTP_UTILISATEUR .'<br />'.
                    'Ligne n° : '. __LINE__ .'<br />'.
                    'Fichier n° : '. __FILE__ .'<br />');
                    //'Message erreur de connection : '.$ftp_conn->getMessage().'<br />'.
                    //'Message erreur de login : '.$ftp_login_result->getMessage());
            }
            $chemin_squelettes =    PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                    $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_SQUELETTE.GEN_SEP;
            $tab_squelettes = $objet_pear_ftp->ls($chemin_squelettes);
            $aso_options = array();
            for ($i = 0; $i < count($tab_squelettes) ; $i++) {
                if ($tab_squelettes[$i]['is_dir'] == false) {
                    $aso_options[$tab_squelettes[$i]['name']] = $tab_squelettes[$i]['name'];
                }
            }
            $objet_pear_ftp->disconnect();
        }
        
        // Vérification de la présence de squelettes
        if (count($aso_options) == 0) {
            $aso_options['Aucun squelette'] = 'Aucun squelette';
        }
        
        $id = 'gs_fichier_squelette';
        $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
        $label = '<label for="'.$id.'">'.'Squelette : '.'</label>';
        $form->addElement('select', $id, $label, $aso_options, $aso_attributs);
    }
    
    // Requete pour connaitre les internationalisation dispo
    $requete =  'SELECT * '.
                'FROM gen_i18n ';
    $resultat = $db->query($requete) ;
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    $aso_options = array();
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
        $aso_options[$ligne->gi_id_i18n] = $ligne->gi_id_i18n;
    }
    $resultat->free();
    $id = 'gs_ce_i18n';
    $aso_attributs = array('id' => $id, 'tabindex' => $tab_index++);
    $label = '<label for="'.$id.'">'.'Langue : '.'</label>';
    $form->addElement('select', $id, $label, $aso_options, $aso_attributs);
    
    $id = 'defaut';
    $aso_attributs = array('id' => $id, 'tabindex' => $tab_index++);
    if (isset($aso_valeurs[$id]) && $aso_valeurs[$id] === true) {
        $aso_attributs['checked'] = 'checked';
    }
    $label = '<label for="'.$id.'">'.'En faire le site par défaut : '.'</label>';
    $form->addElement('checkbox', $id, $label, null, $aso_attributs);
    
    // Groupe site externe
    $tab_type = GEN_retournerTableauTypeSiteExterne($db);
    $aso_options = array('0' => 'Aucun');
    foreach ($tab_type as $cle => $val) {
        $aso_options[$val['id']] = $val['intitule'];
    }
    $id = 'type_site_externe';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++);
    $label = 'type : ';
    $groupe[] =& HTML_QuickForm::createElement('select', $id, $label, $aso_options, $aso_attributs);
    
    $id = 'gs_url';
    $aso_attributs = array('id' => $id, 'tabindex' => $tab_index++,'size' => 45, 'maxlength' => 255, 'value' => 'http://');
    $label = 'url : ';// Les navigateurs gères mal les labels au sein d'un même <li>
    $groupe[] =& HTML_QuickForm::createElement('text', $id, $label, $aso_attributs);
    
    $label = '<label>'.'Site externe : '.'</label>';
    $form->addGroup($groupe, 'double', $label, '', false);
    
    $partie_site_fin = '</ul>'."\n".'</fieldset>'."\n";
    $form->addElement('html', $partie_site_fin);
    
    $partie_entete_debut = '<fieldset>'."\n".'<legend>Entête par défaut des pages du site</legend>'."\n".'<ul>'."\n";
    $form->addElement('html', $partie_entete_debut);
    
    $id = 'gs_titre';
    $aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 45, 'maxlength' => 255, 'value' => 'titre du site');
    $label = '<label for="'.$id.'">'.'Titre du site : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    $form->addRule('gs_titre', 'Un titre est requis pour le site !', 'required', '', 'client');
    
    $id = 'gs_mots_cles';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
    $label = '<label for="'.$id.'">'.'Mots-clés : '.'</label>';
    $zone_mots_cles = $form->createElement('textarea', $id, $label, $aso_attributs);
    $zone_mots_cles->setValue('mots-clés du site');
    $form->addElement($zone_mots_cles);
    $form->addRule($id, 'Des mots clés sont requis pour le site !', 'required', '', 'client');
    
    $id = 'gs_description';
    $aso_attributs = array('id'=> $id, 'tabindex' => $tab_index++, 'rows' => 3, 'cols' => 45);
    $label = '<label for="'.$id.'">'.'Description du contenu : '.'</label>';
    $zone = $form->createElement('textarea', $id, $label, $aso_attributs);
    $zone->setValue('description du site');
    $form->addElement($zone);
    $form->addRule($id, 'Une description est requise pour le site !', 'required', '', 'client');
    
    $id = 'gs_auteur';
    $aso_attributs = array('id'=>$id, 'tabindex' => $tab_index++, 'size' => 45, 'maxlength' => 255, 'value' => 'auteur du site');
    $label = '<label for="'.$id.'">'.'Auteur du site : '.'</label>';
    $form->addElement('text', $id, $label, $aso_attributs);
    $form->addRule('gs_auteur', 'Un auteur est requis pour le site !', 'required', '', 'client');  
    
    $partie_entete_fin = '</ul>'."\n".'</fieldset>'."\n";
    $form->addElement('html', $partie_entete_fin);
    
    if ($aso_valeurs['modification']) {
        // Requete pour connaitre les informations sur l'administrateur ayant fait la dernière modif
        $requete_admin =    'SELECT * '.
                            'FROM gen_annuaire '.
                            'WHERE ga_id_administrateur = '.$aso_valeurs['gs_ce_admin'];
        $resultat_admin = $db->query($requete_admin);
        if (DB::isError($resultat_admin)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_admin->getMessage(), $requete_admin));
        }
        $ligne_admin = $resultat_admin->fetchRow(DB_FETCHMODE_OBJECT);
        if (isset($ligne_admin)) {
                $info_admin =   '<p class="info">Site créé le '.$aso_valeurs['gs_date_creation'].'. Dernière modification par'.
                        $ligne_admin->ga_prenom.' '.$ligne_admin->ga_nom.'.'.'</p>';
                $form->addElement('html', $info_admin);
                $form->addElement('hidden', 'gs_ce_admin');
                $form->addElement('hidden', 'gs_date_creation');
        }
        
        // Titre de la page:
        $titre = 'Modifier un site';
        // Bouton validant le formulaire
        $bouton_validation = '<input type="submit" id="site_modifier" name="site_modifier" value="Enregistrer" />';
    } else {
        // Titre de la page:
        $titre = 'Ajouter un site';
        // Bouton validant le formulaire
        $bouton_validation = '<input type="submit" id="site_enregistrer" name="site_enregistrer" value="Enregistrer" />';
    }
    $bouton_annuler =   '<input type="submit" id="form_annuler" name="form_annuler" value="Annuler" />';
    $bouton_effacer =   '<input type="reset" id="effacer" name="effacer" value="Effacer" />';
    $boutons =  '<p>'."\n".
                $bouton_validation."\n".
                $bouton_annuler."\n".
                $bouton_effacer."\n".
                '</p>'."\n";
    $form->addElement('html', $boutons);
    
    // Instanciation des valeurs par défaut du formulaire
    $form->setDefaults($aso_valeurs);
    
    // Javascript pour la validation côté client
    $regles_javascript = $form->getValidationScript();
    // Suppression des balises déjà créées par GEN_stockerCodeScript()
    // Le code ci-dessous devrait être utilisé si on arrive à empécher Quickform de l'ajouter lui-même!
    /*
    $regles_javascript = ereg_replace ( '<script type="text\/javascript">', '', $regles_javascript);
    $regles_javascript = ereg_replace ( '<!--', '', $regles_javascript);
    $regles_javascript = ereg_replace ( '\/\/-->', '', $regles_javascript);
    $regles_javascript = ereg_replace ( '<\/script>', '', $regles_javascript);
    GEN_stockerCodeScript($regles_javascript);
    */
    
    // Note de fin de formulaire
    $form->setRequiredNote('Indique les champs obligatoires');
    $sortie .= $form->toHTML()."\n";
    
    // Construction de la page.
    return ADMIN_contruirePage($titre, $sortie, $message);
}

/** Fonction ADMIN_validerFormAjouterSite() - Valide les données issues du formulaire pour gen_site.
*
* Cette fonction valide les données à ajouter dans la table gen_site.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   le tableau contenant les valeurs du formulaire.
* @return string   retourne les messages d'erreurs sinon rien.
*/
function ADMIN_validerFormSite(&$db, $aso_valeurs)
{
    $message = '';
    
    // Validation des données du formulaire
    if (empty($aso_valeurs['gs_nom'])) {
        $message .= '<p class="pap_erreur">Le champ "Nom" ne doit pas être vide.</p>';
    }
    if (empty($aso_valeurs['gs_code_alpha'])) {
        $message .= '<p class="pap_erreur">Le champ "Code alphanumérique" ne doit pas être vide.</p>';
    }
    if ($aso_valeurs['gs_code_num'] == '') {
        // Note: ne pas utilisez empty() car si on veut saisir 0, cela est conscidéré comme vide!
        $message .= '<p class="pap_erreur">Le champ "Code numérique" ne doit pas être vide.</p>';
    }
    if (preg_match('/^[0-9]+$/',$aso_valeurs['gs_code_num']) == 0) {
        $message .= '<p class="pap_erreur">Le champ "Code numérique" doit contenir un nombre.</p>';
    }
    
    // Requete pour vérifier l'abscence du code numérique et alphanumérique de la table gen_site
    $requete =  'SELECT gs_code_alpha, gs_code_num '.
                'FROM gen_site, gen_site_relation '.
                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                'AND gsr_id_site_01 = gs_id_site '.
                'AND gsr_id_valeur IN (102, 103) ';// 102 = site "principal" et 103 = site "externe"
    $requete .= (isset($aso_valeurs['gs_id_site'])) ? 'AND gs_id_site != '.$aso_valeurs['gs_id_site'] : '';
    
    $resultat = $db->query($requete);
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT) ) {
        if ($ligne->gs_code_num == $aso_valeurs['gs_code_num']) {
            $message .= '<p class="pap_erreur">La valeur "'.$aso_valeurs['gs_code_num'].'" pour le champ "Code numérique" existe déjà.</p>';
        }
        if ($ligne->gs_code_alpha == $aso_valeurs['gs_code_alpha']) {
            $message .= '<p class="pap_erreur">La valeur "'.$aso_valeurs['gs_code_alpha'].'" pour le champ "Code alphanumérique" existe déjà.</p>';
        }
    }
    $resultat->free();
    
    if (empty($aso_valeurs['gs_titre'])) {
        $message .= '<p class="pap_erreur">Le champ "Titre" ne doit pas être vide.</p>';
    }
    if (empty($aso_valeurs['gs_mots_cles'])) {
        $message .= '<p class="pap_erreur">Le champ "Mots clés" ne doit pas être vide.</p>';
    }
    if (empty($aso_valeurs['gs_description'])) {
        $message .= '<p class="pap_erreur">Le champ "Description" ne doit pas être vide.</p>';
    }
    if (empty($aso_valeurs['gs_auteur'])) {
        $message .= '<p class="pap_erreur">Le champ "Auteur" ne doit pas être vide.</p>';
    }
    if (isset($aso_valeurs['externe']) && $aso_valeurs['externe'] == 1 && (empty($aso_valeurs['gs_url']) || $aso_valeurs['gs_url'] == 'http://')) {
        $message .= '<p class="pap_erreur">'.'Vous avez désigné ce site comme étant externe. Il est nécessaire de saisir son URL!'.'</p>';
    }
    if (isset($aso_valeurs['externe']) && $aso_valeurs['externe'] == 0 && (!empty($aso_valeurs['gs_url']) && $aso_valeurs['gs_url'] != 'http://')) {
        $message .= '<p class="pap_erreur">'.'Vous avez saisie une l\'url : '.$aso_valeurs['gs_url'].'<br />'.
                    'Vous conscidérez donc ce site comme étant externe. Il est nécessaire de cocher la case "oui"!'.'</p>';
    }
    return $message;
}

/** Fonction ADMIN_enregistrerSite() - Ajoute un site à Papyrus.
*
* Cette fonction ajoute le site à Papyrus, c'est à dire :
* - 1. Création des répertoire du projet en fonction du nom et des sous-répertoires.
* - 2. Insertion d'une ligne dans la table "gen_site".
* - 3. Insertion d'une ligne dans la table "gen_site_auth" et ses tables liées si nécessaire.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   le tableau contenant les valeurs du formulaire.
* @param  int      identifiant de l'administrateur réalisant cette création.
* @return string retourne un message en cas de succès ou d'échec.
*/
function ADMIN_enregistrerSite(&$db, $aso_valeurs, $id_admin)
{
    // Nous vérifions si nous avons à faire à un site externe.
    $id_type_site = '102';// par défaut on conscidére que c'est un site "principal"
    if (isset($aso_valeurs['type_site_externe']) && $aso_valeurs['type_site_externe'] > 0 && !empty($aso_valeurs['gs_url']) && $aso_valeurs['gs_url'] != 'http://') {
        $id_type_site = '103';// c'est un site "externe"
    }
    
    // Ajout des répertoires des sites "principaux" soit par manipulation de fichier soit par FTP en fonction de la constante définie
    // par l'utilisateur dans le fichier de config avancée.
    $tab_rep_langue = array(GEN_DOSSIER_GENERIQUE, $aso_valeurs['gs_ce_i18n']);
    $tab_rep_site = array(  GEN_DOSSIER_IMAGE,
                            GEN_DOSSIER_STYLE,
                            GEN_DOSSIER_SCRIPT,
                            GEN_DOSSIER_SQUELETTE,
                            GEN_DOSSIER_DOC);
    if (!GEN_FTP_UTILISE && $id_type_site != '103') {
        foreach ($tab_rep_langue as $nom_rep_langue) {
            foreach ($tab_rep_site as $nom_rep_site) {
                $chemin_repertoire =    PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                        $nom_rep_langue.GEN_SEP.$nom_rep_site;
                $vieux_umask = umask(0);
                $resultat = creerDossier($chemin_repertoire, 0777, GEN_SEP);
                umask($vieux_umask);
                if ($resultat == false) {
                    $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de créer le répertoire.<br />'.
                                'Répertoire : '. $chemin_repertoire .'<br />'.
                                'Ligne n° : '. __LINE__ .'<br />'.
                                'Fichier n° : '. __FILE__ .'<br /></p>';
                    return $message;
                }
            }
        }
        $chemin_squelette_defaut =  PAP_CHEMIN_RACINE.GEN_CHEMIN_COMMUN.GEN_DOSSIER_GENERIQUE.GEN_SEP.
                                    GEN_DOSSIER_SQUELETTE.GEN_SEP.GEN_FICHIER_SQUELETTE;
        $chemin_squelette_site =    PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                    $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_SQUELETTE.GEN_SEP.GEN_FICHIER_SQUELETTE;
        if (!copy($chemin_squelette_defaut, $chemin_squelette_site)) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de créer le fichier de squellete par défaut.<br />'.
                        'Fichier : '. $chemin_squelette_site .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
            return $message;
        }
        $chemin_style_defaut =  PAP_CHEMIN_RACINE.GEN_CHEMIN_COMMUN.GEN_DOSSIER_GENERIQUE.GEN_SEP.
                                GEN_DOSSIER_STYLE.GEN_SEP.GEN_FICHIER_STYLE;
        $chemin_style_site =    PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_STYLE.GEN_SEP.GEN_FICHIER_STYLE;
        if (!copy($chemin_style_defaut, $chemin_style_site)) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de créer le fichier de style par défaut.<br />'.
                        'Fichier : '. $chemin_style_site .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
            return $message;
        }
    } else if (GEN_FTP_UTILISE && $id_type_site != '103') {  // 103 est le type "site externe"
        // Création d'une connection ftp avec Net_FTP de PEAR
        // voir http://pear.php.net/manual/fr/package.networking.net-ftp.php
        
        // création de l'objet pear ftp
        $objet_pear_ftp = new Net_FTP(PAP_FTP_SERVEUR, PAP_FTP_PORT);
        // création de la connexion
        $ftp_conn = $objet_pear_ftp->connect(PAP_FTP_SERVEUR, PAP_FTP_PORT);
        // identification
        $ftp_login_result = $objet_pear_ftp->login(PAP_FTP_UTILISATEUR, PAP_FTP_MOT_DE_PASSE);
        // Gestion des erreurs ftp
        if ((PEAR::isError($ftp_conn) || PEAR::isError($ftp_login_result))) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de se connecter par ftp.<br />'.
                        'Serveur : '. PAP_FTP_SERVEUR .'<br />'.
                        'Utilisateur : '. PAP_FTP_UTILISATEUR .'<br />'.
                        'Erreur connexion : '.$ftp_conn->getMessage().'<br />'.
                        'Erreur login : '.$ftp_login_result->getMessage().'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /><p>';
            return $message;
        }
        $objet_pear_ftp->mkdir(PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha']) ;
        
        //$objet_pear_ftp->cd(PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha']) ;
        foreach ($tab_rep_langue as $nom_rep_langue) {
            $objet_pear_ftp->mkdir(PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.$nom_rep_langue) ;
            foreach ($tab_rep_site as $nom_rep_site) {
                $chemin_repertoire =    PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.$nom_rep_langue.GEN_SEP.$nom_rep_site;
                
                $resultat = $objet_pear_ftp->mkdir($chemin_repertoire) ;
                if (PEAR::isError($resultat)) {
                    $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de créer le répertoire par ftp.<br />'.
                                'Répertoire : '. $chemin_repertoire .'<br />'.
                                'Erreur origine : '. $resultat->getMessage() .'<br />'.
                                'Ligne n° : '. __LINE__ .'<br />'.
                                'Fichier n° : '. __FILE__ .'<br /></p>';
                    return $message;
                }
            }
        }
        $chemin_squelette_defaut =  PAP_CHEMIN_RACINE.GEN_CHEMIN_COMMUN.GEN_DOSSIER_GENERIQUE.GEN_SEP.
                                    GEN_DOSSIER_SQUELETTE.GEN_SEP.GEN_FICHIER_SQUELETTE;
        $chemin_squelette_site =    PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                    $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_SQUELETTE.GEN_SEP.GEN_FICHIER_SQUELETTE;
        $resultat = $objet_pear_ftp->put($chemin_squelette_defaut, $chemin_squelette_site, true, FTP_BINARY);
        if (PEAR::isError($resultat)) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de copier le squelette defaut par ftp.<br />'.
                        'Fichier origine : '. $chemin_squelette_defaut .'<br />'.
                        'Fichier copié : '. $chemin_squelette_site .'<br />'.
                        'Erreur origine : '. $resultat->getMessage() .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
                return $message;
        }
        $chemin_style_defaut =  PAP_CHEMIN_RACINE.GEN_CHEMIN_COMMUN.GEN_DOSSIER_GENERIQUE.GEN_SEP.
                                GEN_DOSSIER_STYLE.GEN_SEP.GEN_FICHIER_STYLE;
        $chemin_style_site =    PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP.
                                $aso_valeurs['gs_ce_i18n'].GEN_SEP.GEN_DOSSIER_STYLE.GEN_SEP.GEN_FICHIER_STYLE;
        $resultat = $objet_pear_ftp->put($chemin_style_defaut, $chemin_style_site, true, FTP_BINARY);
        if (PEAR::isError($resultat)) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de copier les styles defaut par ftp.<br />'.
                        'Fichier origine : '. $chemin_style_defaut .'<br />'.
                        'Fichier copié : '. $chemin_style_site .'<br />'.
                        'Erreur origine : '. $resultat->getMessage() .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
                return $message;
        }
        $objet_pear_ftp->disconnect();
    }
    
    $id_site = SQL_obtenirNouveauId($db, 'gen_site','gs_id_site');
    if ($id_site == false) {
        $message = '<p class="erreur"> ERREUR Génésia admin : impossible de récupérer un identifiant pour la table gen_site.<br />'.
                    'Ligne n° : '. __LINE__ .'<br />'.
                    'Fichier n° : '. __FILE__ .'<br /></p>';
        return $message;
    }
    
    // Modification de la requete si nous avons à faire à un site externe.
    $requete_complement = ', gs_url = NULL';
    if (isset($aso_valeurs['type_site_externe']) && $aso_valeurs['type_site_externe'] > 0 && !empty($aso_valeurs['gs_url']) && $aso_valeurs['gs_url'] != 'http://') {
        $requete_complement = ', gs_url = "'.$aso_valeurs['gs_url'].'"';
    }
    
    // Requete d'insertion des infos d'un site dans gen_site
    $requete =  'INSERT INTO gen_site '.
                'SET gs_id_site = '.$id_site.', '.
                'gs_ce_i18n = "'.$aso_valeurs['gs_ce_i18n'].'", '.
                'gs_ce_auth = '.$aso_valeurs['gs_ce_auth'].', '.
                'gs_fichier_squelette = "defaut.html", '.
                'gs_code_num = '.$aso_valeurs['gs_code_num'].', '.
                'gs_code_alpha = "'.$aso_valeurs['gs_code_alpha'].'", '.
                'gs_nom = "'.$aso_valeurs['gs_nom'].'", '.
                'gs_raccourci_clavier = "'.$aso_valeurs['gs_raccourci_clavier'].'", '.
                'gs_titre = "'.$aso_valeurs['gs_titre'].'", '.
                'gs_mots_cles = "'.$aso_valeurs['gs_mots_cles'].'", '.
                'gs_description = "'.$aso_valeurs['gs_description'].'", '.
                'gs_auteur = "'.$aso_valeurs['gs_auteur'].'", '.
                'gs_date_creation = "'.date('Y-m-d H:i:s').'", '.
                'gs_ce_admin = '.$id_admin.
                $requete_complement;
    $resultat = $db->query($requete);
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    
    // Recherche du nouveau numéro d'ordre de ce site "principal" ou "externe"
    $requete =  'SELECT MAX(gsr_ordre) AS max_ordre '.
                'FROM gen_site_relation '.
                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                'AND gsr_id_valeur IN (102, 103) ';// 102 = site "principal" et 103 = site "externe"
    $resultat = $db->query($requete) ;
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    $nouvel_ordre = $ligne->max_ordre + 1;
    
    // Requete d'insertion des relations dans gen_site_relation
    $requete =  'INSERT INTO gen_site_relation '.
                'SET gsr_id_site_01 = '.$id_site.', '.
                'gsr_id_site_02 = '.$id_site.', '.
                'gsr_id_valeur = '.$id_type_site.', '.
                'gsr_ordre = '.$nouvel_ordre;
    $resultat = $db->query($requete);
    if (DB::isError($resultat)) {
        die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
    }
    
    // Gestion du site par défaut
    if (isset($aso_valeurs['defaut']) && $aso_valeurs['defaut'] == 1) {
        $requete_supr_defaut =  'DELETE FROM gen_site_relation '.
                                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                                'AND gsr_id_valeur = 101 ';// 101 = site par "defaut"
        $resultat_supr_defaut = $db->query($requete_supr_defaut);
        if (DB::isError($resultat_supr_defaut)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_defaut->getMessage(), $requete_supr_defaut));
        }
        
        // Requete d'insertion de la relations site par défaut
        $requete =  'INSERT INTO gen_site_relation '.
                    'SET gsr_id_site_01 = '.$id_site.', '.
                    'gsr_id_site_02 = '.$id_site.', '.
                    'gsr_id_valeur = 101, '.
                    'gsr_ordre = NULL ';
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
        }
    }
    
    // Gestion des sites externes
    if ($id_type_site == '103') {
        // Requete d'insertion des relations dans gen_site_relation
        $requete =  'INSERT INTO gen_site_relation '.
                    'SET gsr_id_site_01 = '.$id_site.', '.
                    'gsr_id_site_02 = '.$id_site.', '.
                    'gsr_id_valeur = '.$aso_valeurs['type_site_externe'].', '.
                    'gsr_ordre = NULL ';
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
        }
    }
    
    $message = '<p class="pap_info">'.'Succés de l\'ajout du site.'.'</p>';
    return $message;
}

/** Fonction ADMIN_modifierSite() - Modifie un site de Papyrus.
*
* Cette fonction modifie un site géré par Papyrus.
* Il faudrait aussi pouvoir renomer le dossier du site si le code alpha change.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   le tableau contenant les valeurs du formulaire.
* @param  int      identifiant de l'administrateur réalisant cette modification.
* @return string retourne un message en cas de succès ou d'échec.
*/
function ADMIN_modifierSite(&$db, $aso_valeurs, $id_admin)
{
    // Initialisation de variables
    $message_complement = '';
    
    // Récupération de l'ancien code alphanumérique
    $requete =  'SELECT gs_code_alpha '.
                'FROM gen_site '.
                'WHERE gs_id_site = '.$aso_valeurs['gs_id_site'];
    $ancien_code_alphnum = $db->getOne($requete);
    if (DB::isError($ancien_code_alphnum)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $ancien_code_alphnum->getMessage(), $requete) );
    }
    
    // Nous vérifions si nous avons à faire à un site externe.
    $id_type_site = '102';// par défaut on conscidére que c'est un site "principal"
    $requete_complement = ', gs_url = NULL ';
    if (isset($aso_valeurs['type_site_externe']) && $aso_valeurs['type_site_externe'] > 0 && !empty($aso_valeurs['gs_url']) && $aso_valeurs['gs_url'] != 'http://') {
        $requete_complement = ', gs_url = "'.$aso_valeurs['gs_url'].'" ';
        $id_type_site = '103';// c'est un site "externe"
    }
    
    // Si le code alphanumérique à changé et que nous n'avons pas à faire à un site externe.
    if ($aso_valeurs['gs_code_alpha'] != $ancien_code_alphnum && $id_type_site != 103) {
        if (!GEN_FTP_UTILISE) {
            $chemin_site_ancien = PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$ancien_code_alphnum.GEN_SEP;
            $chemin_site_nouveau = PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP;
            if (!rename($chemin_site_ancien, $chemin_site_nouveau)) {
                $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de changer le nom du dossier du site.<br />'.
                            'Ancien nom : '. $chemin_site_ancien .'<br />'.
                            'Nouveau nom : '. $chemin_site_nouveau .'<br />'.
                            'Ligne n° : '. __LINE__ .'<br />'.
                            'Fichier n° : '. __FILE__ .'<br /></p>';
                return $message;
            }
        } else {
            $chemin_site_ancien = PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$ancien_code_alphnum.GEN_SEP;
            $chemin_site_nouveau = PAP_FTP_RACINE.GEN_CHEMIN_SITES.$aso_valeurs['gs_code_alpha'].GEN_SEP;
            // Création d'une connection ftp avec Net_FTP de PEAR
            // voir http://pear.php.net/manual/fr/package.networking.net-ftp.php
            // création de l'objet pear ftp
            $objet_pear_ftp = new Net_FTP(PAP_FTP_SERVEUR, PAP_FTP_PORT);
            // création de la connexion
            $ftp_conn = $objet_pear_ftp->connect(PAP_FTP_SERVEUR, PAP_FTP_PORT);
            // identification
            $ftp_login_result = $objet_pear_ftp->login(PAP_FTP_UTILISATEUR, PAP_FTP_MOT_DE_PASSE);
            // Gestion des erreurs ftp
            if ((PEAR::isError($ftp_conn) || PEAR::isError($ftp_login_result))) {
                $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de se connecter par ftp.<br />'.
                            'Serveur : '. PAP_FTP_SERVEUR .'<br />'.
                            'Utilisateur : '. PAP_FTP_UTILISATEUR .'<br />'.
                            'Erreur connexion : '.$ftp_conn->getMessage().'<br />'.
                            'Erreur login : '.$ftp_login_result->getMessage().'<br />'.
                            'Ligne n° : '. __LINE__ .'<br />'.
                            'Fichier n° : '. __FILE__ .'<br /><p>';
                return $message;
            }
            $resultat = $objet_pear_ftp->putRecursive($chemin_site_ancien, $chemin_site_nouveau, false, FTP_BINARY);
            if (PEAR::isError($resultat)) {
                $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de copier l\'ancien dossier du site.<br />'.
                            'Dossier site ancien : '. $chemin_site_ancien .'<br />'.
                            'Dossier site nouveau : '. $chemin_site_nouveau .'<br />'.
                            'Erreur origine : '. $resultat->getMessage() .'<br />'.
                            'Ligne n° : '. __LINE__ .'<br />'.
                            'Fichier n° : '. __FILE__ .'<br /></p>';
                    return $message;
            }
            // On utilise la racine FTP pour rm
            $chemin_site_ancien = PAP_FTP_RACINE.GEN_CHEMIN_SITES.$ancien_code_alphnum.GEN_SEP;
            // Changement du niveau d'erreur pour éviter les Notices PHP dues à Net_FTP
            error_reporting(E_PARSE);
            $resultat = $objet_pear_ftp->rm($chemin_site_ancien, true);
            if (PEAR::isError($resultat)) {
                $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de supprimer l\'ancien dossier du site.<br />'.
                            'Dossier site ancien : '. $chemin_site_ancien .'<br />'.
                            'Erreur origine : '. $resultat->getMessage() .'<br />'.
                            'Ligne n° : '. __LINE__ .'<br />'.
                            'Fichier n° : '. __FILE__ .'<br /></p>';
                    return $message;
            }
            // Retour au niveau d'erreur définit dans le fichier de config de Papyrus
            error_reporting(GEN_DEBOGAGE_NIVEAU);
            $objet_pear_ftp->disconnect();
        }
    }
    
    // Requete de mise à jour des infos d'un site dans gen_site
    $requete =  'UPDATE gen_site '.
                'SET gs_ce_i18n = "'.$aso_valeurs['gs_ce_i18n'].'", '.
                'gs_ce_auth = '.$aso_valeurs['gs_ce_auth'].', '.
                'gs_fichier_squelette = "'.$aso_valeurs['gs_fichier_squelette'].'", '.
                'gs_code_num = '.$aso_valeurs['gs_code_num'].', '.
                'gs_code_alpha = "'.$aso_valeurs['gs_code_alpha'].'", '.
                'gs_nom = "'.$aso_valeurs['gs_nom'].'", '.
                'gs_raccourci_clavier = "'.$aso_valeurs['gs_raccourci_clavier'].'", '.
                'gs_titre = "'.$aso_valeurs['gs_titre'].'", '.
                'gs_mots_cles = "'.$aso_valeurs['gs_mots_cles'].'", '.
                'gs_description = "'.$aso_valeurs['gs_description'].'", '.
                'gs_auteur = "'.$aso_valeurs['gs_auteur'].'", '.
                'gs_date_creation = "'.$aso_valeurs['gs_date_creation'].'", '.
                'gs_ce_admin = '.$id_admin.' '.
                $requete_complement.
                'WHERE gs_id_site = '.$aso_valeurs['gs_id_site'];
    $resultat = $db->query($requete) ;
    if (DB::isError($resultat)) {
        die( BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete) );
    }
    // Gestion du site externe
    if ($id_type_site == 103) {
        // Vérification pour voir si nous avons à faire à une transformation d'un site "principal" en site "externe"
        $requete =  'SELECT COUNT(gsr_id_site_01) AS nbre_relation '.
                    'FROM gen_site_relation '.
                    'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                    'AND gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].' '.
                    'AND gsr_id_valeur = 102 ';// 102 = site "principal"
        $nbre_relation = $db->getOne($requete);
        if (DB::isError($nbre_relation)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $nbre_relation->getMessage(), $requete) );
        }
        
        // Nous supprimons l'ancienne relation si nécessaire
        if ($nbre_relation >= 1) {
            $requete_supr_ext = 'DELETE FROM gen_site_relation '.
                                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                                'AND gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].' '.
                                'AND gsr_id_valeur = 102 ';// 102 = site "principal"
            $resultat_supr_ext = $db->query($requete_supr_ext);
            if (DB::isError($resultat_supr_ext)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_ext->getMessage(), $requete_supr_ext));
            }
            $message_complement =   'Le site "principal" a été transformé en site "externe". Si nécessaire, veuillez '.
                                    'supprimer manuellement par FTP, le dossier contenant les fichiers de ce site sur '.
                                    'le serveur!';
        }
        
        // Vérification pour voir si le site est déjà "externe"
        $requete =  'SELECT COUNT(gsr_id_site_01) AS nbre_relation '.
                    'FROM gen_site_relation '.
                    'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                    'AND gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].' '.
                    'AND gsr_id_valeur = 103 ';// 103 = site "externe"
        $nbre_relation = $db->getOne($requete);
        if (DB::isError($nbre_relation)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $nbre_relation->getMessage(), $requete) );
        }
        if ($nbre_relation == 0) {
            // Requete d'insertion de la relations site "externe"
            $requete =  'INSERT INTO gen_site_relation '.
                        'SET gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].', '.
                        'gsr_id_site_02 = '.$aso_valeurs['gs_id_site'].', '.
                        'gsr_id_valeur = '.$id_type_site.', '.
                        'gsr_ordre = NULL ';
            $resultat = $db->query($requete);
            if (DB::isError($resultat)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
            }
        }
        
        // Ajout du type de site externe
        $requete =  'INSERT INTO gen_site_relation '.
                    'SET gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].', '.
                    'gsr_id_site_02 = '.$aso_valeurs['gs_id_site'].', '.
                    'gsr_id_valeur = '.$aso_valeurs['type_site_externe'].', '.
                    'gsr_ordre = NULL ';
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
        }
        
    }
    
    // Gestion du site par défaut
    if (isset($aso_valeurs['defaut']) && $aso_valeurs['defaut'] == 1) {
        $requete_supr_defaut =  'DELETE FROM gen_site_relation '.
                                'WHERE gsr_id_site_01 = gsr_id_site_02 '.
                                'AND gsr_id_valeur = 101 ';// 101 = site par "defaut"
        $resultat_supr_defaut = $db->query($requete_supr_defaut);
        if (DB::isError($resultat_supr_defaut)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_defaut->getMessage(), $requete_supr_defaut));
        }
        
        // Requete d'insertion de la relations site par défaut
        $requete =  'INSERT INTO gen_site_relation '.
                    'SET gsr_id_site_01 = '.$aso_valeurs['gs_id_site'].', '.
                    'gsr_id_site_02 = '.$aso_valeurs['gs_id_site'].', '.
                    'gsr_id_valeur = 101, '.
                    'gsr_ordre = NULL ';
        $resultat = $db->query($requete);
        if (DB::isError($resultat)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
        }
    }
    
    $message = '<p class="pap_info">'.'Succés de la modification du site.'.'</p>';
    $message .= '<p class="pap_info">'.$message_complement.'</p>';
    return $message;
}

/** Fonction ADMIN_supprimerSite() - Ajoute un site à Papyrus.
*
* Cette fonction ajoute le site à Papyrus, c'est à dire :
* - 1. Création des répertoire du projet en fonction du nom et des sous-répertoires.
* - 2. Insertion d'une ligne dans la table "gen_site".
* - 3. Insertion d'une ligne dans la table "gen_site_auth" et ses tables liées si nécessaire.
*
* @param  string   l'objet pear de connexion à la base de données.
* @param  string   le tableau contenant les valeurs du formulaire.
* @param  int      identifiant de l'administrateur réalisant cette création.
* @return string retourne un message en cas de succès ou d'échec.
*/
function ADMIN_supprimerSite(&$db, $aso_valeurs)
{
    // Recherche du coda alpha du site principal afin de pouvoir détruire ses répertoires
    $requete =  'SELECT gs_code_alpha '.
                'FROM gen_site '.
                'WHERE gs_id_site = '.$aso_valeurs['form_sites_id_site'];
    $code_alpha_site_principal = $db->getOne($requete);
    if (DB::isError($code_alpha_site_principal)) {
        die(BOG_afficherErreurSql(__FILE__, __LINE__, $code_alpha_site_principal->getMessage(), $requete));
    }
    
    // Nous vérifions que le site n'a pas le code alphanum correspondant au site par défaut d'administration (admin).
    if ($code_alpha_site_principal == GEN_SITE_DEFAUT) {
        $message =  '<p class="pap_erreur">Si vous voulez vraiment supprimer le site d\'administration par défaut de '.
                    'Papyrus, veuillez commencer par changer la valeur de son code alphanumérique. Vous pourrez '.
                    'ensuite le supprimer via cette interface.</p>';
        return $message;
    }
    
    // Recherche des différents sites liés à celui que l'on veut détruire
    // Cela comprend le site à détruire lui méme car il posséde la relations
    // sur lui meme "site principale".
    $requete =  'SELECT gs_id_site '.
                'FROM gen_site, gen_site_relation '.
                'WHERE gsr_id_site_01 = '.$aso_valeurs['form_sites_id_site'].' '.
                'AND gsr_id_site_02 = gs_id_site ';
    $resultat = $db->query($requete);
    if (DB::isError($resultat)) {
        die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete));
    }
    
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
        // Requete de suppression des sites liés dans gen_site
        $requete_supr_site =    'DELETE FROM gen_site '.
                                'WHERE gs_id_site = '.$ligne->gs_id_site;
        $resultat_supr_site = $db->query($requete_supr_site);
        if (DB::isError($resultat_supr_site)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_site->getMessage(), $requete_supr_site));
        }
        
        // Requete de suppression des relations des sites à détruire
        $requete_supr_site_relation =   'DELETE FROM gen_site_relation '.
                                        'WHERE gsr_id_site_01 = '.$ligne->gs_id_site;
        $resultat_supr_site_relation = $db->query($requete_supr_site_relation);
        if (DB::isError($resultat_supr_site_relation)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_site_relation->getMessage(), $requete_supr_site_relation));
        }
        
        // Recherche des différents menus liés au site à détruire
        $requete_menu = 'SELECT gm_id_menu '.
                        'FROM gen_menu '.
                        'WHERE gm_ce_site = '.$ligne->gs_id_site;
        $resultat_menu = $db->query($requete_menu) ;
        if (DB::isError($resultat_menu)) {
            die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_menu->getMessage(), $requete_menu));
        }
        while ($ligne_menu = $resultat_menu->fetchRow(DB_FETCHMODE_OBJECT)) {
            // Requete de suppression des des menus
            $requete_supr_menu =   'DELETE FROM gen_menu '.
                                            'WHERE gm_id_menu = '.$ligne_menu->gm_id_menu;
            $resultat_supr_menu = $db->query($requete_supr_menu);
            if (DB::isError($resultat_supr_menu)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_menu->getMessage(), $requete_supr_menu));
            }
            // Requete de suppression des relations des menus
            $requete_supr_menu_relation =   'DELETE FROM gen_menu_relation '.
                                            'WHERE gmr_id_menu_01 = '.$ligne_menu->gm_id_menu;
            $resultat_supr_menu_relation = $db->query($requete_supr_menu_relation);
            if (DB::isError($resultat_supr_menu_relation)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_menu_relation->getMessage(), $requete_supr_menu_relation));
            }
            
            // Requete de suppression des contenus des menus
            $requete_supr_menu_contenu =   'DELETE FROM gen_menu_contenu '.
                                            'WHERE gmc_ce_menu = '.$ligne_menu->gm_id_menu;
            $resultat_supr_menu_contenu = $db->query($requete_supr_menu_contenu);
            if (DB::isError($resultat_supr_menu_contenu)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_menu_contenu->getMessage(), $requete_supr_menu_contenu));
            }
            
            // Requete de suppression des ulr alternatives des menus
            $requete_supr_menu_url_alt =   'DELETE FROM gen_menu_url_alternative '.
                                            'WHERE gmua_ce_menu = '.$ligne_menu->gm_id_menu;
            $resultat_supr_menu_url_alt = $db->query($requete_supr_menu_url_alt);
            if (DB::isError($resultat_supr_menu_url_alt)) {
                die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat_supr_menu_url_alt->getMessage(), $requete_supr_menu_url_alt));
            }
        }
        $resultat_menu->free();
    }
    $resultat->free();
    
    // Suppression des répertoires du site
    if (!GEN_FTP_UTILISE) {
        $chemin_repertoire = PAP_CHEMIN_RACINE.GEN_CHEMIN_SITES.$code_alpha_site_principal;
        $resultat = supprimerDossier($chemin_repertoire, GEN_SEP);
        if (!$resultat) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de supprimer le répertoire.<br />'.
                        'Répertoire : '. $chemin_repertoire .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
            return $message;
        }
    } else {
        // Création d'une connection ftp avec Net_FTP de PEAR
        // voir http://pear.php.net/manual/fr/package.networking.net-ftp.php
        
        // création de l'objet pear ftp
        $objet_pear_ftp = new Net_FTP(PAP_FTP_SERVEUR, PAP_FTP_PORT);
        // création de la connexion
        $ftp_conn = $objet_pear_ftp->connect(PAP_FTP_SERVEUR, PAP_FTP_PORT);
        // identification
        $ftp_login_result = $objet_pear_ftp->login(PAP_FTP_UTILISATEUR, PAP_FTP_MOT_DE_PASSE);
        // Gestion des erreurs ftp
        if ((PEAR::isError($ftp_conn) || PEAR::isError($ftp_login_result))) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de se connecter par ftp.<br />'.
                        'Erreur connexion : '.$ftp_conn->getMessage().'<br />'.
                        'Erreur login : '.$ftp_login_result->getMessage().'<br />'.
                        'Serveur : '. PAP_FTP_SERVEUR .'<br />'.
                        'Utilisateur : '. PAP_FTP_UTILISATEUR .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /><p>';
            return $message;
        }
        // Changement du niveau d'erreur pour éviter les Notices PHP dues à  Net_FTP
        error_reporting(E_PARSE);
        $chemin_repertoire = PAP_FTP_RACINE.GEN_CHEMIN_SITES.$code_alpha_site_principal.'/';
        $resultat = $objet_pear_ftp->rm($chemin_repertoire, true);
        if (PEAR::isError($resultat)) {
            $message =  '<p class="pap_erreur"> ERREUR Papyrus admin : impossible de supprimer le répertoire par ftp.<br />'.
                        'Erreur ftp : '.$resultat->getMessage().'<br />'.
                        'Répertoire : '. $chemin_repertoire .'<br />'.
                        'Ligne n° : '. __LINE__ .'<br />'.
                        'Fichier n° : '. __FILE__ .'<br /></p>';
            return $message;
        }
        $objet_pear_ftp->disconnect();
        // Retour au niveau d'erreur définit dans le fichier de config de Papyrus
        error_reporting(GEN_DEBOGAGE_NIVEAU);
    }
    $message = '<p class="pap_info">Succés de la suppression du site.</p>';
    return $message;
}

// +- Fin du code source  --------------------------------------------------------------------------------+
/*
* $Log: not supported by cvs2svn $
* Revision 1.22  2005/05/27 16:06:16  jpm
* Gestion des infos sur l'admin modifiant les infos.
*
* Revision 1.21  2005/04/08 13:29:04  jpm
* Utiliation de références.
* Correction du double &amp; dans les urls du formulaire.
*
* Revision 1.20  2005/03/08 11:17:47  jpm
* Suppression de l'inclusion d'un fichier inutile.
*
* Revision 1.19  2005/02/28 11:07:00  jpm
* Modification des auteurs.
*
* Revision 1.18  2005/02/28 10:59:07  jpm
* Modification des commentaires et copyright.
*
* Revision 1.17  2005/02/17 17:51:11  florian
* Correction bug FTP
*
* Revision 1.16  2005/02/17 16:44:55  florian
* correction du bug sur les sites par défaut
*
* Revision 1.15  2005/01/04 19:52:50  alex
* correction de bug de copie de répertoire récursif de PEAR.
*
* Revision 1.14  2004/12/03 19:22:53  jpm
* Gestion des types de sites externes gérés par Papyrus.
*
* Revision 1.13  2004/12/03 16:37:34  jpm
* Correction d'un bogue qui empécher la mise à jour des url des sites externes.
*
* Revision 1.12  2004/12/01 17:22:58  jpm
* Ajout d'une confirmation javascript pour la suppression d'un site.
*
* Revision 1.11  2004/11/30 16:43:51  jpm
* Correction de bogues.
*
* Revision 1.10  2004/11/29 17:05:28  jpm
* Correction d'un bogue concernat les cases à cocher.
*
* Revision 1.9  2004/11/26 13:13:51  jpm
* Mise en commentaire de variable passée dans un message d'erreur car elles semblent provoquer un bogue et ne sont pas obligatoire.
*
* Revision 1.8  2004/11/03 17:59:59  jpm
* Corrections bogues erreurs variable inconnue.
*
* Revision 1.7  2004/10/26 18:41:28  jpm
* Gestion des sites externes à Papyrus.
*
* Revision 1.6  2004/10/22 17:25:31  jpm
* Changement du nom de la class CSS d'erreur.
*
* Revision 1.5  2004/10/19 15:57:55  jpm
* Amélioration de la gestion des fichiers sur le serveur.
* Ajout d'une contrainte pour éviter la suppression par erreur du site par défaut.
*
* Revision 1.4  2004/10/18 18:27:41  jpm
* Correction problèmes FTP et manipulation de fichiers.
*
* Revision 1.3  2004/09/23 16:51:27  jpm
* Ajout d'informations supplémentaires sur les messages d'erreur.
*
* Revision 1.2  2004/07/06 17:08:01  jpm
* Modification de la documentation pour une mailleur analyse par PhpDocumentor.
*
* Revision 1.1  2004/06/16 14:28:46  jpm
* Changement de nom de Génésia en Papyrus.
* Changement de l'arborescence.
*
* Revision 1.20  2004/05/10 14:32:14  jpm
* Changement du titre.
*
* Revision 1.19  2004/05/10 12:23:39  jpm
* Modification formulaire.
*
* Revision 1.18  2004/05/07 16:33:53  jpm
* Amélioration des formulaires.
*
* Revision 1.17  2004/05/07 07:22:51  jpm
* Ajout de la gestion des modification et suppression de site.
* Amélioration de la création des sites.
*
* Revision 1.16  2004/04/30 16:22:53  jpm
* Poursuite de l'administration des sites.
*
* Revision 1.14  2004/04/02 15:58:39  jpm
* Modification fonction liste des projets.
*
* Revision 1.13  2004/04/01 11:21:41  jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.12  2004/03/24 20:01:02  jpm
* Traduction, mise en forme, ajout de commentaire pour les fonctions listProjects() et updateProject().
*
* Revision 1.11  2004/03/24 10:06:01  jpm
* Ajout des commentaires d'entête.
* Début mise en conformité avec la convention de codage.
* Début traitement de la fonction listant les projets.
*
*
*/
?>