Subversion Repositories Applications.papyrus

Rev

Rev 127 | Rev 149 | 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: pap_menu.fonct.php,v 1.6 2004-11-08 17:39:32 jpm Exp $
/**
* Bibliothèque de fonction sur le rendu.
*
* Cette bibliothèque contient des fonctions utilisé par le rendu des pages de Papyrus.
*
*@package Papyrus
*@subpackage Fonctions
//Auteur original :
*@author        Laurent COUDOUNEAU <laurent.coudouneau@ema.fr>
//Autres auteurs :
*@author        Alexandre GRANIER <alexadandre@tela-botanica.org>
*@author        Jean-Pascal MILCENT <jpm@tela-botanica.org>
*@copyright     Tela-Botanica 2000-2004
*@version       $Revision: 1.6 $ $Date: 2004-11-08 17:39:32 $
// +------------------------------------------------------------------------------------------------------+
*/

// +------------------------------------------------------------------------------------------------------+
// |                                            LISTE des FONCTIONS                                       |
// +------------------------------------------------------------------------------------------------------+

/** Fonction GEN_donnerProfondeurMax() - Renvoie le nombre de niveau de menu.
*
* Cette fonction calcule, pour un menu donné, le nombre de niveau de menu fils complétant 
* l'arbre des menus jusqu'au feuilles.
* Ici on l'utilise en passant l'argument égal à zéro c'est à dire
* en partant du menu racine d'un site gmr_id_menu_02 = 0.
* C'est une fonction récursive.
* Noter que la variable $prof est statique.
*
* @param integer identifiant du site sur lequel la profondeur est calculé.
* @param integer identifiant du menu à partir delaquelle on souhaite calculer la profondeur.
* @return integer le nombre de niveau de menu.
*/
function GEN_donnerProfondeurMax($id_site, $id_menu)
{
    global $db;
    static $prof = 0;
    
    // Requête sur les relations de type "avoir père" entre menus
    $requete =  'SELECT gmr_id_menu_01 '.
                'FROM gen_menu, gen_menu_relation '.
                'WHERE gmr_id_menu_02 = '.$id_menu.' '.
                'AND gmr_id_menu_01 = gm_id_menu '.
                'AND gm_ce_site = '.$id_site.' '.
                'AND gmr_id_valeur = 1 '.
                'ORDER BY gmr_ordre ASC';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    if ($resultat->numRows() == 0) {
        return $prof;
    }
    $prof++;
    while ($ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT)) {
        $prof = GEN_donnerProfondeurMax($id_site, $ligne->gmr_id_menu_01);
    }
    return $prof;
}

/** Fonction GEN_donnerDernierFreres() - Renvoie l'id du dernier menu frère.
*
* Cette fonction regarde si un menu donné possède au moins un frère dans l'arbre
* des menus. Elle retourne l'id du dernier menu frére en utilisant gmr_ordre.
* Cette fonction fait appel à la fonction : GEN_lireIdentifiantMenuPere().
*
* @param integer identifiant du menu.
* @return boolean renvoi l'id du dernier menu frère sinon faux.
*/
function GEN_donnerDernierFreres($id_menu)
{
    // Initialisation des variables.
    global $db;
    
    $requete =  'SELECT gmr_id_menu_01 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_02 = '.GEN_lireIdentifiantMenuPere($id_menu).' '.
                'AND gmr_id_valeur = 1 '.
                'AND gmr_id_menu_01 <> '.$id_menu.' '.
                'ORDER BY gmr_ordre DESC';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    if ($resultat->numRows() > 0) {
        return $ligne->gmr_id_menu_01;
    } else {
        return false;
    }
}

/** Fonction GEN_etreFreres() - Renvoie vrai si les menus ont le même père.
*
* Cette fonction regarde si deux menus donnés sont frères dans l'arbre
* des menus. Nous regardons si les menus ont le même identifiant comme père.
*
* @param integer identifiant du premier menu.
* @param integer identifiant du seconde menu.
* @return boolean renvoi vrai si les deux menus sont frères sinon faux.
*/
function GEN_etreFreres($id_menu_1, $id_menu_2)
{
    // Initialisation des variables.
    global $db;
    
    $requete =  'SELECT gmr_id_menu_02 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$id_menu_1.' '.
                'AND gmr_id_valeur = 1 ';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    $id_pere_1 = $ligne->gmr_id_menu_02;
    $resultat->free();

    $requete =  'SELECT gmr_id_menu_02 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$id_menu_2.' '.
                'AND gmr_id_valeur = 1 ';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    $id_pere_2 = $ligne->gmr_id_menu_02;
    $resultat->free();
    
    return ($id_pere_1 == $id_pere_2);
}

