Mise à jour de travail sur le portage de la version 'Ovh' vers le VPS. Nombreuses modifs à tous niveaux (donc non tracées...)

This commit is contained in:
2026-10-02 15:20:14 +00:00
parent 94ae0d9b25
commit fcf5434ff8
15 changed files with 855 additions and 751 deletions
+1
View File
@@ -44,3 +44,4 @@ define("BDD_BATEAUX_DEV_DATABASE_PREFIXE", "");
// --- Autres ---
define("BDD_BATEAU_PASSWORD", "");
define("SMTP_PASSWORD", ""); // mot de passe de l'adresse email d'envoi (fonctions_mail.php)
define("CLE_CHIFFREMENT_ARCHIVE", "");
+7 -4
View File
@@ -1,5 +1,5 @@
<?php
define("REPERTOIRE_HOME", "/home/koriolan/ship2net");
define("REPERTOIRE_HOME", "/home/koriolan");
require_once("confidentiel.php");
@@ -38,8 +38,10 @@ else
//=====================================================================
// Niveaux d'accès :
define("NIVEAU_MINI_ACCES_ADMINISTATEUR", 25);
define("NIVEAU_EDITEUR_ACCES_ADMINISTATEUR", 50);
define("NIVEAU_ACCES_MINI", 0);
define("NIVEAU_ACCES_MINI_ADMINISTRATEUR", 25);
define("NIVEAU_ACCES_MINI_EDITEUR", 50);
define("NIVEAU_ACCES_MAXI", 99);
//=====================================================================
@@ -51,8 +53,9 @@ define("TYPE_UTILISATEUR_PROFESSIONNEL", 2);
//=====================================================================
// Informations générales :
define("NOM_SITE", "ShipHeart");
define("NOM_SITE", "Ship2net");
define("TITRE_SITE", "ShipHeart - Simplicity is true luxury");
define("URL_SITE", "ship2net.fr");
define("MARQUE", "ShipHeart &#153;");
define("SOCIETE", "Koriolan");
define("ANNEE_CREATION", 2019);
-18
View File
@@ -1,24 +1,6 @@
<?php
//*******************************************************************************************
function Connexion_ftp()
{
$ftp_server = "ftp.trois-etoiles.fr";
$ftp_user_name = "troiseto";
$ftp_user_pass = "da6VMvRC";
// Mise en place de la connexion :
$id_ftp = ftp_connect($ftp_server);
if(!$id_ftp) return (-1); // Connexion impossible...
// Identification avec un nom d'utilisateur et un mot de passe :
$login_result = ftp_login($id_ftp, $ftp_user_name, $ftp_user_pass);
if (!$login_result) return(-1);
return($id_ftp);
}
//*******************************************************************************************
function Copie_dir_ftp ($id_ftp, $dir_source, $dir_destination)
+1 -1
View File
@@ -12,7 +12,7 @@ function Init_session($nom_page)
ini_set('arg_separator.output', '&amp;');
ini_set("url_rewriter.tags","a=href,area=href,frame=src,iframe=src,input=src"); // Ces deux lignes sont destinées à faire ajouter autoamtiquement &amp; au lieu de '&' dans la passage des variables de Session (nécessaire pour W3C validator...)
session_set_cookie_params(3600, '/', 'shipheart.tech', 1, 1);
session_set_cookie_params(3600, '/', 'URL_SITE', 1, 1);
session_start(); // Ouverture de session (avant tout autre envoi au client!!!)
+1 -1
View File
@@ -3,7 +3,7 @@
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require_once("../vendor/autoload.php");
require_once(__DIR__ . "/../vendor/autoload.php");
//************************************************************************************************************
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
require_once('../vendor/tecnickcom/tcpdf/tcpdf.php'); // Include the main TCPDF library
require_once('../vendor/phpqrcode/qrlib.php');
require_once(__DIR__ .'/../vendor/tecnickcom/tcpdf/tcpdf.php'); // Include the main TCPDF library
require_once(__DIR__ .'/../vendor/phpqrcode/qrlib.php');
class MYPDF extends TCPDF {
+3 -3
View File
@@ -47,7 +47,7 @@ Nom="email_invalide"
//************************************************************************************************************
function Recuperer_texte($fichier, $page, $bloc, $nom){
$texte = stripcslashes($_SESSION['textes'][$fichier][$page][$bloc][$nom]);
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTATEUR)){
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTRATEUR)){
if ($_SESSION['modifier_texte'] == 1) $texte = $texte.'<a id="" href="textes.php?action=navigation&destination=Accueil&fichier='.$fichier.'&page='.$page.'&bloc='.$bloc.'&nom='.$nom.'&current_page='.basename($_SERVER['SCRIPT_FILENAME']).'" class="a_update"></a>';
}
@@ -64,7 +64,7 @@ function Recuperer_texte($fichier, $page, $bloc, $nom){
//************************************************************************************************************
function Ajouter_lien_modif($fichier, $page, $bloc, $nom){
$texte = "";
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTATEUR)){
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTRATEUR)){
if ($_SESSION['modifier_texte'] == 1) $texte = '<a id="" href="textes.php?action=navigation&destination=Accueil&fichier='.$fichier.'&page='.$page.'&bloc='.$bloc.'&nom='.$nom.'&current_page='.basename($_SERVER['SCRIPT_FILENAME']).'" class="a_update update_navbar"></a>';
}
@@ -81,7 +81,7 @@ function Ajouter_lien_modif($fichier, $page, $bloc, $nom){
//************************************************************************************************************
function Ajouter_lien_modif_buttons($fichier, $page, $bloc, $nom){
$texte = "";
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTATEUR)){
if (($_SESSION['acces_valide']) && ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_EDITEUR_ACCES_ADMINISTRATEUR)){
if ($_SESSION['modifier_texte'] == 1) $texte = '<a id="" href="textes.php?action=navigation&destination=Accueil&fichier='.$fichier.'&page='.$page.'&bloc='.$bloc.'&nom='.$nom.'&current_page='.basename($_SERVER['SCRIPT_FILENAME']).'" class="a_update"></a>';
}
+207 -212
View File
@@ -1,219 +1,214 @@
<?php
// Fichier régénéré automatiquement par extraire_traductions.php
// le 25/09/2026 à 16:53:47 - les valeurs vides sont à traduire manuellement.
// le 28/09/2026 à 15:20:23 - les valeurs vides sont à traduire manuellement.
// Entrées triées par ordre alphabétique du texte français.
return [
'[Email] est invalide !'
=> '[Email] is invalid!',
'[Email] est déjà utilisée par un ShipMember.<br />Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse. <br />Sinon, merci de choisir une autre adresse.'
=> '[Email] is already in use by a ShipMember.<br />If you are the owner of this email address, please log in using it. <br />Otherwise, please choose a different email address.',
'<p>Félicitations !</p>
<p>Votre compte ShipMember est créé, vous y êtes presque.</p>
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href="https://shipheart.tech">ShipHeart.tech</a> pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.</p>
<p>Et ensuite, où que vous soyez et dès que votre ShipHeart est installé, accédez à votre bateau via votre accès privilégié ShipMember !</p>
<p> </p>
<p>Bienvenue parmi nous !</p>
<p>L\'équipage ShipHeart</p>
<p> </p>
<p style="font-size: 0.8em;">(*) L\'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d\'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.</p>'
=> '<p>Congratulations!</p>
<p>Your ShipMember account has been created – you’re almost there.</p>
<p>Surname: [[First name]] [[Surname]]</p>
<p>Email: [[Email]]</p>
<p>Temporary password: [[Password]]</p>
<p>Just one more click: Log in to <a href="https://shipheart.tech">ShipHeart.tech</a> to verify your ShipMember account by changing your temporary password (*). This is an important security measure that should not be overlooked.</p>
<p>And then, wherever you are and as soon as your ShipHeart is installed, access your boat via your exclusive ShipMember account!</p>
<p> </p>
<p>Welcome on board!</p>
<p>The ShipHeart crew</p>
<p> </p>
<p style="font-size: 0.8em;">(*) Activation must be completed by [[Date_maxi_activation]]. But don’t worry; if you don’t manage to do so by then, you can always request a new temporary password.</p>',
'Votre accès ShipMember - Un dernier clic pour accéder à votre bateau !'
=> 'Your ShipMember login – Just one more click to access your boat!',
'Un email vient d\'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec un mot de passe provisoire.'
=> 'An email has just been sent to [[First name]] [[Surname]] ([[Email]]) containing a temporary password.',
'Désolé, votre compte n\'a pas été activé dans le délai maximal.<br />Vous pouvez demander la génération d\'un nouveau mot de passe provisoire en cliquant sur le bouton ci-dessous. Il vous sera adressé immédiatement par email.'
=> 'Sorry, your account has not been activated within the maximum time limit.<br />You can request a new temporary password by clicking the button below. It will be sent to you immediately by email.',
'Bienvenue !'
=> 'Welcome!',
'Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire.'
=> 'For safety reason, your new password can\'t be the same than the temporary password.',
'Félicitations : votre compte est maintenant activé et vous êtes d\'ores et déjà connecté.e.'
=> 'Congratulations: your account is now active and you\'re already logged in.',
'Les deux mots de passe saisis doivent être identiques.'
=> 'Both passwords shall be the same.',
'Le mot de passe renseigné n\'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.'
=> 'The password you have entered not valid. To insure the security of your data, it must contain between 6 and 20 characters, and must consist exclusively of lower-case letters, upper-case letters, numbers or the following special characters _-!*=.',
'<p>Bonjour,</p>
<p>Le mot de passe de votre compte ShipMember vient d\'être réinitialisé à votre demande.</p>
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href="https://ship2net.fr">Ship2net.fr</a> pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger...</p>
<p>Bienvenue à nouveau parmi nous !</p>
<p>L\'équipage ShipHeart</p>
<p> </p>
<p style="font-size: 0.8em;">(*) L\'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d\'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.</p>'
=> '<p>Hello,</p>
<p>The password for your ShipMember account has just been reset at your request.</p>
<p>Surname: [[First name]] [[Surname]]</p>
<p>Email: [[Email]]</p>
<p>Temporary password: [[Password]]</p>
<p>Just one more click: Log in to <a href="https://ship2net.fr">Ship2net.fr</a> to activate your ShipMember account by changing your temporary password (*). This is an important security measure that should not be overlooked...</p>
<p>Welcome back!</p>
<p>The ShipHeart team</p>
<p> </p>
<p style="font-size: 0.8em;">(*) Activation must be completed by [[Date_maxi_activation]]. But don’t worry; if you don’t manage to do so by then, you can always request a new temporary password.</p>',
'Votre demande concernant votre accès ShipMember'
=> 'Your enquiry regarding your ShipMember access',
'Un email vient d\'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec les informations relatives à votre inscription.'
=> 'An email has just been sent to [[First name]] [[Surname]] ([[Email]]) containing details of your registration.',
'<p>Bonjour,</p>
<p>L\'adresse email associée à votre compte ShipMember vient d\'être modifiée à votre demande :</p>
<p>Ancienne adresse : [[Old_email]]</p><p>Nouvelle adresse : [[New_email]]</p>
<p>Si vous n\'êtes pas à l\'origine de ce changement d\'adresse, merci de contacter sans attendre l\'administrateur du site à : <a href="mailto:[[Adresse_email_alertes]]">[[Adresse_email_alertes]].\'</a></p>
<p>L\'équipage ShipHeart</p>'
=> '<p>Hello,</p>
<p>The email address associated with your ShipMember account has just been changed at your request:</p>
<p>Old address: [[Old_email]]</p><p>New address: [[New_email]]</p>
<p>If you did not request this change of address, please contact the site administrator immediately at: <a href="mailto:[[Adresse_email_alertes]]">[[Alert_email_address]].\'</a></p>
<p>The ShipHeart team</p>',
'Modifications de votre accès ShipMember'
=> 'Changes to your ShipMember access',
'Connectez-vous'
=> 'Log in',
'Déjà ShipMember ?'
=> 'Already ShipMember?',
'Merci de vous identifier :'
=> 'Thank you for logging in:',
'Email'
=> 'Email',
'Saisissez votre adresse email...'
=> 'Enter your email address...',
'Mot de passe'
=> 'Password',
'Saisissez votre mot de passe...'
=> 'Enter your password...',
'Valider'
=> 'Confirm',
'Générer un nouveau mot de passe'
=> 'Generate a new password',
'Pas encore ShipMember ?'
=> 'Not a ShipMember yet?',
'Merci de renseigner vos coordonnées ; votre espace ShipMember sera créé immédiatement :'
=> 'Please fill in your details; your ShipMember account will be created immediately.',
'Prénom'
=> 'First name',
'Nom'
=> 'Last name',
'Entreprise'
=> 'Company',
'Numéro et rue'
=> 'Number and street',
'Numéro et nom de voie, bâtiment, appartement, lotissement, ...'
=> 'Number and name of lane, building, flat, housing estate,...',
'Code postal'
=> 'Postcode',
'Ville'
=> 'City',
'Pays'
=> 'Country',
'Téléphone'
=> 'Phone',
'Mon espace ShipMember'
=> 'My ShipMember account',
'Activation de mon compte'
=> 'Activation of my account',
'Votre compte n\'a pas encore été activé. Pour cela, merci de changer votre mot de passe provisoire ci-dessous.'
=> 'Your account has not yet been activated. Please change your temporary password below.',
'Nouveau mot de passe'
=> 'New password',
'Entre 6 et 20 caractères, et être composé exclusivement de minuscules, majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.'
=> 'Between 6 and 20 characters, and must consist exclusively of lower-case letters, upper-case letters, numbers or the following special characters _-!*=.',
'Nouveau mot de passe (2)'
=> 'New password (2)',
'Saisissez à nouveau votre nouveau mot de passe...'
=> 'Re-enter your new password...',
'Générer un nouveau mot de passe provisoire'
=> 'Generate a new temporary password',
'Renseignez votre adresse email puis confirmez votre demande. <br />Si votre adresse existe bien dans la liste des ShipMembers, un email vous sera adressé immédiatement avec un nouveau mot de passe provisoire.'
=> 'Fill in your email address and confirm your request.<br />If your address exists in the ShipMembers list, an email will be sent to you immediately with a new temporary password.',
'Attention : dès validation, seul ce nouveau mot de passe provisoire sera valide pour vous connecter. Si vous n\'avez pas reçu cet email dans les prochaines minutes, merci de vérifier s\'il ne se trouve pas dans vos courriers indésirables. '
=> 'Caution: as soon as you confirm, only this new temporary password will be valid to connect you. If you have not received this email within the next few minutes, please check your spam folder.',
'Valider votre saisie...'
=> 'Confirm your entry...',
'Bienvenue dans votre espace ShipMember !'
=> 'Welcome to your ShipMember area !',
'Vous trouverez ici toutes les informations que nous conservons vous concernant. Notre objectif est de ne conserver que celles nécessaires au traitement de vos commandes et, surtout, vous permettant de profiter pleinement de toutes les fonctions de votre ShipHeart.'
=> 'You\'ll find here all the information we keep about you. Our aim is to keep only the information necessary to process your orders and, above all, to allow you to take full advantage of all the functions of your ShipHeart.',
'Enfin, nous vous rappelons que Koriolan ne diffuse et ne diffusera jamais la moindre de ces informations à d\'autres sociétés. Pour plus de précisions sur le traitement de vos données personnelles, n\'hésitez pas à consulter nos mentions légales accessibles en bas de cette page.'
=> 'Finally, we would like to remind you that Koriolan does not and will never distribute any of this information to other companies. For more information on the processing of your personal data, please consult our legal notice at the bottom of this page.',
'Voir les informations liées à votre compte ShipMember...'
=> 'View your ShipMember account information...',
'Mes informations'
=> 'My information',
'Accéder à mon bateau...'
=> 'Getting to my boat...',
'Mon bateau'
=> 'My boat',
'Fermer votre session...'
=> 'Close your session...',
'Déconnexion'
=> 'Logout',
'Numéro de ShipMember'
=> 'ShipMember number',
'Accéder au menu de modification de vos informations...'
=> 'Go to the menu for changing your details...',
'Modifier'
=> 'Edit',
'Retour à mon espace ShipMember...'
=> 'Back to my ShipMember account...',
'Retour'
=> 'Back',
'Modifier mes informations'
=> 'Edit my details',
'Si vous souhaitez modifier votre mot de passe, entrez votre nouveau mot de passe <u>deux fois</u> ci-dessous. Sinon, laissez ces deux champs vides.'
=> 'If you wish to change your password, enter your new password <u>twice</u> below. Otherwise, leave these two fields blank.',
'Saisissez votre nouveau mot de passe...'
=> 'Enter your new password...',
'Annuler la saisie...'
=> 'Cancel your entry...',
'Annuler'
=> 'Cancel',
'Accès à mes bateaux'
=> 'Access to my boats',
'Accès à mon bateau'
=> 'Access to my boat',
'Vous n\'avez pas encore de ShipHeart activé.'
=> 'You do not yet have a ShipHeart activated.',
'Mais dès que ce sera le cas, vous trouverez ici l\'accès à votre ou vos bateaux.'
=> 'But as soon as that happens, you’ll find access to your boat or boats here.',
'Pour chacun d\'eux, vous visualiserez l\'état de tous les circuits, leur consommation, le niveau des réservoirs et des batteries, mais aussi toutes les valeurs de vos capteurs : températures, pression atmosphérique, humidité, position géographique, etc... <br />Vous aurez également accès aux courbes historiques de toutes ces valeurs.'
=> 'For each one, you will be able to view the status of all circuits, their power consumption, the levels of the tanks and batteries, as well as all the readings from your sensors: temperatures, atmospheric pressure, humidity, geographical position, etc... <br />You will also have access to historical trends for all these readings.',
'C\'est également ici que vous pourrez créer des profils [Propriétaire], [Installateur] ou [Skipper] afin de donner accès de façon contrôlée à votre ou à vos bateaux. Sans aucune limite !'
=> 'This is also where you can create [Owner], [Installer] or [Skipper] profiles to grant controlled access to your boat or boats. There are no limits!',
'Revenir à mon espace ShipMember...'
=> 'Back to my ShipMember dashboard...',
'ShipHeart by Koriolan, la première centrale de vie à bord pour les bateaux de plaisance'
=> 'ShipHeart by Koriolan, the first on-board life support system for pleasure craft',
'Retour à l\'accueil'
=> 'Back to home page...',
'Switch to English...'
=> 'Revenir en français...',
'Accès validé pour '
=> 'Access granted to ',
'ShipHeart ™ est une marque de Koriolan'
=> 'ShipHeart™ is a brand of Koriolan',
=> 'Getting to my boat...',
'Accéder à notre site Koriolan'
=> 'Visit our Koriolan website',
=> 'Visit our Koriolan website',
'Accéder au menu de modification de vos informations...'
=> 'Go to the menu for changing your details...',
'Accès à mes bateaux'
=> 'Access to my boats',
'Accès à mon bateau'
=> 'Access to my boat',
'Accès validé pour '
=> 'Access granted to ',
'Activation de mon compte'
=> 'Activation of my account',
'Annuler'
=> 'Cancel',
'Annuler la saisie...'
=> 'Cancel your entry...',
'Attention : dès validation, seul ce nouveau mot de passe provisoire sera valide pour vous connecter. Si vous n\'avez pas reçu cet email dans les prochaines minutes, merci de vérifier s\'il ne se trouve pas dans vos courriers indésirables. '
=> 'Caution: as soon as you confirm, only this new temporary password will be valid to connect you. If you have not received this email within the next few minutes, please check your spam folder.',
'Bienvenue !'
=> 'Welcome!',
'Bienvenue dans votre espace ShipMember !'
=> 'Welcome to your ShipMember area !',
'<p>Bonjour,</p>
<p>L\'adresse email associée à votre compte ShipMember vient d\'être modifiée à votre demande :</p>
<p>Ancienne adresse : [[Old_email]]</p><p>Nouvelle adresse : [[New_email]]</p>
<p>Si vous n\'êtes pas à l\'origine de ce changement d\'adresse, merci de contacter sans attendre l\'administrateur du site à : <a href="mailto:[[Adresse_email_alertes]]">[[Adresse_email_alertes]]</a></p>
<p>L\'équipage ShipHeart</p>'
=> '<p>Hello,</p>
<p>The email address associated with your ShipMember account has just been changed at your request:</p>
<p>Old address: [[Old_email]]</p><p>New address: [[New_email]]</p>
<p>If you did not request this change of address, please contact the site administrator immediately at: <a href="mailto:[[Adresse_email_alertes]]">[[Adresse_email_alertes]]</a></p>
<p>The ShipHeart team</p>',
'<p>Bonjour,</p>
<p>Le mot de passe de votre compte ShipMember vient d\'être réinitialisé à votre demande.</p>
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href="https://[[Url_site]]">[[Url_site]]</a> pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*).</p>
<p>Bienvenue à nouveau parmi nous !</p>
<p>L\'équipage ShipHeart</p>
<p> </p>
<p style="font-size: 0.8em;">(*) L\'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d\'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.</p>'
=> '<p>Hello,</p>
<p>The password for your ShipMember account has just been reset at your request.</p>
<p>Name: [[Prenom]] [[Nom]]</p>
<p>Email: [[Email]]</p>
<p>Temporary password: [[Password]]</p>
<p>Just one more click: Log in to <a href="https://[[Url_site]]">[[Url_site]]</a> to activate your ShipMember account by changing your temporary password (*).</p>
<p>Welcome back!</p>
<p>The ShipHeart team</p>
<p> </p>
<p style="font-size: 0.8em;">(*) Activation must be completed by [[Date_maxi_activation]]. But don’t worry; if you don’t manage to do so by then, you can always request a new temporary password.</p>',
'C\'est également ici que vous pourrez créer des profils [Propriétaire], [Installateur] ou [Skipper] afin de donner accès de façon contrôlée à votre ou à vos bateaux. Sans aucune limite !'
=> 'This is also where you can create [Owner], [Installer] or [Skipper] profiles to grant controlled access to your boat or boats. There are no limits!',
'Code postal'
=> 'Postcode',
'Connectez-vous'
=> 'Log in',
'Déconnexion'
=> 'Logout',
'Déjà ShipMember ?'
=> 'Already ShipMember?',
'Désolé, votre compte n\'a pas été activé dans le délai maximal.<br />Vous pouvez demander la génération d\'un nouveau mot de passe provisoire en cliquant sur le bouton ci-dessous. Il vous sera adressé immédiatement par email.'
=> 'Sorry, your account has not been activated within the maximum time limit.<br />You can request a new temporary password by clicking the button below. It will be sent to you immediately by email.',
'Email'
=> 'Email',
'[Email] est déjà utilisée par un ShipMember.<br />Si vous êtes le propriétaire de cette adresse, merci de vous connecter avec cette adresse. <br />Sinon, merci de choisir une autre adresse.'
=> '[Email] is already in use by a ShipMember.<br />If you are the owner of this email address, please log in using it. <br />Otherwise, please choose a different email address.',
'[Email] est invalide !'
=> '[Email] is invalid!',
'Enfin, nous vous rappelons que Koriolan ne diffuse et ne diffusera jamais la moindre de ces informations à d\'autres sociétés. Pour plus de précisions sur le traitement de vos données personnelles, n\'hésitez pas à consulter nos mentions légales accessibles en bas de cette page.'
=> 'Finally, we would like to remind you that Koriolan does not and will never distribute any of this information to other companies. For more information on the processing of your personal data, please consult our legal notice at the bottom of this page.',
'Entre 6 et 20 caractères, et être composé exclusivement de minuscules, majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.'
=> 'Between 6 and 20 characters, and must consist exclusively of lower-case letters, upper-case letters, numbers or the following special characters _-!*=.',
'Entreprise'
=> 'Company',
'<p>Félicitations !</p>
<p>Votre compte ShipMember est créé, vous y êtes presque.</p>
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href="https://[[Url_site]]">[[Url_site]]</a> pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.</p>
<p>Et ensuite, où que vous soyez et dès que votre ShipHeart est installé, accédez à votre bateau via votre accès privilégié ShipMember !</p>
<p> </p>
<p>Bienvenue parmi nous !</p>
<p>L\'équipage ShipHeart</p>
<p> </p>
<p style="font-size: 0.8em;">(*) L\'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d\'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.</p>'
=> '<p>Congratulations!</p>
<p>Your ShipMember account has been created – you’re almost there.</p>
<p>Name: [[Prenom]] [[Nom]]</p>
<p>Email: [[Email]]</p>
<p>Temporary password: [[Password]]</p>
<p>Just one more click: Log in to <a href="https://[[Url_site]]">[[Url_site]]</a> to verify your ShipMember account by changing your temporary password (*). This is an important security measure that should not be overlooked.</p>
<p>And then, wherever you are and as soon as your ShipHeart is installed, access your boat via your exclusive ShipMember account!</p>
<p> </p>
<p>Welcome on board!</p>
<p>The ShipHeart crew</p>
<p> </p>
<p style="font-size: 0.8em;">(*) Activation must be completed by [[Date_maxi_activation]]. But don’t worry; if you don’t manage to do so by then, you can always request a new temporary password.</p>',
'Félicitations : votre compte est maintenant activé et vous êtes d\'ores et déjà connecté.e.'
=> 'Congratulations: your account is now active and you\'re already logged in.',
'Fermer votre session...'
=> 'Close your session...',
'Générer un nouveau mot de passe'
=> 'Generate a new password',
'Générer un nouveau mot de passe provisoire'
=> 'Generate a new temporary password',
'Le mot de passe renseigné n\'est pas conforme. Pour la sécurité de vos données, il doit contenir entre 6 et 20 caractères, et être composé exclusivement de minuscules, de majuscules, de chiffres ou des caractères spéciaux suivants _-!*=.'
=> 'The password you have entered is not valid. To ensure the security of your data, it must contain between 6 and 20 characters, and must consist exclusively of lower-case letters, upper-case letters, numbers or the following special characters _-!*=.',
'Les deux mots de passe saisis doivent être identiques.'
=> 'Both passwords shall be the same.',
'Mais dès que ce sera le cas, vous trouverez ici l\'accès à votre ou vos bateaux.'
=> 'But as soon as that happens, you’ll find access to your boat or boats here.',
'Mentions légales'
=> 'Legal notices',
=> 'Legal notices',
'Merci de renseigner vos coordonnées ; votre espace ShipMember sera créé immédiatement :'
=> 'Please fill in your details; your ShipMember account will be created immediately.',
'Merci de vous identifier :'
=> 'Please log in:',
'Mes informations'
=> 'My information',
'Modifications de votre accès ShipMember'
=> 'Changes to your ShipMember access',
'Modifier'
=> 'Edit',
'Modifier mes informations'
=> 'Edit my details',
'Mon bateau'
=> 'My boat',
'Mon espace ShipMember'
=> 'My ShipMember account',
'Mot de passe'
=> 'Password',
'Nom'
=> 'Last name',
'Nouveau mot de passe'
=> 'New password',
'Nouveau mot de passe (2)'
=> 'New password (2)',
'Numéro de ShipMember'
=> 'ShipMember number',
'Numéro et nom de voie, bâtiment, appartement, lotissement, ...'
=> 'Number and name of street, building, flat, housing estate,...',
'Numéro et rue'
=> 'Number and street',
'Pas encore ShipMember ?'
=> 'Not a ShipMember yet?',
'Pays'
=> 'Country',
'Pour chacun d\'eux, vous visualiserez l\'état de tous les circuits, leur consommation, le niveau des réservoirs et des batteries, mais aussi toutes les valeurs de vos capteurs : températures, pression atmosphérique, humidité, position géographique, etc... <br />Vous aurez également accès aux courbes historiques de toutes ces valeurs.'
=> 'For each one, you will be able to view the status of all circuits, their power consumption, the levels of the tanks and batteries, as well as all the readings from your sensors: temperatures, atmospheric pressure, humidity, geographical position, etc... <br />You will also have access to historical trends for all these readings.',
'Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire.'
=> 'For safety reasons, your new password can\'t be the same as the temporary password.',
'Prénom'
=> 'First name',
'Renseignez votre adresse email puis confirmez votre demande. <br />Si votre adresse existe bien dans la liste des ShipMembers, un email vous sera adressé immédiatement avec un nouveau mot de passe provisoire.'
=> 'Fill in your email address and confirm your request.<br />If your address exists in the ShipMembers list, an email will be sent to you immediately with a new temporary password.',
'Retour'
=> 'Back',
'Retour à l\'accueil'
=> 'Back to home page...',
'Retour à mon espace ShipMember...'
=> 'Back to my ShipMember account...',
'Revenir à mon espace ShipMember...'
=> 'Back to my ShipMember dashboard...',
'Saisissez à nouveau votre nouveau mot de passe...'
=> 'Re-enter your new password...',
'Saisissez votre adresse email...'
=> 'Enter your email address...',
'Saisissez votre mot de passe...'
=> 'Enter your password...',
'Saisissez votre nouveau mot de passe...'
=> 'Enter your new password...',
'ShipHeart by Koriolan, la première centrale de vie à bord pour les bateaux de plaisance'
=> 'ShipHeart by Koriolan, the first on-board life support system for pleasure craft',
'ShipHeart ™ est une marque de Koriolan'
=> 'ShipHeart™ is a brand of Koriolan',
'Si vous souhaitez modifier votre mot de passe, entrez votre nouveau mot de passe <u>deux fois</u> ci-dessous. Sinon, laissez ces deux champs vides.'
=> 'If you wish to change your password, enter your new password <u>twice</u> below. Otherwise, leave these two fields blank.',
'Switch to English...'
=> 'Revenir en français...',
'Téléphone'
=> 'Phone',
'Un email vient d\'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec les informations relatives à votre inscription.'
=> 'An email has just been sent to [[Prenom]] [[Nom]] ([[Email]]) containing details of your registration.',
'Un email vient d\'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec un mot de passe provisoire.'
=> 'An email has just been sent to [[Prenom]] [[Nom]] ([[Email]]) containing a temporary password.',
'Valider'
=> 'Confirm',
'Valider votre saisie...'
=> 'Confirm your entry...',
'Ville'
=> 'City',
'Voir les informations liées à votre compte ShipMember...'
=> 'View your ShipMember account information...',
'Votre accès ShipMember - Un dernier clic pour accéder à votre bateau !'
=> 'Your ShipMember login – Just one more click to access your boat!',
'Votre compte n\'a pas encore été activé. Pour cela, merci de changer votre mot de passe provisoire ci-dessous.'
=> 'Your account has not yet been activated. Please change your temporary password below.',
'Votre demande concernant votre accès ShipMember'
=> 'Your enquiry regarding your ShipMember access',
'Vous n\'avez pas encore de ShipHeart activé.'
=> 'You do not yet have a ShipHeart activated.',
'Vous trouverez ici toutes les informations que nous conservons vous concernant. Notre objectif est de ne conserver que celles nécessaires au traitement de vos commandes et, surtout, vous permettant de profiter pleinement de toutes les fonctions de votre ShipHeart.'
=> 'You\'ll find here all the information we keep about you. Our aim is to keep only the information necessary to process your orders and, above all, to allow you to take full advantage of all the functions of your ShipHeart.',
];
/*
// OBSOLÈTES au 25/09/2026 à 16:53:47 - plus utilisées dans le code.
// À supprimer manuellement une fois confirmé qu'elles ne servent vraiment plus.
'Bienvenue à bord' => 'Welcome aboard',
*/
+243 -19
View File
@@ -8,18 +8,181 @@
// - Les nouvelles chaînes (trouvées dans le code, absentes de en.php)
// sont ajoutées avec une valeur vide, à traduire manuellement.
// - Les entrées obsolètes (présentes dans en.php, plus utilisées dans le
// code) sont déplacées en fin de fichier, en commentaire - à supprimer à
// la main une fois vérifié qu'elles ne servent vraiment plus à rien.
// code) sont déplacées en fin de fichier, dans un bloc de commentaire.
// Ce bloc est RELU à chaque passage : le script n'y fait qu'AJOUTER les
// entrées nouvellement obsolètes. Une entrée n'en sort que si vous la
// supprimez à la main, ou si son texte est de nouveau utilisé dans le code
// (elle retrouve alors sa traduction).
// - Les entrées sont triées par ordre alphabétique du texte français
// (insensible à la casse et aux accents), pour que deux textes presque
// identiques (typiquement une coquille) se retrouvent l'un à côté de l'autre.
// - Contrôle des espaces réservés : pour chaque traduction non vide, les jetons
// [[Nom]], [[Email]]... et les formats %s, %d... doivent être ceux du texte
// français (ils ne se traduisent pas). Simple avertissement à chaque passage,
// qui ne bloque rien. Les crochets simples ([Owner]...) ne sont PAS contrôlés :
// ce sont des libellés affichés, que l'on traduit.
// - Chaque entrée occupe deux lignes : le texte français, puis '=>' et la
// traduction sur la ligne suivante, précédé d'une tabulation.
//
// Limite connue et acceptée (même limite que qsTr()/gettext) : ne détecte
// que les chaînes littérales simples (pas de concaténation dynamique).
// Pour du texte avec contenu variable, utiliser un espace réservé :
// sprintf(t("Bonjour %s"), $nom)
// plutôt que t("Bonjour " . $nom) - la seconde forme ne sera pas détectée.
//
// Usage : php extraire_traductions.php [racine] (racine par défaut : /var/www)
$racine = "/var/www";
$racine = $argv[1] ?? "/var/www";
$fichier_en = "$racine/config/lang/en.php";
// ----------------------------------------------------------------------------
// Clé de tri : minuscules, sans accents, sans balises HTML, espaces réduits,
// sans ponctuation en tête. Sert UNIQUEMENT à ordonner : le texte réellement
// stocké dans en.php reste celui du code, inchangé.
// ----------------------------------------------------------------------------
function cle_de_tri($texte)
{
static $table = [
'à'=>'a','á'=>'a','â'=>'a','ä'=>'a','ã'=>'a','å'=>'a',
'À'=>'a','Á'=>'a','Â'=>'a','Ä'=>'a','Ã'=>'a','Å'=>'a',
'ç'=>'c','Ç'=>'c',
'è'=>'e','é'=>'e','ê'=>'e','ë'=>'e',
'È'=>'e','É'=>'e','Ê'=>'e','Ë'=>'e',
'ì'=>'i','í'=>'i','î'=>'i','ï'=>'i',
'Ì'=>'i','Í'=>'i','Î'=>'i','Ï'=>'i',
'ñ'=>'n','Ñ'=>'n',
'ò'=>'o','ó'=>'o','ô'=>'o','ö'=>'o','õ'=>'o',
'Ò'=>'o','Ó'=>'o','Ô'=>'o','Ö'=>'o','Õ'=>'o',
'ù'=>'u','ú'=>'u','û'=>'u','ü'=>'u',
'Ù'=>'u','Ú'=>'u','Û'=>'u','Ü'=>'u',
'ý'=>'y','ÿ'=>'y','Ý'=>'y',
'œ'=>'oe','Œ'=>'oe','æ'=>'ae','Æ'=>'ae',
'’'=>"'", '‘'=>"'", "\u{00A0}"=>' ',
];
$cle = strtr($texte, $table);
$cle = strtolower($cle); // ASCII seulement : les accents sont déjà traités
$cle = strip_tags($cle);
$cle = preg_replace('/\s+/', ' ', $cle) ?? $cle;
$cle = trim($cle);
$cle = preg_replace('/^[^\p{L}\p{N}]+/u', '', $cle) ?? $cle;
return $cle;
}
// Tri par texte français ; à clé égale, ordre des octets pour rester déterministe.
function trier_par_texte(array $tableau)
{
$cles = [];
foreach ($tableau as $texte => $_) $cles[$texte] = cle_de_tri((string)$texte);
uksort($tableau, function ($a, $b) use ($cles) {
$c = strcmp($cles[$a], $cles[$b]);
return $c !== 0 ? $c : strcmp((string)$a, (string)$b);
});
return $tableau;
}
// Une entrée sur deux lignes : le texte, puis TAB + '=> traduction,'
function formater_entree($cle, $valeur)
{
return " " . var_export($cle, true) . "\n\t=> " . var_export($valeur, true) . ",\n";
}
// ----------------------------------------------------------------------------
// Contrôle des espaces réservés (jetons [[...]] et formats de sprintf)
// ----------------------------------------------------------------------------
// Jetons [[Nom]] et formats %s, %d, %1$s, %.2f... trouvés dans un texte.
function extraire_jetons($texte)
{
preg_match_all('/\[\[[^\]\r\n]+\]\]/u', $texte, $m1);
$sans_pourcent_litteral = str_replace('%%', '', $texte); // '%%' = un vrai signe %
preg_match_all('/%(?:\d+\$)?[-+0]*\d*(?:\.\d+)?[bcdeEfFgGosuxX]/', $sans_pourcent_litteral, $m2);
return ['reserves' => $m1[0], 'formats' => $m2[0]];
}
// Compare deux listes en ignorant l'ordre. Renvoie [manquants, en trop].
function ecart_jetons(array $attendus, array $obtenus)
{
$manquants = []; $en_trop = [];
$ca = array_count_values($attendus);
$co = array_count_values($obtenus);
foreach ($ca as $j => $n) if (($co[$j] ?? 0) < $n) $manquants[] = $j;
foreach ($co as $j => $n) if (($ca[$j] ?? 0) < $n) $en_trop[] = $j;
return [$manquants, $en_trop];
}
// Renvoie la liste des problèmes (chaînes lisibles) entre un texte français et sa traduction.
function controler_jetons($francais, $traduction)
{
$problemes = [];
$fr = extraire_jetons($francais);
$en = extraire_jetons($traduction);
// 1) Jetons [[...]] : présence seulement, l'ordre est libre.
[$manquants, $en_trop] = ecart_jetons($fr['reserves'], $en['reserves']);
if ($manquants) $problemes[] = "jeton(s) absent(s), ou en nombre insuffisant, dans la traduction : " . implode(' ', $manquants);
if ($en_trop) $problemes[] = "jeton(s) inconnu(s) dans la traduction : " . implode(' ', $en_trop);
// 2) Formats sprintf : on compare le type de conversion (s, d, f...) sans
// la position ni la largeur, pour ne pas signaler un %1$s légitime.
$types = function ($liste) {
return array_map(function ($f) { return substr($f, -1); }, $liste);
};
$tf = $types($fr['formats']);
$te = $types($en['formats']);
[$manquants, $en_trop] = ecart_jetons($tf, $te);
if ($manquants) $problemes[] = "format(s) sprintf absent(s), ou en nombre insuffisant, dans la traduction : %" . implode(' %', $manquants);
if ($en_trop) $problemes[] = "format(s) sprintf en trop dans la traduction : %" . implode(' %', $en_trop);
// 3) Même formats mais dans un autre ordre : dangereux seulement s'ils ne
// sont pas numérotés (%s puis %d), les valeurs seraient alors échangées.
if (!$manquants && !$en_trop && $tf !== $te) {
$numerotes = false;
foreach ($en['formats'] as $f) if (strpos($f, '$') !== false) $numerotes = true;
if (!$numerotes) {
$problemes[] = "formats sprintf dans un autre ordre (" . implode(' ', $en['formats'])
. " au lieu de " . implode(' ', $fr['formats'])
. ") : numéroter avec %1\$s, %2\$s, ou remettre l'ordre du français";
}
}
return $problemes;
}
// Texte français raccourci pour l'affichage (coupé sur un caractère entier).
function abreger($texte, $max = 70)
{
$texte = trim(preg_replace('/\s+/', ' ', $texte));
if (preg_match('/^.{1,' . $max . '}/us', $texte, $m) && $m[0] !== $texte) return $m[0] . '…';
return $texte;
}
// ----------------------------------------------------------------------------
// Relit le bloc des obsolètes (commentaire en fin de fichier) et le renvoie
// sous forme de tableau texte => traduction. Renvoie [] s'il n'y en a pas.
// Lève une exception si le bloc a été modifié à la main de façon à ne plus
// être du PHP valide (par exemple une entrée dont il ne reste que la moitié).
// ----------------------------------------------------------------------------
function lire_obsoletes($fichier)
{
if (!file_exists($fichier)) return [];
$brut = file_get_contents($fichier);
if (!preg_match('/\/\*\n\/\/ OBSOLÈTES[^\n]*\n(.*?)\*\/\s*\z/su', $brut, $m)) return [];
// Les '*/' des textes ont été écrits '*\/' pour ne pas fermer le commentaire :
$entrees = str_replace('*\/', '*/', $m[1]);
$tmp = tempnam(sys_get_temp_dir(), 'obs');
file_put_contents($tmp, "<?php\nreturn [\n" . $entrees . "];\n");
try {
$tableau = include $tmp;
} finally {
unlink($tmp);
}
return is_array($tableau) ? $tableau : [];
}
// ----------------------------------------------------------------------------
// Recherche des appels t("...") dans le code
// ----------------------------------------------------------------------------
$chaines_trouvees = [];
$iterateur = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($racine));
foreach ($iterateur as $fichier) {
@@ -37,21 +200,52 @@ foreach ($iterateur as $fichier) {
$traductions_en = file_exists($fichier_en) ? include $fichier_en : [];
// --- Rapport console, comme avant ---
echo "=== Chaînes utilisées dans le code : " . count($chaines_trouvees) . " ===\n\n";
// Lecture du bloc des obsolètes AVANT toute écriture : si elle échoue, on
// s'arrête sans avoir rien modifié.
try {
$obsoletes_anciens = lire_obsoletes($fichier_en);
} catch (Throwable $e) {
fwrite(STDERR, "ERREUR : le bloc des entrées obsolètes de $fichier_en n'est plus du PHP valide.\n");
fwrite(STDERR, " (" . $e->getMessage() . ")\n");
fwrite(STDERR, "Chaque entrée doit rester sur deux lignes : 'texte' puis, à la ligne, '=> traduction,'.\n");
fwrite(STDERR, "Corrigez le bloc (ou supprimez-le) puis relancez. RIEN n'a été modifié.\n");
exit(1);
}
// --- Bilan ---
$nouvellement_obsoletes = [];
foreach (array_diff(array_keys($traductions_en), array_keys($chaines_trouvees)) as $chaine) {
$nouvellement_obsoletes[$chaine] = $traductions_en[$chaine];
}
// Un texte de nouveau utilisé dans le code, mais présent dans le bloc des
// obsolètes, retrouve sa traduction et sort du bloc :
$reactivees = [];
foreach ($chaines_trouvees as $chaine => $fichiers) {
if (!array_key_exists($chaine, $traductions_en) && array_key_exists($chaine, $obsoletes_anciens)) {
$reactivees[$chaine] = $obsoletes_anciens[$chaine];
unset($obsoletes_anciens[$chaine]);
}
}
$manquantes = [];
foreach ($chaines_trouvees as $chaine => $fichiers) {
if (!array_key_exists($chaine, $traductions_en)) {
if (!array_key_exists($chaine, $traductions_en) && !array_key_exists($chaine, $reactivees)) {
$manquantes[$chaine] = $fichiers[0];
}
}
$obsoletes_total = $obsoletes_anciens + $nouvellement_obsoletes;
echo "=== Chaînes utilisées dans le code : " . count($chaines_trouvees) . " ===\n\n";
echo count($manquantes) . " nouvelle(s) chaîne(s) à traduire.\n";
echo count($nouvellement_obsoletes) . " entrée(s) devenue(s) obsolète(s), ajoutée(s) au bloc en commentaire.\n";
echo count($obsoletes_anciens) . " entrée(s) obsolète(s) déjà en commentaire, conservée(s) (à supprimer à la main).\n";
echo count($reactivees) . " entrée(s) obsolète(s) de nouveau utilisée(s), traduction récupérée.\n\n";
$obsoletes = array_diff(array_keys($traductions_en), array_keys($chaines_trouvees));
echo count($obsoletes) . " entrée(s) obsolète(s), déplacée(s) en commentaire.\n\n";
// --- Régénération de lang/en.php ---
// ----------------------------------------------------------------------------
// Régénération de lang/en.php
// ----------------------------------------------------------------------------
// Sauvegarde de précaution avant d'écraser :
if (file_exists($fichier_en)) {
@@ -59,31 +253,61 @@ if (file_exists($fichier_en)) {
}
// Fusion : traductions existantes conservées pour les chaînes encore utilisées,
// nouvelles chaînes ajoutées avec une valeur vide :
// traductions récupérées du bloc des obsolètes, nouvelles chaînes vides :
$nouveau_tableau = [];
foreach ($chaines_trouvees as $chaine => $fichiers) {
$nouveau_tableau[$chaine] = $traductions_en[$chaine] ?? "";
$nouveau_tableau[$chaine] = $traductions_en[$chaine] ?? $reactivees[$chaine] ?? "";
}
$nouveau_tableau = trier_par_texte($nouveau_tableau);
$contenu = "<?php\n";
$contenu .= "// Fichier régénéré automatiquement par extraire_traductions.php\n";
$contenu .= "// le " . date("d/m/Y à H:i:s") . " - les valeurs vides sont à traduire manuellement.\n";
$contenu .= "// Entrées triées par ordre alphabétique du texte français.\n";
$contenu .= "return [\n";
foreach ($nouveau_tableau as $cle => $valeur) {
$contenu .= " " . var_export($cle, true) . " => " . var_export($valeur, true) . ",\n";
$contenu .= formater_entree($cle, $valeur);
}
$contenu .= "];\n";
if (!empty($obsoletes)) {
$contenu .= "\n/*\n";
$contenu .= "// OBSOLÈTES au " . date("d/m/Y à H:i:s") . " - plus utilisées dans le code.\n";
$contenu .= "// À supprimer manuellement une fois confirmé qu'elles ne servent vraiment plus.\n";
foreach ($obsoletes as $chaine) {
$contenu .= var_export($chaine, true) . " => " . var_export($traductions_en[$chaine], true) . ",\n";
if (!empty($obsoletes_total)) {
$bloc = "";
foreach (trier_par_texte($obsoletes_total) as $cle => $valeur) {
$bloc .= formater_entree($cle, $valeur);
}
// Une séquence '*/' dans un texte fermerait le commentaire trop tôt :
$bloc = str_replace('*/', '*\/', $bloc);
$contenu .= "\n/*\n";
$contenu .= "// OBSOLÈTES (bloc mis à jour le " . date("d/m/Y à H:i:s") . ") - plus utilisées dans le code.\n";
$contenu .= "// Conservées d'un passage à l'autre : à supprimer à la main quand elles ne servent vraiment plus.\n";
$contenu .= $bloc;
$contenu .= "*/\n";
}
file_put_contents($fichier_en, $contenu);
echo "Fichier régénéré : $fichier_en\n";
echo "(sauvegarde de l'ancienne version : $fichier_en.bak)\n";
// ----------------------------------------------------------------------------
// Contrôle des espaces réservés (affiché à CHAQUE passage tant que ce n'est
// pas corrigé ; ne bloque rien)
// ----------------------------------------------------------------------------
$avertissements = [];
foreach ($nouveau_tableau as $francais => $traduction) {
if ($traduction === "") continue; // pas encore traduit
$problemes = controler_jetons((string)$francais, (string)$traduction);
if ($problemes) $avertissements[$francais] = $problemes;
}
echo "\n";
if (empty($avertissements)) {
echo "Espaces réservés ([[...]], %s...) : cohérents dans toutes les traductions.\n";
} else {
echo "ATTENTION : " . count($avertissements) . " traduction(s) dont les espaces réservés diffèrent du français.\n";
echo "Ils ne se traduisent pas : le code cherche les jetons exacts.\n";
foreach ($avertissements as $francais => $problemes) {
echo "\n « " . abreger((string)$francais) . " »\n";
foreach ($problemes as $probleme) echo " - $probleme\n";
}
}
+267 -126
View File
@@ -2,7 +2,7 @@
include "../config/config.php";
Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session et vérifiant que les accès sont autorisés.
Entete_page_html();
//************************************************************************************************************************************
@@ -22,7 +22,7 @@ Entete_page_html();
// Variables de SESSION :
if (!isset($_SESSION['Administration']['page'])) $_SESSION['Administration']['page'] = 'Accueil';
if (!isset($_SESSION['Administration']['ancre'])) $_SESSION['Administration']['ancre'] = "#";
if (!isset($_SESSION['Administration']['questionnaire'])) $_SESSION['Administration']['questionnaire'] = 'Nautic2021';
if (!isset($_SESSION['Administration']['id_shipmember'])) $_SESSION['Administration']['id_shipmember'] = 0;
// Variables GET :
@@ -36,13 +36,13 @@ Entete_page_html();
if (isset($_GET['destination']))
{
$_SESSION['Administration']['page'] = $_GET['destination'];
$_SESSION['display_menu'] = false;
//$_SESSION['display_menu'] = false;
}
if (isset($_GET['ancre']))
{
$_SESSION['Administration']['ancre'] = $_GET['ancre'];
$_SESSION['display_menu'] = false;
//$_SESSION['display_menu'] = false;
}
break;
}
@@ -58,25 +58,28 @@ Entete_page_html();
break;
}
//===================================
case "details_shipmember":
{
if (isset($_GET['id_shipmember']))
{
$_SESSION['Administration']['id_shipmember'] = $_GET['id_shipmember'];
$_SESSION['Administration']['page'] = 'Details_shipmember';
}
break;
}
//===================================
case "changement_type":
{
if (isset($_GET['type']))
{
if (isset($_GET['type']))
{
$_SESSION['type_utilisateur'] = $_GET['type'];
chargement_langue();
}
break;
$_SESSION['type_utilisateur'] = $_GET['type'];
chargement_langue();
}
case "toggle_edit":
{
if ($_SESSION['modifier_texte'] == 0) $_SESSION['modifier_texte'] = 1;
else if ($_SESSION['modifier_texte'] == 1) $_SESSION['modifier_texte'] = 0;
break;
}
break;
}
}
if (!$flag_redirection) header('Location:administration.php');
@@ -94,7 +97,7 @@ Entete_page_html();
//************************************************************************************************************************************
// Protection contre les accès directs :
if ((!$_SESSION['acces_valide']) OR ($_SESSION['shipmember']['Niveau_acces'] < NIVEAU_MINI_ACCES_ADMINISTATEUR)) header('Location:shipmembers.php?action=navigation&destination=Login');
if ((!$_SESSION['acces_valide']) OR ($_SESSION['shipmember']['Niveau_acces'] < NIVEAU_ACCES_MINI_ADMINISTRATEUR)) header('Location:shipmembers.php?action=navigation&destination=Login');
switch ($_SESSION['Administration']['page'])
{
@@ -105,6 +108,122 @@ Entete_page_html();
break;
}
//****************************************************************************************************************************
case "Shipmembers":
{
// Récupération des informations sur les ShipMembers :
$nb_shipmembers = 0;
$requete = 'SELECT * FROM TB_Shipmembers WHERE Validite=1 ORDER BY ID ASC';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$shipmembers[$nb_shipmembers ++] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
break;
}
//****************************************************************************************************************************
case "Details_shipmember":
{
// Modifier les droits d'accès d'un utilisateur
if (isset($_POST['niveau_acces_shipmember']))
{
$na = $_POST['niveau_acces_shipmember'];
if (($na >=NIVEAU_ACCES_MINI) AND ($na <= NIVEAU_ACCES_MAXI))
{
$requete = 'UPDATE TB_Shipmembers SET Niveau_acces=? WHERE ID=?';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $na),
array('i', $_SESSION['Administration']['id_shipmember'])),
__FILE__, __LINE__);
}
}
// Récupération des informations sur le ShipMember :
$requete = 'SELECT *, (SELECT Texte FROM TB_Textes_traduction WHERE ID_TYPE = 1 AND ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=TB_Shipmembers.ID_PAYS) AND ID_LANGUAGES=1) AS Libelle_pays FROM TB_Shipmembers WHERE ID='.$_SESSION['Administration']['id_shipmember'].' ';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$shipmember = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
$requete = '';
// Récupération des informations sur le ou les bateaux accessibles à ce ShipMember :
$nb_bateaux = 0;
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE ID_SHIPMEMBER=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['Administration']['id_shipmember'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$bateaux[$nb_bateaux ++]['Cle_primaire'] = $donnees['ID_Bateau'];
}
Liberation_jeu_de_resultat_bdd($reponse);
// Récupération des informations relatives à chacun des bateaux accessibles :
for ($i=0; $i<$nb_bateaux; $i ++)
{
$requete = 'SELECT * FROM TB_Bateaux WHERE Cle_primaire=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $bateaux[$i]['Cle_primaire'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$bateaux[$i] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
}
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
$message_erreur .= "Code invalide ou déjà utilisé \n";
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
}
// Récupération des liaisons shipmember - bateau
$current_timestamp = date_format(date_create(), 'Y-m-d H:i:s');
$requete = 'SELECT ID_Bateau, ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' AND Validite=1 AND Validite_acces=1 AND Fin_validite>="'.$current_timestamp.'"';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$nb_acces = 0;
// $bateau_shipmember = []
while ($donnees = Recherche_ligne_bdd($reponse)) {
$_SESSION['bateau_shipmember'][$nb_acces++] = $donnees;
}
$_SESSION['acces'] = $nb_acces;
// $_SESSION['acces_valide'] = true;
break;
}
//****************************************************************************************************************************
case "Purge_bdd":
{
@@ -257,58 +376,6 @@ Entete_page_html();
//****************************************************************************************************************************
case "Questionnaires":
{
switch($_SESSION['Administration']['questionnaire'])
{
default:
{
$message_erreur .= "Le questionnaire ".$_SESSION['Administration']['questionnaire']." est inconnu. Le questionnaire en cours est repassé à sa valeur par défaut.";
$_SESSION['Administration']['questionnaire'] = "Nautic2021";
}
case "Nautic2021" :
{
$table_questionnaire = "TB_Nautic2021";
break;
}
}
// Nombre de réponses :
$requete = 'SELECT COUNT(*) AS Nb FROM '.$table_questionnaire.' WHERE Validite=1';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$reponses_questionnaire['Nb'] = $donnees['Nb'];
}
Liberation_jeu_de_resultat_bdd($reponse);
// Dernier enregistrement :
$requete = 'SELECT DATE_FORMAT(Date_creation,"%d/%m/%Y à %H:%i:%s") as Date_creation FROM '.$table_questionnaire.' WHERE Validite=1 ORDER BY Date_creation DESC LIMIT 1';
// echo 'Requête = '.$requete.'<br />';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$reponses_questionnaire['Date_creation'] = $donnees['Date_creation'];
}
Liberation_jeu_de_resultat_bdd($reponse);
// Nombre d'enregistrements par jour :
$nb_jours = 0;
$requete = 'SELECT COUNT(*) as Nb_jours, DATE_FORMAT(Date_creation, "%d-%m-%Y") as Date_creations FROM '.$table_questionnaire.' WHERE Validite=1 GROUP BY DATE_FORMAT(Date_creation, "%Y-%m-%d")';
// echo 'Requête = '.$requete.'<br />';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$reponses_questionnaire['Creations_par_jour'][$nb_jours ++] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
break;
@@ -324,6 +391,7 @@ Entete_page_html();
// Affichage
//************************************************************************************************************************************
Entete_page_html();
//********************************************************************************************************************************
// Affichage principal :
@@ -347,32 +415,16 @@ Entete_page_html();
echo '<h2>ShipMembers et Bateaux</h2>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="shipmembers.php?action=navigation&destination=Administration">ShipMembers</a>';
echo '<a title="" href="administration.php?action=navigation&destination=Shipmembers">ShipMembers</a>';
echo '<a title="" href="bateaux.php?action=navigation&destination=Accueil">Gestion des bateaux</a>';
echo '</div>';
echo '<h2>Site web</h2>';
echo '<div class="boutons_bas_de_page">';
// echo '<a title="" href="administration.php?action=navigation&destination=Commandes">Commandes</a>';
echo '<a title="" href="faq.php?action=navigation&destination=Administration">Faq</a>';
echo '<a title="" href="actualites.php?action=navigation&destination=Administration">Actualités</a>';
echo '<a title="" href="produit_desc.php?action=navigation&destination=Administration">Produits</a>';
echo '<a title="" href="galerie.php?action=navigation&destination=Administration">Galerie photos</a>';
echo '<a title="" href="videos.php?action=navigation&destination=Administration">Videos</a>';
echo '<a title="" href="devis.php?action=navigation&destination=Administration">Devis</a>';
// echo '<a title="" href="administration.php?action=navigation&destination=Questionnaires">Questionnaires</a>';
echo '<a title="" href="textes.php?action=navigation&destination=Accueil">Gestion des textes</a>';
echo '</div>';
echo '<h2>Technique</h2>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="versions.php?action=navigation&destination=Accueil">Gestion des versions</a>';
echo '<a title="" href="cartes.php?action=navigation&destination=Accueil">Gestion des cartes</a>';
echo '<a title="" href="uploads.php?action=navigation&destination=Accueil" onclick="return confirm(\'Vous êtes sur vous voulez traiter les uploads ?\');">Traitement des uploads</a>';
//echo '<a title="" href="c_tech_api.php" onclick="return confirm(\'Etes-vous sûr de vouloir lancer le traitement de l\'API C-Technology ?\');">Traitement de l\'API C-Technology</a>';
//echo '<a title="" href="data_treatment.php" onclick="return confirm(\'Etes-vous sûr de vouloir lancer DATE_TREATMENT.PHP pour traiter les tables [old] ?\');">Traitement des tables OLD</a>';
//echo '<a title="" href="administration.php?action=navigation&destination=Purge_bdd" onclick="return confirm(\'Vous allez faire un purge de la BDD, avancer ?\');">Purge de la BDD</a>';
//echo '<a title="" href="check_payments.php?verbose">Test check factures</a>';
echo '</div>';
echo '<div class="boutons_bas_de_page">';
@@ -384,6 +436,132 @@ Entete_page_html();
break;
}
//************************************************************************************************************************
case "Shipmembers":
{
echo '<div id="shipmembers" class="page_principale">';
echo '<h1>Administration</h1>';
echo '<h2>ShipMembers</h2>';
echo '<table class="shipmember">
<thead>
<tr>
<th>Nom</th>
<th>Entreprise</th>
<th>Telephone</th>
<th>Email</th>
</tr>
</thead>
<tbody>';
for ($i = 0; $i < $nb_shipmembers; $i ++)
{
echo '<tr>
<td>
<a href="administration.php?action=details_shipmember&id_shipmember='.$shipmembers[$i]['ID'].'">
'.$shipmembers[$i]['Prenom'].' '.$shipmembers[$i]['Nom'].'
</a>
</td>
<td>'.$shipmembers[$i]['Entreprise'].'</td>
<td>'.$shipmembers[$i]['Telephone'].'</td>
<td>'.$shipmembers[$i]['Email'].'</td>
</tr>';
}
echo '</tbody>
</table>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="administration.php?action=navigation&destination=Accueil">Retour au menu Administration</a>';
echo '</div>';
echo '</div>';
break;
}
//************************************************************************************************************************
case "Details_shipmember":
{
echo '<div id="details_shipmember" class="page_principale">';
echo '<h1>Administration</h1>';
echo '<h2>ShipMember n° <span class="gras">'.$shipmember['ID'].'</span></h2>';
echo '<table class="shipmember">
<tbody>';
echo '<tr>
<td>Nom complet</td>
<td>'.$shipmember['Prenom'].' '.$shipmember['Nom'].'</td>
</tr>';
echo '<tr>
<td>Entreprise</td>
<td>'.$shipmember['Entreprise'].'</td>
</tr>';
echo '<tr>
<td>Adresse</td>
<td>'.$shipmember['Rue'].' - '.$shipmember['Code_postal'].' '.$shipmember['Ville'].' - '.$shipmember['Libelle_pays'].'</td>
</tr>';
echo '<tr>
<td>Téléphone</td>
<td>'.$shipmember['Telephone'].'</td>
</tr>';
echo '<tr>
<td>Email</td>
<td>'.$shipmember['Email'].'</td>
</tr>';
echo '<tr>
<td>Date création du compte</td>
<td>'.Formatage_date($shipmember['Date_creation_compte']).'</td>
</tr>';
echo '<tr>
<td>Niveau d\'accès</td>
<td> <form method="POST" action="administration.php">
<input name="niveau_acces_shipmember" type="number" max="99" min="0" value="'.$shipmember['Niveau_acces'].'" style="max-width:20%">
<button type="submit" style="font-size: 12px"> Valider </button>
</form>
</td>
</tr>';
echo '<tr>
<td>Bateaux accessibles</td>
<td>';
if ($nb_bateaux == 0) echo '<i>Aucun...</i>';
else
{
for ($i=0; $i<$nb_bateaux; $i ++)
{
echo $bateaux[$i]['Nom'].'<br />';
}
}
echo '</td>
</tr>';
echo '</tbody>
</table>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="administration.php?action=navigation&destination=Shipmembers">Retour à la liste des ShipMembers</a>';
echo '</div>';
echo '</div>';
break;
}
//************************************************************************************************************************
case "Purge_bdd":
{
@@ -414,43 +592,6 @@ Entete_page_html();
//****************************************************************************************************************************
case "Questionnaires":
{
echo '<div id="questionnaires" class="page_principale">';
echo '<h1>Administration</h1>';
echo '<h2>Questionnaire : '.$_SESSION['Administration']['questionnaire'].'</h2>';
// Nb de fiche réponse :
echo '<div class="indicateur">
<div class="libelle_indicateur">Le nombre total de questionnaires enregistrés est : </div>
<div class="valeur_indicateur">'.$reponses_questionnaire['Nb'].'</div>
</div>';
// Date dernière réponse :
echo '<div class="indicateur">
<div class="libelle_indicateur">La date du dernier formulaire rempli est : </div>
<div class="valeur_indicateur">'.$reponses_questionnaire['Date_creation'].'</div>
</div>';
// Nb créations par jour :
echo '<div class="indicateur">';
foreach($reponses_questionnaire['Creations_par_jour'] as $key => $creations)
{
echo '<div class="libelle_indicateur">Le nombre de formulaires saisis le '.$creations['Date_creations'].' est de : </div>
<div class="valeur_indicateur">'.$creations['Nb_jours'].'</div>';
}
echo '</div>';
echo '<div class="boutons_bas_de_page">';
echo '<a class=retour" title="" href="administration.php?action=navigation&destination=Accueil">Retour à l\'accueil</a>';
echo '</div>';
echo '</div>';
break;
}
+7 -6
View File
@@ -2,7 +2,7 @@
include "../config/config.php";
Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session et vérifiant que les accès sont autorisés.
Entete_page_html();
//SELECT TBV.Nom, TBMB.Valeur, TBMB.No_paquet FROM TB_BATEAUX_Mesures_batteries TBMB INNER JOIN TB_BATEAUX_Variables TBV ON TBMB.ID_Variable = TBV.Cle_primaire WHERE TBV.ID_Bateau = 1 AND TBMB.ID_Bateau = 1;
@@ -446,7 +446,7 @@ Entete_page_html();
{
if (!$_SESSION['acces_valide']) break; // Si on n'est pas identifié, on ne peut pas accéder quoi qu'il arrive...
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_MINI_ACCES_ADMINISTATEUR)
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR)
{
$flag_sortie = false; // Si on est administrateur, on a toujours accès....
break;
@@ -508,7 +508,7 @@ Entete_page_html();
$requete .= ' FROM `TB_Bateaux` ';
$requete .= ' WHERE Validite=1 ';
$requete .= $tri_liste;
// echo "Requête = [".$requete."]<br />";
echo "Requête = [ ".$requete."; ]<br />";
$reponse = Requete_preparee_bdd($requete,
array(),
@@ -595,7 +595,7 @@ Entete_page_html();
//---------------------------------------------
// Recherche des droits d'accès au bateau :
//---------------------------------------------
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_MINI_ACCES_ADMINISTATEUR) // Dans le cas des administrateurs, on accorde tous les droits, indépendamment des paramètres du bateau
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR) // Dans le cas des administrateurs, on accorde tous les droits, indépendamment des paramètres du bateau
{
$acces_profil['Creation_profils'] = 1;
$acces_profil['Devalidation_profils'] = 2;
@@ -2131,6 +2131,7 @@ Entete_page_html();
// Affichage
//************************************************************************************************************************************
Entete_page_html();
//********************************************************************************************************************************
// Affichage principal :
@@ -2200,7 +2201,7 @@ Entete_page_html();
echo '<h1>Bateau <span class="gras">'.$bateau['Nom'].'</span></h1>';
echo '<div class="entete_bateau">';
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_MINI_ACCES_ADMINISTATEUR || $acces_profil['Consultation_donnees'] == 2)
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR || $acces_profil['Consultation_donnees'] == 2)
{
echo '<div class="bouton_gestion_acces">';
echo Ajouter_lien_modif_buttons("bateau","details","boutons","acces");
@@ -2253,7 +2254,7 @@ Entete_page_html();
//--------------------------------
// Boutons de haut de page :
echo '<div class="boutons_haut_de_page">';
if ( ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_MINI_ACCES_ADMINISTATEUR) ||
if ( ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR) ||
(($acces_profil['Consultation_donnees'] == 1) ||
($acces_profil['Consultation_donnees'] == 2)) )
{
+31 -10
View File
@@ -33,19 +33,40 @@ Fichier administration.php
}
#Administration #questionnaires .indicateur {
margin: 20px 0px 30px 0px;
}
#Administration #questionnaires .libelle_indicateur {
/* display: inline-block; */
/*--------------------------------------------------*/
#Administration #shipmembers table {
width: 100%;
margin: 20px 0px 50px 0px;
}
#Administration #shipmembers table th {
text-align: center;
padding: 3px 10px;
}
#Administration #shipmembers table td {
border-top: 1px solid var(--gris_tres_tres_pale);
text-align: left;
padding: 3px 10px;
font-size: 0.9em;
}
#Administration #shipmembers table td:nth-child(3) {
text-align: center;
}
#Administration #questionnaires .valeur_indicateur {
/* display: inline-block; */
#Administration #shipmembers table td a {
margin: 0px;
padding: 0px;
}
/*--------------------------------------------------*/
#Administration #details_shipmember table {
width: 100%;
text-align: center;
font-weight: bold;
font-size: 2em;
margin: 20px 0px 50px 0px;
}
#Administration #details_shipmember table td {
border-top: 1px solid var(--gris_tres_tres_pale);
text-align: left;
padding: 3px 10px;
font-size: 0.9em;
}
-37
View File
@@ -131,43 +131,6 @@ Fichier shipmembers.php
text-align: justify;
}
/*--------------------------------------------------*/
#Shipmembers #administration table {
width: 100%;
margin: 20px 0px 50px 0px;
}
#Shipmembers #administration table th {
text-align: center;
padding: 3px 10px;
}
#Shipmembers #administration table td {
border-top: 1px solid var(--gris_tres_tres_pale);
text-align: left;
padding: 3px 10px;
font-size: 0.9em;
}
#Shipmembers #administration table td:nth-child(3) {
text-align: center;
}
#Shipmembers #administration table td a {
margin: 0px;
padding: 0px;
}
/*--------------------------------------------------*/
#Shipmembers #details table {
width: 100%;
margin: 20px 0px 50px 0px;
}
#Shipmembers #details table td {
border-top: 1px solid var(--gris_tres_tres_pale);
text-align: left;
padding: 3px 10px;
font-size: 0.9em;
}
/*--------------------------------------------------*/
#Shipmembers #profil form {
+63 -298
View File
@@ -4,8 +4,6 @@ include "../config/config.php";
Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session et vérifiant que les accès sont autorisés.
//************************************************************************************************************************************
// Initialisation des variables globales
//************************************************************************************************************************************
@@ -26,7 +24,19 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Variables GET :
if (isset($_GET['code_acces']) && (!isset($_SESSION['code_acces']) || $_SESSION['code_acces']== '')) $_SESSION['code_acces'] = $_GET['code_acces'];
// Le code d'accès ne doit contenir que ce que produit le générateur (bateaux.php) : chiffres et
// lettres, 6 caractères aujourd'hui (colonne Code : 20 au maximum). Il est ensuite inséré dans des
// requêtes SQL : tout autre caractère est refusé. is_string() écarte ?code_acces[]=... (un tableau
// ferait planter preg_match) ; \z (et non $) refuse aussi un retour à la ligne final.
function Code_acces_est_valide($valeur)
{
return is_string($valeur) && preg_match('/^[0-9A-Za-z]{1,20}\z/', $valeur) === 1;
}
// Une valeur déjà présente en session (ouverte avant ce contrôle, ou par une autre voie) est vérifiée aussi :
if (isset($_SESSION['code_acces']) && !Code_acces_est_valide($_SESSION['code_acces'])) $_SESSION['code_acces'] = '';
if (isset($_GET['code_acces']) && Code_acces_est_valide($_GET['code_acces']) && (!isset($_SESSION['code_acces']) || $_SESSION['code_acces']== '')) $_SESSION['code_acces'] = $_GET['code_acces'];
if (isset($_GET['action']))
{
@@ -48,15 +58,6 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
break;
}
//-----------------------------------
case "toggle_edit":
{
if ($_SESSION['modifier_texte'] == 0) $_SESSION['modifier_texte'] = 1;
else if ($_SESSION['modifier_texte'] == 1) $_SESSION['modifier_texte'] = 0;
break;
}
//-----------------------------------
case "deconnexion" :
{
@@ -79,18 +80,6 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
break;
}
//-----------------------------------
case "details_shipmember":
{
if (isset($_GET['id_shipmember']))
{
$_SESSION['Shipmembers']['ID'] = $_GET['id_shipmember'];
$_SESSION['Shipmembers']['page'] = 'Details';
}
break;
}
//-----------------------------------
case "generation_mdp":
{
@@ -178,7 +167,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Création du ShipMember :
$requete = 'INSERT INTO TB_Shipmembers(Nom, Prenom, Entreprise, Rue, Code_postal, Ville, ID_PAYS, Telephone, Email, ID_LANGUAGES, ID_Stripe, Mdp, Date_creation_compte) VALUES (?,?,?,?,?,?,?,?,?,(SELECT ID FROM TB_Langues WHERE Prefix=?),?,?,?)';
$requete = 'INSERT INTO TB_Shipmembers(Nom, Prenom, Entreprise, Rue, Code_postal, Ville, ID_PAYS, Telephone, Email, ID_LANGUAGES, Mdp, Date_creation_compte) VALUES (?,?,?,?,?,?,?,?,?,(SELECT ID FROM TB_Langues WHERE Prefix=?),?,?,?)';
Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['shipmember']['Nom']),
@@ -228,7 +217,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href=\"https://shipheart.tech\">ShipHeart.tech</a> pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.</p>
<p>Plus qu’un clic : Connectez-vous sur <a href=\"https://[[Url_site]]\">[[Url_site]]</a> pour valider votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger.</p>
<p>Et ensuite, où que vous soyez et dès que votre ShipHeart est installé, accédez à votre bateau via votre accès privilégié ShipMember !</p>
<p> </p>
<p>Bienvenue parmi nous !</p>
@@ -241,6 +230,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$texte_email = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $texte_email);
$texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email);
$texte_email = str_replace("[[Password]]", $password, $texte_email);
$texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email);
$texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email);
Envoi_email('', $_SESSION['shipmember']['Email'],
@@ -263,15 +253,15 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur :
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
Liberation_jeu_de_resultat_bdd($reponse);
if ($donnees == NULL) $message_erreur .= "Code invalide ou déjà utilisé \n";
else
{
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
}
$_SESSION['code_acces'] = '';
}
@@ -307,7 +297,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$email = Protection_mysql(strtolower($_POST['email_validation'])); // On ajoute les caractères d'échappement sur l'email qui sera envoyé dans la requête
$mdp = $_POST['mdp_validation']; // Le MDP n'est pas envoyé...
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, ID_Stripe, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Email=? ';
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Email=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('s', $email)),
@@ -349,7 +339,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
__FILE__, __LINE__);
// Recherche des informations du ShipMember :
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, ID_Stripe, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire'])),
@@ -376,8 +366,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
@@ -385,8 +375,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember = '.$_SESSION['shipmember']['Cle_primaire'].' WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
@@ -429,7 +419,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$new_mdp = $_POST['Mot_de_passe_1'];
// Recherche du MDP existant de l'adhérent :
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, ID_Stripe, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire'])),
@@ -439,7 +429,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Vérification que le mot de passe est changé :
// if (Hash_Mdp($new_mdp) == $shipmember['Mdp']) $message_erreur .= nl2br(Recuperation_texte('all','all','erreurs','pwd_egal_temporaire'));
if (password_verify($new_mdp, $shipmember['Mdp'])) $message_erreur .= nl2br(t("Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire."));
if (password_verify($new_mdp, $shipmember['Mdp'])) $message_erreur .= t("Pour des raisons de sécurité, votre nouveau mot de passe ne peut pas être identique au mot de passe provisoire.");
else
{
// Mise à jour du nouveau mot de passe :
@@ -502,16 +492,20 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
{
$nb_emails_valides = 0;
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, ID_Stripe, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Validite=1 AND Email=? ';
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE Validite=1 AND Email=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['shipmember']['Email'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$_SESSION['shipmember']['Cle_primaire'] = $donnees['Cle_primaire'];
$_SESSION['shipmember']['Prenom'] = $donnees['Prenom'];
$_SESSION['shipmember']['Nom'] = $donnees['Nom'];
// Ces informations ne servent qu'à composer l'e-mail : NE PAS écrire
// $_SESSION['shipmember'], pour ne pas laisser en session l'identité d'un
// compte QUE L'ON N'A PAS ENCORE AUTHENTIFIÉ (n'importe qui peut demander la
// réinitialisation du mot de passe d'une adresse qui n'est pas la sienne).
$cle_primaire_demande = $donnees['Cle_primaire'];
$prenom_demande = $donnees['Prenom'];
$nom_demande = $donnees['Nom'];
$nb_emails_valides ++;
}
Liberation_jeu_de_resultat_bdd($reponse);
@@ -525,20 +519,20 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$requete = 'DELETE FROM TB_Activation WHERE ID_SHIPMEMBERS=?';
Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire'])),
array('i', $cle_primaire_demande)),
__FILE__, __LINE__);
$requete = 'UPDATE TB_Shipmembers SET Mdp=? WHERE ID=?';
Requete_preparee_bdd($requete,
array(
array('s', password_hash($password, PASSWORD_DEFAULT)),
array('i', $_SESSION['shipmember']['Cle_primaire'])),
array('i', $cle_primaire_demande)),
__FILE__, __LINE__);
$requete = 'INSERT INTO TB_Activation(ID_SHIPMEMBERS) VALUES (?)';
Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['shipmember']['Cle_primaire'])),
array('s', $cle_primaire_demande)),
__FILE__, __LINE__);
// Mémorisation dans l'historique de la connexion :
@@ -547,9 +541,9 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
array(
array('i', SYSTEME),
array('i', SYSTEME_REINIT_MDP_USER),
array('i', $_SESSION['shipmember']['Cle_primaire']),
array('i', $cle_primaire_demande),
array('i', 0),
array('s', 'Réinitialisation du mot de passe de '.$_SESSION['shipmember']['Prenom'].' '.$_SESSION['shipmember']['Prenom'].' [N° '.$_SESSION['shipmember']['Cle_primaire'].']')),
array('s', 'Réinitialisation du mot de passe de '.$prenom_demande.' '.$prenom_demande.' [N° '.$cle_primaire_demande.']')),
__FILE__, __LINE__);
@@ -565,39 +559,39 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
<p>Nom : [[Prenom]] [[Nom]]</p>
<p>Email : [[Email]]</p>
<p>Mot de passe provisoire : [[Password]]</p>
<p>Plus qu’un clic : Connectez-vous sur <a href=\"https://shipheart.tech\">ShipHeart.tech</a> pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*). C’est une garantie de sécurité à ne pas négliger...</p>
<p>Plus qu’un clic : Connectez-vous sur <a href=\"https://[[Url_site]]\">[[Url_site]]</a> pour activer votre compte ShipMember en modifiant votre mot de passe provisoire (*).</p>
<p>Bienvenue à nouveau parmi nous !</p>
<p>L'équipage ShipHeart</p>
<p> </p>
<p style=\"font-size: 0.8em;\">(*) L'activation devra être faite avant le [[Date_maxi_activation]]. Mais pas d'inquiétude ; si vous ne le faites pas avant, vous pourrez toujours demander un nouveau mot de passe provisoire.</p>");
// Mise à jour des parametres du texte :
$texte_email = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $texte_email);
$texte_email = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $texte_email);
$texte_email = str_replace("[[Prenom]]", $prenom_demande, $texte_email);
$texte_email = str_replace("[[Nom]]", $nom_demande, $texte_email);
$texte_email = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $texte_email);
$texte_email = str_replace("[[Password]]", $password, $texte_email);
$texte_email = str_replace("[[Url_site]]", URL_SITE, $texte_email);
$texte_email = str_replace("[[Date_maxi_activation]]", $date_maxi_activation, $texte_email);
Envoi_email('', $_SESSION['shipmember']['Email'],
t("Votre demande concernant votre accès ShipMember"),
$texte_email,
"ShipHeart by Koriolan", $_SESSION['Config__Adresse_email_shipmember'], '');
//Fin.........................................................................
//............................................................................
// Message d'information :
$message = t("Un email vient d'être envoyé à [[Prenom]] [[Nom]] ([[Email]]) avec les informations relatives à votre inscription.")."<br />";
$message = str_replace("[[Prenom]]", $_SESSION['shipmember']['Prenom'], $message);
$message = str_replace("[[Nom]]", $_SESSION['shipmember']['Nom'], $message);
$message = str_replace("[[Prenom]]", $prenom_demande, $message);
$message = str_replace("[[Nom]]", $nom_demande, $message);
$message = str_replace("[[Email]]", $_SESSION['shipmember']['Email'], $message);
$message_information .= $message;
//Fin.........................................................................
// Récupération des liaisons shipmember - bateau
//.........................................................................
// Récupération des liaisons shipmember - bateau
$current_timestamp = date_format(date_create(), 'Y-m-d H:i:s');
$requete = 'SELECT ID_Bateau, ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' AND Validite=1 AND Validite_acces=1 AND Fin_validite>="'.$current_timestamp.'"';
$requete = 'SELECT ID_Bateau, ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE ID_Shipmember='.$cle_primaire_demande.' AND Validite=1 AND Validite_acces=1 AND Fin_validite>="'.$current_timestamp.'"';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$nb_acces = 0;
// $bateau_shipmember = []
@@ -606,8 +600,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
}
$_SESSION['acces'] = $nb_acces;
$_SESSION['acces_valide'] = true;
$_SESSION['Shipmembers']['page'] = "Accueil";
// $_SESSION['acces_valide'] = true;
// $_SESSION['Shipmembers']['page'] = "Accueil";
}
$_SESSION['Shipmembers']['page'] = "Login";
@@ -743,7 +737,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$texte_email = t("<p>Bonjour,</p>
<p>L'adresse email associée à votre compte ShipMember vient d'être modifiée à votre demande :</p>
<p>Ancienne adresse : [[Old_email]]</p><p>Nouvelle adresse : [[New_email]]</p>
<p>Si vous n'êtes pas à l'origine de ce changement d'adresse, merci de contacter sans attendre l'administrateur du site à : <a href=\"mailto:[[Adresse_email_alertes]]\">[[Adresse_email_alertes]].'</a></p>
<p>Si vous n'êtes pas à l'origine de ce changement d'adresse, merci de contacter sans attendre l'administrateur du site à : <a href=\"mailto:[[Adresse_email_alertes]]\">[[Adresse_email_alertes]]</a></p>
<p>L'équipage ShipHeart</p>");
// Mise à jour des parametres du texte :
@@ -830,7 +824,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
case "Accueil":
{
// Mise à jour des données du ShipMember (au cas où) :
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, ID_Stripe, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$requete = 'SELECT ID AS Cle_primaire, Validite, Nom, Prenom, Entreprise, Rue, Code_postal, Ville, Telephone, Email, Mdp, Date_creation_compte, Niveau_acces, ID_PAYS AS ID_Pays, ID_LANGUAGES, (SELECT 1 FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Compte_a_activer, (SELECT Date_creation_mdp FROM TB_Activation WHERE ID_SHIPMEMBERS=ID) AS Date_creation_mdp FROM TB_Shipmembers WHERE ID=?';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['shipmember']['Cle_primaire'])),
@@ -845,8 +839,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
@@ -854,8 +848,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
@@ -878,116 +872,9 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
break;
}
//****************************************************************************************************************************
case "Administration":
{
// Protection contre les accès directs :
if ((!$_SESSION['acces_valide']) OR ($_SESSION['shipmember']['Niveau_acces'] < NIVEAU_MINI_ACCES_ADMINISTATEUR)) header('Location:shipmembers.php?action=navigation&destination=Login');
// Récupération des informations sur les ShipMembers :
$nb_shipmembers = 0;
$requete = 'SELECT * FROM TB_Shipmembers WHERE Validite=1 ORDER BY ID ASC';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$shipmembers[$nb_shipmembers ++] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
break;
}
//****************************************************************************************************************************
case "Details":
{
// Modifier les droits d'accès d'un utilisateur
if (isset($_POST['acces'])){
$requete = 'UPDATE TB_Shipmembers SET Niveau_acces=? WHERE ID=?';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_POST['acces']),
array('i', $_SESSION['Shipmembers']['ID'])),
__FILE__, __LINE__);
}
// Récupération des informations sur le ShipMember :
$requete = 'SELECT *, (SELECT Texte FROM TB_Textes_traduction WHERE ID_TYPE = 1 AND ID_TEXTES=(SELECT ID_NOM FROM TB_Pays WHERE ID=TB_Shipmembers.ID_PAYS) AND ID_LANGUAGES=1) AS Libelle_pays FROM TB_Shipmembers WHERE ID='.$_SESSION['Shipmembers']['ID'].' ';
$reponse = Requete_preparee_bdd($requete,
array(),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$shipmember = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
$requete = '';
// Récupération des informations sur le ou les bateaux accessibles à ce ShipMember :
$nb_bateaux = 0;
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE ID_SHIPMEMBER=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $_SESSION['Shipmembers']['ID'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$bateaux[$nb_bateaux ++]['Cle_primaire'] = $donnees['ID_Bateau'];
}
Liberation_jeu_de_resultat_bdd($reponse);
// Récupération des informations relatives à chacun des bateaux accessibles :
for ($i=0; $i<$nb_bateaux; $i ++)
{
$requete = 'SELECT * FROM TB_Bateaux WHERE Cle_primaire=? ';
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $bateaux[$i]['Cle_primaire'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$bateaux[$i] = $donnees;
}
Liberation_jeu_de_resultat_bdd($reponse);
}
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
$message_erreur .= "Code invalide ou déjà utilisé \n";
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
}
// Récupération des liaisons shipmember - bateau
$current_timestamp = date_format(date_create(), 'Y-m-d H:i:s');
$requete = 'SELECT ID_Bateau, ID_Type_acces_bateau_shipmember FROM TB_Lien_bateau_shipmember WHERE ID_Shipmember='.$_SESSION['shipmember']['Cle_primaire'].' AND Validite=1 AND Validite_acces=1 AND Fin_validite>="'.$current_timestamp.'"';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$nb_acces = 0;
// $bateau_shipmember = []
while ($donnees = Recherche_ligne_bdd($reponse)) {
$_SESSION['bateau_shipmember'][$nb_acces++] = $donnees;
}
$_SESSION['acces'] = $nb_acces;
// $_SESSION['acces_valide'] = true;
break;
}
//****************************************************************************************************************************
case "Profil":
@@ -1082,8 +969,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Créer le lien bateau shipmember, affecter l'enregitrement a cet utilisateur
if (isset($_SESSION['code_acces']) && $_SESSION['code_acces']!=''){
$code = $_SESSION['code_acces'];
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
$requete = 'SELECT * FROM TB_Lien_bateau_shipmember WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$reponse = Requete_preparee_bdd($requete, array(array('s', $code)), __FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
// Vérifier si le code est tjrs valable
if ($donnees == NULL){
@@ -1091,8 +978,8 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
$_SESSION['code_acces'] = '';
}
else {
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember = '.$_SESSION['shipmember']['Cle_primaire'].' WHERE Validite=1 AND Code="'.$code.'" AND ID_Shipmember=0';
$sous_rep = Requete_bdd($sous_req, __FILE__, __LINE__);
$sous_req = 'UPDATE TB_Lien_bateau_shipmember SET ID_Shipmember=? WHERE Validite=1 AND Code=? AND ID_Shipmember=0';
$sous_rep = Requete_preparee_bdd($sous_req, array(array('i', $_SESSION['shipmember']['Cle_primaire']), array('s', $code)), __FILE__, __LINE__);
$_SESSION['code_acces'] = '';
// $_SESSION['droits_acces'] = $donnees['Niveau_acces'];
}
@@ -1444,7 +1331,6 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
echo '</div>';
echo '<div class="boutons_bas_de_page">';
// echo Ajouter_lien_modif_buttons('shipmember','accueil','espace_shipmember','menu_1_a_texte');
echo '<a title="'.t("Voir les informations liées à votre compte ShipMember...").'" href="shipmembers.php?action=navigation&destination=Profil">
'.t("Mes informations").'
</a>';
@@ -1459,7 +1345,7 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
// Accès au menu d'administration :
// if (isset($_SESSION['shipmember']['Niveau_administration']) && $_SESSION['shipmember']['Niveau_administration'] != '')
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_MINI_ACCES_ADMINISTATEUR)
if ($_SESSION['shipmember']['Niveau_acces'] >= NIVEAU_ACCES_MINI_ADMINISTRATEUR)
{
echo '<a title="Accès au menu d\'administration - Accès réservé" href="administration.php?action=navigation&destination=Accueil">
Administration
@@ -1473,128 +1359,9 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
break;
}
//************************************************************************************************************************
case "Administration":
{
echo '<div id="administration" class="page_principale">';
echo '<h1>Administration</h1>';
echo '<h2>ShipMembers</h2>';
echo '<table class="shipmember">
<thead>
<tr>
<th>Nom</th>
<th>Entreprise</th>
<th>Telephone</th>
<th>Email</th>
</tr>
</thead>
<tbody>';
for ($i = 0; $i < $nb_shipmembers; $i ++)
{
echo '<tr>
<td>
<a href="shipmembers.php?action=details_shipmember&id_shipmember='.$shipmembers[$i]['ID'].'">
'.$shipmembers[$i]['Prenom'].' '.$shipmembers[$i]['Nom'].'
</a>
</td>
<td>'.$shipmembers[$i]['Entreprise'].'</td>
<td>'.$shipmembers[$i]['Telephone'].'</td>
<td>'.$shipmembers[$i]['Email'].'</td>
</tr>';
}
echo '</tbody>
</table>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="administration.php?action=navigation&destination=Accueil">Retour au menu Administration</a>';
echo '</div>';
echo '</div>';
break;
}
//************************************************************************************************************************
case "Details":
{
echo '<div id="details" class="page_principale">';
echo '<h1>Administration</h1>';
echo '<h2>ShipMember n° <span class="gras">'.$shipmember['ID'].'</span></h2>';
echo '<table class="shipmember">
<tbody>';
echo '<tr>
<td>Nom complet</td>
<td>'.$shipmember['Prenom'].' '.$shipmember['Nom'].'</td>
</tr>';
echo '<tr>
<td>Entreprise</td>
<td>'.$shipmember['Entreprise'].'</td>
</tr>';
echo '<tr>
<td>Adresse</td>
<td>'.$shipmember['Rue'].' - '.$shipmember['Code_postal'].' '.$shipmember['Ville'].' - '.$shipmember['Libelle_pays'].'</td>
</tr>';
echo '<tr>
<td>Téléphone</td>
<td>'.$shipmember['Telephone'].'</td>
</tr>';
echo '<tr>
<td>Email</td>
<td>'.$shipmember['Email'].'</td>
</tr>';
echo '<tr>
<td>Date création du compte</td>
<td>'.Formatage_date($shipmember['Date_creation_compte']).'</td>
</tr>';
echo '<tr>
<td>Niveau d\'accès</td>
<td> <form method="POST" action="shipmembers.php">
<input name="acces" type="number" max="99" min="0" value="'.$shipmember['Niveau_acces'].'" style="max-width:20%">
<button type="submit" style="font-size: 12px"> Valider </button>
</form>
</td>
</tr>';
echo '<tr>
<td>Bateaux accessibles</td>
<td>';
if ($nb_bateaux == 0) echo '<i>Aucun...</i>';
else
{
for ($i=0; $i<$nb_bateaux; $i ++)
{
echo $bateaux[$i]['Nom'].'<br />';
}
}
echo '</td>
</tr>';
echo '</tbody>
</table>';
echo '<div class="boutons_bas_de_page">';
echo '<a title="" href="shipmembers.php?action=navigation&destination=Administration">Retour à la liste des ShipMembers</a>';
echo '</div>';
echo '</div>';
break;
}
//************************************************************************************************************************
case "Profil":
@@ -1705,12 +1472,10 @@ Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session
echo '<div class="boutons_bas_de_page">';
echo Ajouter_lien_modif_buttons('shipmember','profil','bas_de_page','modifier_a_texte');
echo '<a title="'.t("Accéder au menu de modification de vos informations...").'" href="shipmembers.php?action=navigation&destination=Modifier_profil">
'.t("Modifier").'
</a>';
echo Ajouter_lien_modif_buttons('shipmember','profil','bas_de_page','retour_a_texte');
echo '<a title="'.t("Retour à mon espace ShipMember...").'" href="shipmembers.php?action=navigation&destination=Accueil">
'.t("Retour").'
</a>';
+14 -6
View File
@@ -2,7 +2,7 @@
include "../config/config.php";
Init_session(basename($_SERVER['SCRIPT_NAME'])); // Fonction ouvrant la session et vérifiant que les accès sont autorisés.
Entete_page_html();
//************************************************************************************************************************************
@@ -10,11 +10,13 @@ Entete_page_html();
//************************************************************************************************************************************
$message_erreur = "";
$message_information = "";
$flag_redirection = false;
$max_nb_types_version = 50;
$types_version = array(
array("ShipHeart", "TB_Versions", "Nom", "package", "", "/packages"),
array("Application", "TB_Versions_appli", "Fichier", "version", "ID_Version_appli", "/ressources/appli"),
array("QT", "TB_Versions_qt", "Fichier", "version", "ID_Version_qt", "/ressources/qt"),
array("Api", "TB_Versions_api", "Fichier", "version", "ID_Version_api", "/ressources/api"),
array("Compagnon_v1", "TB_Versions_compagnon_v1", "Fichier", "version", "ID_Version_compagnon_v1", "/ressources/compagnon_v1"),
array("Compagnon_v2", "TB_Versions_compagnon_v2", "Fichier", "version", "ID_Version_compagnon_v2", "/ressources/compagnon_v2"),
array("SP812", "TB_Versions_sp812", "Fichier", "version", "ID_Version_sp812", "/ressources/sp812"),
@@ -43,6 +45,7 @@ Entete_page_html();
if (!isset($_SESSION['Versions']['version']['Date'])) $_SESSION['Versions']['version']['Date'] = date("Y-m-d");
if (!isset($_SESSION['Versions']['version']['ID_Version_appli'])) $_SESSION['Versions']['version']['ID_Version_appli'] = 0;
if (!isset($_SESSION['Versions']['version']['ID_Version_qt'])) $_SESSION['Versions']['version']['ID_Version_qt'] = 0;
if (!isset($_SESSION['Versions']['version']['ID_Version_api'])) $_SESSION['Versions']['version']['ID_Version_api'] = 0;
if (!isset($_SESSION['Versions']['version']['ID_Version_compagnon_v1'])) $_SESSION['Versions']['version']['ID_Version_compagnon_v1'] = 0;
if (!isset($_SESSION['Versions']['version']['ID_Version_compagnon_v2'])) $_SESSION['Versions']['version']['ID_Version_compagnon_v2'] = 0;
if (!isset($_SESSION['Versions']['version']['ID_Version_sp812'])) $_SESSION['Versions']['version']['ID_Version_sp812'] = 0;
@@ -271,6 +274,7 @@ $flag_redirection = true;
isset($_POST['Nom']) AND
isset($_POST['ID_Version_appli']) AND
isset($_POST['ID_Version_qt']) AND
isset($_POST['ID_Version_api']) AND
isset($_POST['ID_Version_compagnon_v1']) AND
isset($_POST['ID_Version_compagnon_v2']) AND
isset($_POST['ID_Version_sp812']) AND
@@ -288,6 +292,7 @@ $flag_redirection = true;
$_SESSION['Versions']['version']['Date'] = trim($_POST['Date']);
$_SESSION['Versions']['version']['ID_Version_appli'] = trim($_POST['ID_Version_appli']);
$_SESSION['Versions']['version']['ID_Version_qt'] = trim($_POST['ID_Version_qt']);
$_SESSION['Versions']['version']['ID_Version_api'] = trim($_POST['ID_Version_api']);
$_SESSION['Versions']['version']['ID_Version_compagnon_v1'] = trim($_POST['ID_Version_compagnon_v1']);
$_SESSION['Versions']['version']['ID_Version_compagnon_v2'] = trim($_POST['ID_Version_compagnon_v2']);
$_SESSION['Versions']['version']['ID_Version_sp812'] = trim($_POST['ID_Version_sp812']);
@@ -327,13 +332,14 @@ $flag_redirection = true;
if ($message_erreur == "")
{
// Création de la version :
$requete = 'INSERT INTO TB_Versions (Nom, Date, ID_Version_appli, ID_Version_qt, ID_Version_compagnon_v1, ID_Version_compagnon_v2, ID_Version_sp812, ID_Version_sp4ac, ID_Version_sp8dc, ID_Version_sbs, ID_Version_sql, ID_Version_www, ID_Version_updater, Description_interne, Description_externe) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$requete = 'INSERT INTO TB_Versions (Nom, Date, ID_Version_appli, ID_Version_qt, ID_Version_api, ID_Version_compagnon_v1, ID_Version_compagnon_v2, ID_Version_sp812, ID_Version_sp4ac, ID_Version_sp8dc, ID_Version_sbs, ID_Version_sql, ID_Version_www, ID_Version_updater, Description_interne, Description_externe) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['Versions']['version']['Nom']),
array('s', $_SESSION['Versions']['version']['Date']),
array('i', $_SESSION['Versions']['version']['ID_Version_appli']),
array('i', $_SESSION['Versions']['version']['ID_Version_qt']),
array('i', $_SESSION['Versions']['version']['ID_Version_api']),
array('i', $_SESSION['Versions']['version']['ID_Version_compagnon_v1']),
array('i', $_SESSION['Versions']['version']['ID_Version_compagnon_v2']),
array('i', $_SESSION['Versions']['version']['ID_Version_sp812']),
@@ -357,13 +363,14 @@ $flag_redirection = true;
else if (isset($_POST['validation_modification_package']))
{
// Mise à jour de la version :
$requete = 'UPDATE TB_Versions SET Nom=?, Date=?, ID_Version_appli=?, ID_Version_qt=?, ID_Version_compagnon_v1=?, ID_Version_compagnon_v2=?, ID_Version_sp812=?, ID_Version_sp4ac=?, ID_Version_sp8dc=?, ID_Version_sbs=?, ID_Version_sql=?, ID_Version_www=?, ID_Version_updater=?, Description_interne=?, Description_externe=? WHERE Cle_primaire=?';
$requete = 'UPDATE TB_Versions SET Nom=?, Date=?, ID_Version_appli=?, ID_Version_qt=?, ID_Version_api=?, ID_Version_compagnon_v1=?, ID_Version_compagnon_v2=?, ID_Version_sp812=?, ID_Version_sp4ac=?, ID_Version_sp8dc=?, ID_Version_sbs=?, ID_Version_sql=?, ID_Version_www=?, ID_Version_updater=?, Description_interne=?, Description_externe=? WHERE Cle_primaire=?';
Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['Versions']['version']['Nom']),
array('s', $_SESSION['Versions']['version']['Date']),
array('i', $_SESSION['Versions']['version']['ID_Version_appli']),
array('i', $_SESSION['Versions']['version']['ID_Version_qt']),
array('i', $_SESSION['Versions']['version']['ID_Version_api']),
array('i', $_SESSION['Versions']['version']['ID_Version_compagnon_v1']),
array('i', $_SESSION['Versions']['version']['ID_Version_compagnon_v2']),
array('i', $_SESSION['Versions']['version']['ID_Version_sp812']),
@@ -527,7 +534,7 @@ $flag_redirection = true;
$repertoire_temp = REPERTOIRE_VERSIONS_SHIPHEART.$types_version[$_SESSION['Versions']['type_version']][5].'/temp';
// Sécurité en dur pour s'assurer qu'on ne pointe pas sur un autre répertoire qu'on va supprimer :
if (strpos($repertoire_temp, "/home/ciuqsga/versions/shipheart/packages/temp") === false)
if (strpos($repertoire_temp, "/home/koriolan/versions/shipheart/packages/temp") === false)
{
$message_erreur .= "L'adresse du répertoire TEMP a été modifiée (répertoire = ".$repertoire_temp.").<br />Afin d'éviter toute catastrophe (ce répertoire et ses sous-répertoires vont être supprimés !), merci de mettre à jour ce test de vérification...<br />";
break;
@@ -853,7 +860,6 @@ ANCIENNE VERSION : Fin */
$_SESSION['Versions']['page'] = "Modification_version";
} while (0);
$flag_redirection = true; // Evite que le message d'erreur soit supprimé par la redirection de purge d'URL
}
@@ -864,7 +870,7 @@ $flag_redirection = true; // Evite que le message d'erreur soit supprimé p
//************************************************************************************************************************************
// Protection contre les accès directs :
if ((!$_SESSION['acces_valide']) OR ($_SESSION['shipmember']['Niveau_acces'] < NIVEAU_MINI_ACCES_ADMINISTATEUR)) header('Location:shipmembers.php?action=navigation&destination=Login');
if ((!$_SESSION['acces_valide']) OR ($_SESSION['shipmember']['Niveau_acces'] < NIVEAU_ACCES_MINI_ADMINISTRATEUR)) header('Location:shipmembers.php?action=navigation&destination=Login');
switch ($_SESSION['Versions']['page'])
{
@@ -961,6 +967,7 @@ $flag_redirection = true; // Evite que le message d'erreur soit supprimé p
$_SESSION['Versions']['version']['Date'] = date("Y-m-d");
$_SESSION['Versions']['version']['ID_Version_appli'] = 0;
$_SESSION['Versions']['version']['ID_Version_qt'] = 0;
$_SESSION['Versions']['version']['ID_Version_api'] = 0;
$_SESSION['Versions']['version']['ID_Version_compagnon_v1'] = 0;
$_SESSION['Versions']['version']['ID_Version_compagnon_v2'] = 0;
$_SESSION['Versions']['version']['ID_Version_sp812'] = 0;
@@ -1081,6 +1088,7 @@ $flag_redirection = true; // Evite que le message d'erreur soit supprimé p
// Affichage
//************************************************************************************************************************************
Entete_page_html();
//********************************************************************************************************************************
// Affichage principal :