FrameBeurk File
Fmbk/Module/Beurk/fonctionsBeurk.php
<?php //FrameBeurk V0.65 Copyright ToolOscope 2016. Licence CeCILL-C.
// ----------------------- recherches dans le noyau ---------------------------------
// cette fonction renvoie le terminal d'un noeud à partir de ce qu'on lui envoie
// si le noeud n'a pas de terminal, et qu'on n'a pas précisé $estDeType à False, renvoie le terminal du noeud lié par 'estDeType'
function Beurk_terminal($IdNoeud, $estDeType = true) {
global $CONFIG, $DIALOG;
// cas 1 : une Id numérique est envoyée
if (intval($IdNoeud) > 0) {
if (isset($CONFIG['Controle']['Id'][$IdNoeud])) // c'est un terminal en config
$terminal = $CONFIG['Controle']['Id'][$IdNoeud]['Terminal'];
elseif ($estDeType) { // c'est un noeud intermédiaire
if (isset($DIALOG['Terminaux'][$IdNoeud])) // recherche si terminal déjà en mémoire
$terminal = $DIALOG['Terminaux'][$IdNoeud];
else { // sinon, si on demande le type :lecture en base
$result = db_QUERY("SELECT T1.Terminal FROM Beurk_Lien R
LEFT JOIN Beurk_Terminal T1 ON T1.IdTerminal = R.IdLie
WHERE R.IdNoeud = '" . $IdNoeud . "' AND R.IdRelation = '" . $CONFIG['Relation']['estDeType']['Id'] . "'");
list($terminal) = db_FETCH_ROW($result); // recherche du terminal du noeud lié par 'estDeType' (on ne gère pour le moment que le niveau supérieur)
db_FREE($result);
$DIALOG['Terminaux'][$IdNoeud] = $terminal; // stockage du résultat pour la durée du dialogue
}
} else
$terminal = ''; // pas un terminal du noyau
// cas 2 : une Id alpha est envoyée
} else {
if (isset($CONFIG['Controle']['Terminal'][$IdNoeud])) // c'est un terminal de noeud en config
$terminal = $IdNoeud;
else
$terminal = ''; // c'est n'importe quoi
}
return $terminal;
}
// cette fonction renvoie l'id d'un noeud à partir de ce qu'on lui envoie (son Id ou le terminal de son type)
function Beurk_id($Noeud) {
global $CONFIG;
// cas 1 : une Id numérique est retournée
if (intval($Noeud) > 0) // c'est un noeud intermédiaire
return $Noeud;
// cas 2 : une Id alpha est envoyée
if (isset($CONFIG['Controle']['Terminal'][$Noeud])) // c'est un terminal en config
return $CONFIG['Controle']['Terminal'][$Noeud]['Id'];
return 0; // c'est n'importe quoi
}
// cette fonction renvoie l'Id du contenant d'un noeud, par la relation 'estElementDe'
function Beurk_estElementDe($IdNoeud) {
global $CONFIG;
// si une Id alpha est envoyée dans IdNoeud : c'est un terminal.
if (intval($IdNoeud) == 0) {
if (isset($CONFIG['Controle']['Terminal'][$IdNoeud]) && isset($CONFIG['Controle']['Terminal'][$IdNoeud]['estElementDe'])) // c'est un terminal en config
return $CONFIG['Controle']['Terminal'][$IdNoeud]['estElementDe'];
else
return $CONFIG['Controle']['Terminal']['Site']['Id']; // par défaut, élément du Site
}
// c'est un noeud intermédiaire.
$result = db_QUERY("SELECT R.IdLie FROM Beurk_Lien R
WHERE R.IdNoeud = '" . $IdNoeud . "' AND R.IdRelation = '" . $CONFIG['Relation']['estElementDe']['Id'] . "'");
list($IdLie) = db_FETCH_ROW($result);
db_FREE($result);
return $IdLie;
}
// cette fonction renvoie le terminal du type d'un noeud, par la relation 'estDeType'
function Beurk_estDeType($IdNoeud, $horsNoyau = true) {
global $CONFIG;
// cas 1 : une Id numérique est envoyée
if (intval($IdNoeud) > 0) {
if (isset($CONFIG['Controle']['Id'][$IdNoeud]) && isset($CONFIG['Controle']['Id'][$IdNoeud]['Type'])) // c'est un terminal en config
return $CONFIG['Controle']['Id'][$IdNoeud]['Type'];
elseif ($horsNoyau) { // c'est un noeud intermédiaire : lecture en base
$result = db_QUERY("SELECT T1.Terminal FROM Beurk_Lien R
LEFT JOIN Beurk_Terminal T1 ON T1.IdTerminal = R.IdLie
WHERE R.IdNoeud = '" . $IdNoeud . "' AND R.IdRelation = '" . $CONFIG['Relation']['estDeType']['Id'] . "'");
list($terminal) = db_FETCH_ROW($result); // recherche du terminal du noeud lié par 'estDeType'
db_FREE($result);
return $terminal;
} else
return ''; // pas un terminal du noyau
// cas 2 : une Id alpha est envoyée
} else {
if (isset($CONFIG['Controle']['Terminal'][$IdNoeud]) && isset($CONFIG['Controle']['Terminal'][$IdNoeud]['Type'])) // c'est un terminal de noeud en config
return $CONFIG['Controle']['Terminal'][$IdNoeud]['Type'];
else
return ''; // c'est n'importe quoi
}
}
//fonction renvoie les données communes du noeud
function Beurk_etat($IdNoeud) {
if (intval($IdNoeud) > 0) { // une Id numérique est envoyée, sinon rien
$result = db_QUERY("SELECT H.IdEtat FROM Beurk_Historique H WHERE H.IdNoeud = '$IdNoeud' ORDER BY IdNoeud ASC, NoVersion DESC LIMIT 1");
if (list($IdEtat) = db_FETCH_ROW($result)) {
db_FREE($result);
return Beurk_terminal($IdEtat, false);
}
db_FREE($result);
}
return false;
}
//fonction renvoie le createur du noeud
function Beurk_idCreateur($IdNoeud) {
if (intval($IdNoeud) > 0) { // une Id numérique est envoyée, sinon rien
$result = db_QUERY("SELECT H.IdUser FROM Beurk_Historique H WHERE H.IdNoeud = '$IdNoeud' AND NoVersion = 1");
if (list($IdUser) = db_FETCH_ROW($result)) {
db_FREE($result);
return $IdUser;
}
db_FREE($result);
}
return false;
}
// cette fonction vérifie si l'entité est définie pour l'action et sinon recherche l'entité parente définie
function Beurk_entiteAction($Etape, $ActVue, $IdVue) {
global $CONFIG, $TRANSAC;
$EntVue = Beurk_terminal($IdVue);
if (! array_key_exists($EntVue, $CONFIG['Entite'])) { // si EntVue est un terminal sans être une entité, on va chercher son type
$EntVue = Beurk_estDeType($IdVue);
if (! array_key_exists($EntVue, $CONFIG['Entite'])) // si EntVue est un terminal sans être une entité, force à 'Entite'
$EntVue = 'Entite';
}
// recherche de la Vue définie pour l'entité ou pour ses ascendants par la relation 'estDeType'
$tabEntite = &$CONFIG['Entite'][$EntVue];
$fin = $trouve = array_key_exists($ActVue, $tabEntite[$Etape]); // vérification existence de la vue pour cette entité
while ((! $trouve) && (! $fin) && ($EntVue != 'Entite')) { // si non, on essaie pour le parent, jusqu'à Entite
if ($EntVue = Beurk_estDeType($EntVue)) {
$tabEntite = &$CONFIG['Entite'][$EntVue];
$trouve = array_key_exists($ActVue, $tabEntite[$Etape]);
} else
$fin = true;
}
unset($tabEntite);
if ($trouve)
return $EntVue;
return false;
}
// ----------------------- initialisation transaction / dialogue ---------------------------------
function Beurk_initTransaction(&$TRANSAC, $startTime) {
$TRANSAC['Protocole'] = ((! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$TRANSAC['StatutLogin'] = 9; // par défaut, User non logué
// messages
$TRANSAC['Message'] = array('Url' => '',
'Vue' => '',
'Maj' => '',
'Connexion' => '',
'Recherche' => '');
// gestion Ajax
$TRANSAC['Ajax'] = array('Est' => ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') ? true : false),
'UrlCanonique' => '',
'Redirection' => ''); // URL de la page qui doit être affichée à réception du message Ajax
// page
$TRANSAC['Page'] = array('Patron' => '', // patron par défaut utilisé dans index.php
'ForceTabIndex' => false, // forcer l'alimentation des tabindex sur les champs de formulaire
'TabIndex' => 1, // tabIndex courant
'Enctype' => 'application/x-www-form-urlencoded', // enctype des forms, par défaut
'DivActions' => '', // divs d'accueil à réserver pour les actions proposées
'DefileJusque' => '', // provoque le défilement de la page jusqu'à la div au chargement
'UrlCanonique' => '',
'Titre' => '',
'Description' => '', // description de la page (balise meta)
'Keywords' => '', // mot-clés de la page (balise meta)
'sauveDIALOG' => true); // si cette variable est false, DIALOG ne sera pas sauvé en session
// statistiques
$TRANSAC['Stat'] = array('TsBeurkIni' => ($temps = Beurk_temps($startTime)), //format Beurk (millisecondes)
'TempsIni' => Beurk_formateBeurkTimeStd($temps), //format Standart (secondes)
'NbCatalogues' => 0, // nombre de catalogues de traduction chargés
'DureeCatalogues' => 0., // temps passé à charger les catalogues de traduction
'DureeBootstrap' => 0.); // temps passé dans le bootstrap
}
function Beurk_initDialogue(&$DIALOG) {
global $CONFIG;
//préférence d'affichage par défaut
$DIALOG['Langue'] = $CONFIG['Defaut']['Langue'];
$DIALOG['Pagination'] = $CONFIG['Defaut']['Pagination'];
$DIALOG['Somme'] = array(); // sommes de controles des actions
$DIALOG['Historique'] = array(); // actions réalisées au cours de la session (alimenté selon le besoin)
$DIALOG['DivVuePage'] = ''; // nom de la div principale
$DIALOG['ClefVuePage'] = array(); // clef d'affichage de la dernière vue
// détection browser
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/MSIE/i', $userAgent))
$DIALOG['Browser'] = 'MSIE';
elseif(preg_match('/Firefox/i', $userAgent))
$DIALOG['Browser'] = 'Firefox';
elseif(preg_match('/Chrome/i', $userAgent))
$DIALOG['Browser'] = 'Chrome';
elseif(preg_match('/Safari/i', $userAgent))
$DIALOG['Browser'] = 'Safari';
elseif(preg_match('/Flock/i', $userAgent))
$DIALOG['Browser'] = 'Flock';
elseif(preg_match('/Opera/i', $userAgent))
$DIALOG['Browser'] = 'Opera';
elseif(preg_match('/rv/i', $userAgent)) // IE 11
$DIALOG['Browser'] = 'rv';
// détection version du browser
if ($DIALOG['Browser'] == 'rv') {
preg_match('/rv:([0-9]*)/', $userAgent, $matches);
$DIALOG['VersionBrowser'] = $matches[1];
$DIALOG['Browser'] = 'MSIE';
} elseif ($DIALOG['Browser'] !='') {
preg_match('/(' . $DIALOG['Browser'] . ')[ \/]([\w]+)/', $userAgent, $matches);
$DIALOG['VersionBrowser'] = $matches[2];
} else {
$DIALOG['Browser'] = 'browser ?';
$DIALOG['VersionBrowser'] = '';
}
// détection des robots
if (preg_match('/(bot|spider|yahoo)/i', $_SERVER[ "HTTP_USER_AGENT" ]))
$DIALOG['Robot'] = true;
else
$DIALOG['Robot'] = false;
// fil RSS par défaut
$DIALOG['TitreRSS'] = Beurk_traduit($CONFIG['Defaut']['TitreRSS'], 'Beurk');
$DIALOG['LinkRSS'] = $CONFIG['Defaut']['LinkRSS'];
}
//------------------------------------------ Gestion des autorisations ----------------------------------------------
//fonction de controle de l'autorisation du User
// appelée par controleurVue et controleurMaj et autres
// renvoie '' si autorisé, sinon le message d'erreur
function Beurk_controleurAutorisation($autoNecessaire, $paramAuto) {
global $CONFIG;
if (isset($CONFIG['Controle']['Autorisation'][$autoNecessaire])) {
// si la fonction associée à l'autorisation est non vide
if (($fonctionAuto = $CONFIG['Controle']['Autorisation'][$autoNecessaire]) != '')
return $fonctionAuto($paramAuto); // appel de la fonction
return ''; // pas de fonction : cas de "Tous"
} else
return Beurk_message('Autorisation nécessaire inconnue', 'Beurk');
}
// vérifie que la somme de contrôle renvoyée par l'utilisateur est bien celle stockée dans le dialogue
function Beurk_autoSomme(&$paramAuto) {
global $DIALOG, $TRANSAC;
if (isset($paramAuto['preAuto']) && $paramAuto['preAuto'] == true) // controle inhibé dans le cas de l'affichage d'un lien vers l'action
return '';
if (! isset($paramAuto['sommeControle']))
return Beurk_message('Somme de contrôle absente', 'Beurk');
if (! isset($DIALOG['Somme'][ $nomSomme = $paramAuto['ActMaj'] . $paramAuto['IdMaj'] ]))
return Beurk_message('Somme de contrôle inconnue', 'Beurk');
if ($paramAuto['sommeControle'] != $DIALOG['Somme'][$nomSomme]) //$DIALOG[$paramAuto['ActMaj'] . $paramAuto['IdMaj']]
return Beurk_message('Somme de contrôle incorrecte', 'Beurk');
}
// action toujours interdite (par les controleurs)
function Beurk_autoAucun(&$paramAuto) {
return Beurk_message('Action interdite', 'Beurk');
}
// vérifie que le jetonClef renvoyé est valide (ou que le user connecté est admin)
function Beurk_autoJetonClef(&$paramAuto) {
global $CONFIG;
if (isset($paramAuto['preAuto']) && $paramAuto['preAuto'] == true) // controle inhibé dans le cas de l'affichage d'un lien vers l'action
return '';
if ($CONFIG['Module']['Beurk']['Fonctions']['EstAdmin']())
return '';
if (! isset($paramAuto['IdEtatJetonClef']))
return Beurk_message('Clef inconnue', 'Beurk');
if ($paramAuto['IdEtatJetonClef'] != Beurk_id('V'))
return Beurk_message('Clef invalide', 'Beurk');
}
//renvoie un jeton de la longueur demandée en alphanum
function Beurk_JetonAleatoire($long, $commenceParAlpha = false) {
if ($commenceParAlpha)
$clef = chr(mt_rand(97,122)); // chr(97) = 'a'; chr(122) = 'z'
else
$clef = '';
while (strlen($clef) < $long)
$clef .= strval(base_convert(mt_rand(), 10, 36));
return substr($clef, 0, $long);
}
//--------------------------------- Gestion des messages et erreurs ---------------------------------
// crée un message constitué d'un libellé et de son module d'origine
// intérêt : fonction extraite par TranslaBeurk !
function Beurk_message($message, $module) {
return array($message, $module);
}
//message et éventuellement positionnement d'une erreur à l'étape en cours
function Beurk_messageEtape($message, $topErreur, $champErreur = '') {
global $TRANSAC;
$Etape = $TRANSAC['Etape'];
if (is_array($message)) {
$module = $message[1];
$message = $message[0];
} else $module = '';
if ($topErreur) {
$TRANSAC[$Etape]['Erreur'] = true;
$TRANSAC['Message'][$Etape] = '<p class="erreur">' . Beurk_traduit($message, $module) . '</p>';
if ($champErreur != '' && $TRANSAC[$Etape]['ChampErreur'] == '') // stockage du 1er repositionnement
$TRANSAC[$Etape]['ChampErreur'] = $champErreur;
} else
$TRANSAC['Message'][$Etape] = '<p class="bravo">' . Beurk_traduit($message, $module) . '</p>';
}
// renvoie true si la vue en cours est celle du form en erreur de maj
function Beurk_estFormErreur() {
global $TRANSAC;
return (isset($TRANSAC['Maj']) && $TRANSAC['Maj']['Erreur'] && $TRANSAC['Maj']['Form'] == $TRANSAC['Vue']['Form']);
}
// renvoie true si la vue en cours est celle du form en erreur de maj et que le champ est celui de l'erreur
function Beurk_estChampErreur($champ) {
global $TRANSAC;
return (isset($TRANSAC['Maj']) && $TRANSAC['Maj']['Erreur'] && $TRANSAC['Maj']['Form'] == $TRANSAC['Vue']['Form'] && $TRANSAC['Maj']['ChampErreur'] == $champ);
}
//----------------------------- Gestion des balises des formulaires ---------------------------------
//renvoie le champ de type <input> (de type text, password, hidden) alimenté avec
// - la valeur passée en paramètre si pas d'erreur Maj sur ce formulaire
// - la valeur reçue dans la requête sinon (sauf pour le type password)
function Beurk_baliseInput($type, $nom, $valeur, $classeBalise = '', $size = '', $maxlength = '', $readonly = '', $title = '') {
global $TRANSAC;
$classes = trim($classeBalise . ' ' . ((Beurk_estChampErreur($nom)) ? 'erreurchamp' : '')); // concatène la classe demandée avec la classe d'erreur
return '<input type="' . $type . '" name="' . $nom . '" id="' . $nom . '"'
. (($classes != '') ? " class=\"$classes\"" : '')
. (($title != '') ? " title=\"$title\"" : '')
. (($size != '') ? " size=\"$size\"" : '')
. (($maxlength != '') ? " maxlength=\"$maxlength\"" : '')
. (($readonly != '') ? " readonly=\"$readonly\"" : '')
. Beurk_tabIndex()
. ' value="' . ((Beurk_estFormErreur() && $type != 'password' && isset($_REQUEST[$nom])) ? Beurk_DB2InputHTML($_REQUEST[$nom]) : $valeur)
. '">';
}
//renvoie le champ de type <select> alimenté si erreur avec la classe d'erreur
function Beurk_baliseSelect($nom, $listeOptions, $classeBalise = '') {
global $TRANSAC;
$classes = trim($classeBalise . ' ' . ((Beurk_estChampErreur($nom)) ? 'erreurchamp' : '')); // concatène la classe demandée avec la classe d'erreur
return '<select name="' . $nom . '"'
. (($classes != '') ? " class=\"$classes\"" : '')
. Beurk_tabIndex()
. '>
' . $listeOptions . '
</select>
';
}
//renvoie le champ de type <option> alimenté avec
// - la valeur passée en paramètre si pas d'erreur Maj sur ce formulaire
// - la valeur reçue dans la requête sinon
function Beurk_baliseOption($select, $valeur, $valeurDefaut, $libelle, $classeBalise = '') {
global $TRANSAC;
return '<option value="' . $valeur . '"'
. (($classeBalise != '') ? " class=\"$classeBalise\"" : '')
. ((Beurk_estFormErreur() && $_REQUEST[$select] == $valeur) ? ' selected' :
(((! Beurk_estFormErreur()) && $valeur == $valeurDefaut) ? ' selected' : ''))
. ">$libelle</option>";
}
//renvoie le champ de type <textarea> alimenté avec
// - la valeur passée en paramètre si pas d'erreur Maj sur ce formulaire
// - la valeur reçue dans la requête sinon
function Beurk_baliseTextarea($nom, $valeur, $classeBalise = '', $wrap = '', $rows = '') {
global $TRANSAC;
$classes = trim($classeBalise . ' ' . ((Beurk_estChampErreur($nom)) ? 'erreurchamp' : ''));
return '<textarea name="' . $nom . '"'
. (($classes != '') ? " class=\"$classes\"" : '')
. (($rows != '') ? " rows=\"$rows\"" : '')
. (($wrap != '') ? " wrap=\"$wrap\"" : '')
. Beurk_tabIndex()
. '>' . ((Beurk_estFormErreur() && isset($_REQUEST[$nom])) ? Beurk_DB2InputHTML($_REQUEST[$nom]) : $valeur)
. '</textarea>';
}
//renvoie le champ de type checkbox. $checked est de type booleen
function Beurk_baliseCheckBox($nom, $valeur, $checked, $classeBalise = '', $readonly = '', $title = '') {
global $TRANSAC;
$classes = trim($classeBalise . ' ' . ((Beurk_estChampErreur($nom)) ? 'erreurchamp' : '')); // concatène la classe demandée avec la classe d'erreur
// force le réaffichage de la valeur envoyée si le formulaire est en erreur
if (Beurk_estFormErreur() && isset($_REQUEST[$nom])) {
if ($_REQUEST[$nom] == $valeur)
$checked = true;
else
$checked = false;
}
return '<input type="checkbox" name="' . $nom . '" id="' . $nom . '"'
. ' value="' . $valeur . '"'
. (($classes != '') ? " class=\"$classes\"" : '')
. (($title != '') ? " title=\"$title\"" : '')
. (($readonly != '') ? " readonly=\"$readonly\"" : '')
. Beurk_tabIndex()
. ($checked ? ' checked' : '')
. '>';
}
// renvoie le tabindex si demandé
function Beurk_tabIndex() {
global $TRANSAC;
return (($TRANSAC['Page']['ForceTabIndex']) ? (' tabindex="' . $TRANSAC['Page']['TabIndex']++ . '"') : '');
}
// formate une balise <fieldset> et traduit le label (depuis la langue du module courant)
function Beurk_fieldset($legend, $input) {
echo '<fieldset>
<legend>', Beurk_traduit($legend), (($legend != '') ? ' :' : ''), '</legend>
<label>
', $input, '
</label>
</fieldset>
';
}
//-------------------------------- Gestion des clef d'affichage des pages --------------------------------
// cette fonction extrait le tableau des champs clef de la vue. $entite et $action doivent être des terminaux, en alpha
// $Etape doit être égal à 'Vue' ou 'Maj'
function Beurk_tabClef($Etape, $action, $entite) {
global $CONFIG;
if (isset($CONFIG['Entite'][$entite])) { // l'entité existe
$ConfigEntite =& $CONFIG['Entite'][$entite];
if (isset($ConfigEntite[$Etape][$action])) { // l'action est définie pour cette entité et cette Etape
$tabAction =& $ConfigEntite[$Etape][$action];
if (isset($tabAction['Clef'])) // si des champs clef sont définis pour cette action
return $tabAction['Clef'];
}
}
if (isset($CONFIG['Action'][$action]) && isset($CONFIG['Action'][$action]['Clef' . $Etape])) // clef par défaut définie dans configBeurk_final.php
return $CONFIG['Action'][$action]['Clef' . $Etape];
return false;
}
//initialise un tableau ayant en clefs les champs de la clef et l'alimente à partir à $_REQUEST
// $entAct et $action doivent être des terminaux, en alpha
// $Etape doit être égal à 'Vue' ou 'Maj'
function Beurk_alimenteChampsAction($Etape, $action, $entAct, $idEntite, $suffixe = '') {
global $CONFIG, $TRANSAC;
$TRANSAC[$Etape]['Champ'] = array(('Act' . $Etape) => $action, ('Id' . $Etape) => $idEntite);
if ($champs = Beurk_tabClef($Etape, $action, $entAct)) //recherche des champs associés à entite + action
foreach ($champs as $champ) {
if (isset($_REQUEST[$champ . $suffixe])) { // affectation de la valeur
$valeur = $_REQUEST[$champ . $suffixe];
} else
$valeur = 0; // par défaut
if (substr($champ, 0, 2) == 'Id') // controle de la valeur selon le type
$valeur = (int) $valeur;
elseif (substr($champ, 0, 2) == 'No') {
$valeur = (int) $valeur;
if ($valeur <= 0)
$valeur = 1;
}
$GLOBALS[$champ] = $valeur; // pour utilisation dans les actions
$TRANSAC[$Etape]['Champ'][$champ] = $valeur; // pour la sauvegarde de la clef
}
return true;
}
//initialise un tableau ayant en clefs les champs de la clef. $entite et $action doivent être des terminaux, en alpha
// $phase doit être égal à 'Vue' ou 'Maj'
/* function Beurk_initClef($phase, $action, $entite) { // a supprimer ????
global $CONFIG;
$champsClef = array(('Act' . $phase) => '', ('Id' . $phase) => ''); //nuisible à controleurVue
if ($clef = Beurk_tabClef($phase, $action, $entite)) //recherche des champs associés à entite + action
foreach ($clef as $champ)
$champsClef[$champ] = '';
return $champsClef;
} */
//renvoie l'URL d'affichage de la vue courante (le résultat doit être traité par htmlspecialchars)
function Beurk_clefVuePage($suffixe = '') {
global $DIALOG;
if (is_array($DIALOG['ClefVuePage'])) {
if ($suffixe == '')
return $DIALOG['ClefVuePage'];
else {
foreach ($DIALOG['ClefVuePage'] as $champ => $valeur)
$ClefURLCourante[$champ . $suffixe] = $valeur;
return $ClefURLCourante;
}
} else // session trop ancienne : clef perdue !
return array(); // on ne devrait pas arriver là : En cas de session trop ancienne, il faudrait recharger la page complète (à implémenter)
}
//renvoie la clef d'affichage de la vue courante (le résultat doit être traité par htmlspecialchars)
function Beurk_clefVueCourante($suffixe = '') {
global $TRANSAC;
if (is_array($TRANSAC['Vue']['Champ'])) {
if ($suffixe == '')
return $TRANSAC['Vue']['Champ'];
else {
foreach ($TRANSAC['Vue']['Champ'] as $champ => $valeur)
$ClefURLCourante[$champ . $suffixe] = $valeur;
return $ClefURLCourante;
}
} else // ça ne devrait pas arriver, car $TRANSAC['Vue']['Champ'] est alimenté par le controleurVue
return array();
}
//renvoie le chemin des ressources accessible au navigateur
function Beurk_cheminRessource($protocole = '') {
global $CONFIG, $TRANSAC;
if ($protocole == '')
$protocole = $TRANSAC['Protocole']; // par défaut, le protocole courant
return $protocole . '://' . $CONFIG['Param']['DomaineUrl'][$protocole] . $CONFIG['Param']['CheminRessource'];
}
//renvoie le chemin complet de l'URL jusqu'à la partie variable
function Beurk_cheminURL($protocole = '', $langue = '') {
global $CONFIG, $DIALOG, $TRANSAC;
if ($protocole == '')
$protocole = $TRANSAC['Protocole']; // par défaut, le protocole courant
$racine = $protocole . '://' . $CONFIG['Param']['DomaineUrl'][$protocole];
if ($CONFIG['Param']['LangueUrl']) { // si la langue dépend de l'Url
if ($langue == '') // si la langue n'est pas précisé dans l'appel
$langue = $DIALOG['Langue']; // on utilise la langue en cours
return $racine . $CONFIG['Param']['CheminUrlLangue'][$langue];
} else // la langue ne fait pas partie de l'Url
return $racine . $CONFIG['Param']['CheminInstal'];
}
// formate le nom de la div d'accueil à partir de la clef
function Beurk_nomDivAccueil($clefURLouJeton) {
$nomDiv = 'a';
if (is_array($clefURLouJeton)) { // tableau clef
foreach ($clefURLouJeton as $champ => $valeur)
$nomDiv .= '.' . Beurk_id($valeur);
return $nomDiv; //substr($nomDiv, 1); // retire le '.' initial
} else // nom de la div = jeton
return $clefURLouJeton;
}
// formate le nom de la div d'accueil à partir de la clef
function Beurk_divAccueil($clefURL, $datadiv = '', $class = '') {
return '<div id="' . Beurk_nomDivAccueil($clefURL) . '" style="display:none;"'
. (($class) ? (' class="' . $class . '"') : '')
. (($datadiv) ? (' data-div="' . $datadiv . '"') : '')
. '></div>
';
}
// sortie des divs d'accueil des actions (alimentées par exemple par Kom1_actionVueMaj)
function Beurk_flushDivsAccueil() {
global $TRANSAC;
$tmp = $TRANSAC['Page']['DivActions'];
$TRANSAC['Page']['DivActions'] = ''; // réinit des divs
return $tmp;
}
//renvoie l'URL sous forme d'objet javascript. ATTENTION : les champs de $clefURL doivent être dans l'ordre
function Beurk_jsURL($clefURL) {
$jsURL = '';
foreach ($clefURL as $champ => $valeur)
$jsURL .= ", '" . addslashes($champ) . "':'" . addslashes(Beurk_id($valeur)) . "'";
return '{' . substr($jsURL, 2) . '}'; // retire le ', ' initial
}
// renvoie un slug à intégrer dans l'URL à partir du titre de l'entité
function Beurk_slug($titrePage) {
// return strtolower(preg_replace('/(-)\1+/u', '\1', preg_replace(array('/[^-a-zA-Z0-9\s]/', '/[\s]/'), array('-', '-'), $titrePage)));
return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($titrePage, ENT_NOQUOTES, 'UTF-8'))), ' '));
}
//------------------------------------ Gestion du temps --------------------------------------------
// fonction renvoie le temps (+- l'offset en secondes) formatté en ssaammjjhhmmssmmm
function Beurk_temps($microtime, $offset = 0) {
$mtime = explode(' ', $microtime);
return date('YmdHis', $mtime[1] + $offset) . substr((strval($mtime[0]) . '0000'),2,3);
}
// formatage du temps pour l'affichage
function Beurk_formateBeurkTime($tempsBeurk) {
return sprintf('%s-%s-%s %s:%s:%s', substr(($stemps=strval($tempsBeurk)),0,4), substr($stemps,4,2), substr($stemps,6,2), substr($stemps,8,2), substr($stemps,10,2), substr($stemps,12,2));
}
//converti le temps format 'Beurk_temps' en format de date XML
function Beurk_formateBeurkTimeStd($tempsBeurk) {
return strtotime(Beurk_formateBeurkTime($tempsBeurk));
}
//--------------------------- Gestion du formatage des champs en entrée/sortie --------------------------
function Beurk_Request2DB($texteenvoye) { // InputHTML -> DB
//$texteenvoye = wordwrap($texteenvoye, 90, "\n", 1); // limite à 90 car/ligne
$texteenvoye = preg_replace('#[\n|\r\n]{3,}#',"\n\n", // limite à 2 les sauts de ligne
((mb_check_encoding($texteenvoye, 'UTF-8') ? $texteenvoye : utf8_encode($texteenvoye)))); // encode en utf-8 si besoin (cas notamment du 'multipart/form-data')
if (! get_magic_quotes_gpc()) $texteenvoye = db_ESCAPE($texteenvoye);
return $texteenvoye;
}
function Beurk_DB2HTML($textelu, $topAbrege = false) { // DB -> HTML
return ($topAbrege) ? str_replace(array("\r\n", "\n", "\r"), ' ', htmlspecialchars($textelu, ENT_NOQUOTES, 'UTF-8')) // en abrege, tous les sauts de ligne sont supprimés
: nl2br(htmlspecialchars($textelu, ENT_NOQUOTES, 'UTF-8'));
}
function Beurk_DB2XML($textelu) { // DB -> XML
return nl2br(htmlspecialchars($textelu, ENT_QUOTES, 'UTF-8'));
}
function Beurk_Request2HTML($texteenvoye) { // InputHTML -> HTML
$texteenvoye = preg_replace('#[\n|\r\n]{3,}#',"\n\n", $texteenvoye); //limite à 2 les sauts de ligne
if (get_magic_quotes_gpc()) $texteenvoye = stripslashes($texteenvoye);
return nl2br(htmlspecialchars($texteenvoye, ENT_NOQUOTES, 'UTF-8'));
}
function Beurk_DB2InputHTML($textelu) { // DB -> InputHTML
return htmlspecialchars($textelu, ENT_QUOTES, 'UTF-8');
}
//--------------------------- Gestion des traductions --------------------------
function Beurk_traduit($tabTexte, $module = '', $param1 = '', $param2 = '', $param3 = '') {
global $CONFIG, $DIALOG, $TRANSAC, $CATALOG;
// détermination du module qui envoie le message
if (is_array($tabTexte)) { // 1er cas : le texte est un array, le 2ème élément est le nom du module qui le renvoie
list($texte, $module) = $tabTexte;
$param1 = ((count($tabTexte) > 2) ? $tabTexte[2] : ''); // dans ce cas, les paramètres sont passés dans le tableau
$param2 = ((count($tabTexte) > 3) ? $tabTexte[3] : '');
$param3 = ((count($tabTexte) > 4) ? $tabTexte[4] : '');
} else { // 2ème cas : le texte est en format string
if ($module == '')
$module = $TRANSAC[ $TRANSAC['Etape'] ]['Module']; // si le module n'est pas renseigné, le texte est renvoyé dans la langue du module courant
$texte = $tabTexte;
}
// si la langue du module est la langue courante, pas besoin de traduire
$langue = $DIALOG['Langue'];
if ($langue == $CONFIG['Module'][$module]['Langue'])
$traduction = $texte;
else { // il faut traduire
if (! array_key_exists($module, $CATALOG[$langue])) { // si catalogue pas en mémoire
$TRANSAC['Stat']['NbCatalogues'] += 1;
$tsDeb = microtime(true);
$fichierCatalogue = INSTALL_PATH . (($module == '_site') ? '/prive/' : '/Module/') . $module . '/_lang/catalogue' . $module . '_' . $langue . '.php';
if (file_exists($fichierCatalogue)) // chargement du catalogue
include($fichierCatalogue);
else // catalogue non trouvé
$CATALOG[$langue][$module] = array(); // on crée le tableau pour ne plus rechercher le fichier à nouveau
$TRANSAC['Stat']['DureeCatalogues'] += (microtime(true) - $tsDeb);
}
if (isset($CATALOG[$langue][$module][$texte]))
$traduction = $CATALOG[$langue][$module][$texte]; // traduction
else
$traduction = $texte; //pas de traduction disponible
}
if (strpos($traduction, '%') === false) // pas de paramètres
return $traduction;
else
return sprintf($traduction, $param1, $param2, $param3); //remplacement des paramètres
}