/** Fonction GEN_etreAncetre() - Renvoie vrai si le premier argument (identifiant de menu) est un ancètre du second.
*
* Nous récupérons l'identifiant du père du menu passé en argument numéro 2. Puis,
* nous le comparons à l'argument 1. Si c'est les même on retourne faux. Sinon on rapelle
* la fonction avec l'identifiant du père trouvé pour l'argument 2. Ainsi de suite jusqu'a
* renvoyé vrai où tomber sur un menu racine (idetifiant du père = 0).
* Si les variable sont null nous retournons false.
* C'est une fonction récursive.
*
* @param integer identifiant d'un menu numéro 1.
* @param integer identifiant d'un menu numéro 2.
* @return boolean vrai si le menu numéro 1 est ancètre du second.
*/
function GEN_etreAncetre($id_menu_1, $id_menu_2)
{
    //Test erreur
    if (is_null($id_menu_1) || is_null($id_menu_2)) {
        return false;
    }
    
    // Initialisation des variables.
    global $db;
    
    $requete =  'SELECT gmr_id_menu_02 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$id_menu_2.' '.
                'AND gmr_id_valeur = 1 ';
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die (BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    $resultat->free();
    if ($ligne->gmr_id_menu_02 == 0) {
        return false;
    } else if ($ligne->gmr_id_menu_02 == $id_menu_1) {
        return true;
    } else {
        return GEN_etreAncetre($id_menu_1, $ligne->gmr_id_menu_02);
    }
}

/** Fonction GEN_lireIdentifiantMenuAncetre() - Renvoie l'identifiant du menu ancètre du menu passé en paramètre.
*
*   Cette fonction parcours la table gen_menu_relation et retourne l'identifiant du
*   menu dont le père est le menu racine (identifiant = 0) pour le menu passé en paramètre.
*
*   @global mixed   objet Pear DB de connexion à la base de données..
*   @param  int     identifiant du menu dont il faut rechercher le père.
*   @return int     identifiant du menu ancètre du menu passé en paramètre.
*/
function GEN_lireIdentifiantMenuAncetre($id_menu)
{
    global $db;
    // On teste si on est au niveau d'un menu racine i.e GM_ID_PERE=0
    $requete =  'SELECT gmr_id_menu_02 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$id_menu.' '.
                'AND gmr_id_valeur = 1 ';// 1 = avoir "père"
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    $resultat->free();
    
    // Dans le cas où le menu en paramètre est un menu racine
    if ($ligne->gmr_id_menu_02 == 0) {
        return $id_menu;
    }
    
    return GEN_lireIdentifiantMenuAncetre($ligne->gmr_id_menu_02);
}

/** Fonction GEN_lireIdentifiantMenuPere() - Renvoie l'identifiant du père du menu passé en paramètre.
*
*   Cette fonction parcours la table gen_menu_relation et retourne l'identifiant du
*   menu père du menu passé en paramètre.
*
*   @global mixed   objet Pear DB de connexion à la base de données..
*   @param  int     l'identifiant du fils
*   @return mixed   l'identifiant du père,ou false en cas d'erreur.
*/
function GEN_lireIdentifiantMenuPere($id_menu)
{
    global $db;
    
    $requete =  'SELECT gmr_id_menu_02 '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$id_menu.' '.
                'AND gmr_id_valeur = 1 ';// 1 = avoir "père"
    
    $resultat = $db->getOne($requete) ;
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    return $resultat;
}

/** Fonction GEN_lireInfoMenu() - Renvoie un objet ou un tableau contenant une ligne de la table gen_menu
*
* Retourne la ligne de la table gen_menu concernant le menu ayant pour identifiant la valeur
* passée en paramètre.
* Ancien nom : getLevel()
*
* @param  mixed     une instance de la classse Pear DB.
* @param  int       l'identifiant d'un menu.
* @param  string    le mode dans Pear DB dans lequel on veut recevoir les infos du menu.
* @return  mixed    un objet ou tableau résultat de Pear DB contenant une ligne de la table gen_menu, ou false en cas d'erreur.
*/
function GEN_lireInfoMenu($db, $menuid, $mode = DB_FETCHMODE_OBJECT)
{
    //----------------------------------------------------------------------------
    // Recherche des informations sur le menu
    $requete =  'SELECT * '.
                'FROM gen_menu '.
                'WHERE gm_id_menu = '.$menuid;
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    if ($resultat->numRows() != 1) {
        return false;
    }
    
    //----------------------------------------------------------------------------
    // Récupération des infos
    $info_menu = $resultat->fetchRow($mode);
    $resultat->free();
    
    return $info_menu;
}

/** Fonction GEN_lireInfoMenuRelation() - Renvoie un objet ou un tableau contenant une ligne de la table gen_menu_relation
*
* Par défaut recherche une relation de type père.
* Ancien nom : getMenuRelation().
*
* @param  mixed   Une instance de la classse PEAR_DB
* @param  int  l'identifiant d'un menu.
* @param  int  l'identifiant d'une valeur de relation.
* @param  string  le mode dans Pear DB dans lequel on veut recevoir les infos du menu.
* @return  mixed   n objet ou tableau résultat Pear DB, ou false en cas d'erreur.
*/
function GEN_lireInfoMenuRelation($db, $menuid, $id_valeur = '1', $mode = DB_FETCHMODE_OBJECT)
{
    //----------------------------------------------------------------------------
    // Recherche des informations sur la relation de menu
    $requete =  'SELECT * '.
                'FROM gen_menu_relation '.
                'WHERE gmr_id_menu_01 = '.$menuid.' '.
                'AND gmr_id_valeur = '.$id_valeur;
    
    $result = $db->query($requete);
    (DB::isError($result)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $result->getMessage(), $requete)) : '';
    
    if ($result->numRows() != 1) {
        return false;
    }
    
    //----------------------------------------------------------------------------
    // Récupération des infos
    $info_menu_relation = $result->fetchRow($mode);
    $result->free();
    
    return $info_menu_relation;
}

/** Fonction GEN_verifierPresenceCodeMenu() - Vérifie l'existence d'un code de menu
*
* Permet de vérifier dans la base de données si le code fournie (alphanumérique ou numérique) a déjà
* été attribué à un menu ou pas!
*
* @param  mixed   Une instance de la classse PEAR_DB
* @param  string  le type du code (int ou string).
* @param  mixed   le code numérique ou alphanumérique.
* @return mixed   retourne l'identifiant du menu possédant le code sinon false.
*/
function GEN_verifierPresenceCodeMenu($db, $type, $code)
{
    // Requete pour vérifier l'abscence du code numérique et alphanumérique de la table gen_menu
    $requete =  'SELECT gm_id_menu '.
                'FROM gen_menu ';
    // Complément de requête en fonction du type de code
    if ($type == 'int') {
        $requete .= 'WHERE gm_code_num = '.$code;
    } else {
        $requete .= 'WHERE gm_code_alpha = "'.$code.'"';
    }
    $nombre_reponse = $db->affectedRows($requete);
    if (DB::isError($nombre_reponse)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $nombre_reponse->getMessage(), $requete) );
    }
    if ($nombre_reponse == 1) {
        $id = $db->getOne($requete);
        if (DB::isError($id)) {
            die( BOG_afficherErreurSql(__FILE__, __LINE__, $id->getMessage(), $requete) );
        }
        return $id;
    } else {
        return false;
    }
}

// +------------------------------------------------------------------------------------------------------+
//                          A NORMALISER !!!
// +------------------------------------------------------------------------------------------------------+

/** Fonction niveau_menu() - Renvoie le niveau d'un menu.
*
* Fournit le niveau d'un menu dans l'arbre des menus d'un site
* donné.
* C'est une fonction récursive.
*
* @param  integer l'identifiant du site du menu.
* @param  integer l'identifiant de la langue du site du menu.
* @param  integer l'identifiant d'un menu.
* @return  integer le niveau d'un menu.
*/
function niveau_menu($id_site, $id_langue, $id_menu)
{
    global $db ;
    static $niveau = 1;
    
    $requete =  'SELECT gm_ce_menu_pere '.
                'FROM gen_menu '.
                'WHERE gm_id_menu = '.$id_menu.' '.
                'AND gm_id_i18n = "'.$id_langue.'" '.
                'AND gm_id_site = '.$id_site;
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    if ($resultat->numRows() == 0) {
        return $niveau;
    }
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    
    if ($ligne->gm_ce_menu_pere == 0) {
    
    $niveau++;
    $niveau = niveau_menu($id_site, $id_langue, $ligne->gm_ce_menu_pere);
    }
    
    return $niveau;
}

/** Fonction id_ancetre_niveau() - Renvoie l'identifiant de l'ancetre de niveau $niveau
*
* Renvoie l'identifiant de l'ancetre de niveau $niveau.
* C'est une fonction récursive.
*
* @param  integer identifiant du site du menu dont on cherche l'ancètre.
* @param  integer identifiant de la langue du site du menu dont on cherche l'ancètre.
* @param  integer identifiant du menu dont on cherche l'ancètre.
* @param  integer niveau souhaité.
* @return  integer identifiant de l'ancètre cherché.
*/
function id_ancetre_niveau($id_site, $id_langue, $id_menu, $niveau)
{
    global $db;
    static $id_et_niveau = array();

    $requete =  'SELECT gp_ce_page_pere '.
                'FROM gen_page '.
                'WHERE gp_id_page = '.$id_page;
    
    $resultat = $db->query($requete);
    (DB::isError($resultat)) ? die(BOG_afficherErreurSql(__FILE__, __LINE__, $resultat->getMessage(), $requete)) : '';
    
    $ligne = $resultat->fetchRow(DB_FETCHMODE_OBJECT);
    
    if ($ligne->gm_ce_menu_pere != 0) {
        array_push ($id_et_niveau, $ligne->gm_ce_menu_pere);
    } else {
        return array_pop($id_et_niveau);
    }
    $resultat->free();
    
    return id_ancetre_niveau($id_site, $id_langue, $ligne->gm_ce_menu_pere, $niveau);
}

/* +--Fin du code ---------------------------------------------------------------------------------------+
* $Log: not supported by cvs2svn $
* Revision 1.5  2004/11/04 12:51:45  jpm
* Suppression de message de débogage.
*
* Revision 1.4  2004/11/04 12:23:50  jpm
* Nouvelles fonctions sur les menus frères.
*
* Revision 1.3  2004/10/25 14:16:21  jpm
* Suppression de code commenté.
*
* Revision 1.2  2004/10/21 18:15:21  jpm
* Ajout de gestion d'erreur aux fonctions.
*
* Revision 1.1  2004/06/15 15:11:37  jpm
* Changement de nom et d'arborescence de Genesia en Papyrus.
*
* Revision 1.43  2004/05/05 06:13:27  jpm
* Extraction de la fonction générant le "vous êtes ici", transformée en applette.
*
* Revision 1.42  2004/05/04 16:24:06  jpm
* Amélioration de la fonction générant le "vous êtes ici".
*
* Revision 1.41  2004/05/04 16:17:31  jpm
* Ajout de la fonction générant le "vous êtes ici".
*
* Revision 1.40  2004/05/03 11:18:17  jpm
* Normalisation de deux fonctions issues du fichier fontctions.php.
*
* Revision 1.39  2004/05/01 16:17:11  jpm
* Suppression des fonctions liées à la création des listes de menu. Elles ont été transformées en applette.
*
* Revision 1.38  2004/05/01 11:43:16  jpm
* Suppression des fonction GEN_afficherMenuCommun() et GEN_afficherSelecteurSites() transformées en applette.
*
* Revision 1.37  2004/04/30 16:18:41  jpm
* Correction d'un bogue dans les fonctions de gestion des scripts.
*
* Revision 1.36  2004/04/28 12:04:40  jpm
* Changement du modèle de la base de données.
*
* Revision 1.35  2004/04/09 16:23:41  jpm
* Prise en compte des tables i18n.
*
* Revision 1.34  2004/04/02 16:34:44  jpm
* Extraction de variable globale des fonction, remplacé par un passage en paramètre.
*
* Revision 1.33  2004/04/01 11:24:51  jpm
* Ajout et modification de commentaires pour PhpDocumentor.
*
* Revision 1.32  2004/03/31 16:52:30  jpm
* Modification du code vis à vis du modèle revision 1.9 de Génésia.
*
* Revision 1.31  2004/03/29 17:13:05  jpm
* Suppression de fonction, passer en code classique.
*
* Revision 1.30  2004/03/27 11:11:58  jpm
* Début changement nom de variable dans fonction creerInfoPageEtApplication().
*
* Revision 1.29  2004/03/26 12:52:25  jpm
* Ajout des fonctions creerInfoPageEtApplication() et donnerIdPremiereApplicationLiee().
*
* +-- Fin du code ----------------------------------------------------------------------------------------+
*/
?>