Import initial du site ship2net.fr : pages PHP, config, traductions t(), composer.json

This commit is contained in:
2026-09-28 08:04:25 +00:00
commit 82f431b3ae
175 changed files with 25531 additions and 0 deletions
+585
View File
@@ -0,0 +1,585 @@
<?php
// Fonctions par ordre alphabétique...
//************************************************************************************************************
// Fonction : Affichage de la date et de l'heure courante
// Reçoit : Rien
// Retour : Rien (le résultat est renvoyé directement sur la page par 'echo')
//************************************************************************************************************
function Affichage_date_heure()
{
echo '<div id="affichage_date_heure">
<p>'.Texte_jour_semaine(date("w")).'</p>
<p>'.date("d").' '.Texte_mois(date("n")-1).'</p>
<p>'.date("Y").'</p>
<p>'.date("H:i").'</p>
</div>';
}
//************************************************************************************************************
// Fonction : Affichage de la date en cours
// Reçoit : Rien
// Retour : Rien (le résultat est renvoyé directement sur la page par 'echo')
//************************************************************************************************************
function Affichage_date()
{
if (!isset($_SESSION['Prise_rendez_vous']['jour_en_cours'])) $_SESSION['Prise_rendez_vous']['jour_en_cours'] = date("Y-m-d");
$current_date = $_SESSION['Prise_rendez_vous']['jour_en_cours'];
// On regarde si le jour en cours est dans ce mois pour le marquer de façon particulière :
$month = substr($current_date, 5, 2);
$year = substr($current_date, 0, 4);
$day = substr($current_date, 8, 2);
$time = mktime(0,0,0, $month, $day, $year);
echo '<div id="affichage_date">
<p>'.Texte_jour_semaine(date("w", $time)).'</p>
<p>'.date("d", $time).' '.Texte_mois(date("n", $time)-1).'</p>
<p>'.date("Y", $time).'</p>
</div>';
// echo '<div style="text-align:center; margin-top:20px;">
// <span style="font-size:2.5em; font-weight:bold;">'.Texte_jour_semaine(date("w", $time)).'<br />'
// .date("j", $time).' '.Texte_mois(date("n", $time)-1).' '.date("Y", $time).'</span><br />
// </div>';
}
//********************************************************************************************************************************
// Fonction : Vérifie la longueur d'un paramètre de formulaire en fonction de valeurs mini et maxi reçues et
// renvoie une chaine d'erreur dans la langue en cours
// Reçoit : Le titre du champ, la chaine du champs à vérifier, la longueur mini et la longueur maxi
// Retour : Une chaine d'erreur. Vide si aucune erreur ou message dans la langue en cours
//********************************************************************************************************************************
function check_longueur_champ($titre_champ, $champ, $min, $max)
{
$longueur = strlen($champ);
$retour = "";
if (($longueur < $min) OR ($longueur > $max))
{
$retour .= '['.$_SESSION['textes']['all']['all']['all'][''.$titre_champ.''].'] ';
$retour .= $_SESSION['textes']['all']['all']['erreurs']['longueur_champ_invalide'];
$retour .= ' (min = '.$min.' - max = '.$max.')';
$retour .= '<br />';
}
return($retour);
}
//************************************************************************************************************
// Fonction : Affiche le comparatif des versions de ShipHeart qui est utilisé sur la Boutique et sur la page
// d'Accueil.
// Reçoit : Rien
// Retour : Rien (le résultat est renvoyé directement sur la page par 'echo')
//************************************************************************************************************
function comparatif_shiphearts()
{
$nom_page = basename($_SERVER['SCRIPT_FILENAME']);
// Variables spécifiques au fichier d'origine :
switch($nom_page)
{
case 'accueil.php' :
{
$image_coche = "selection_blanc.png";
$type_fond = "fond_fonce";
break;
}
case 'boutique.php' :
{
$image_coche = "selection.png";
$type_fond = "fond_clair";
break;
}
default : { $image_coche = "selection_hover.png"; break; }
}
//=========================================================================
// Récupération des données :
Ouverture_bdd(); // Connexion à MySql
// Variables spécifiques à la langue :
switch($_SESSION['langue'])
{
case "EN" : { $texte_coche = "Yes"; break; }
case "FR" : { $texte_coche = "Oui"; break; }
default : { $texte_coche = "langue_non_féfinie"; break; } // Ce texte ne sera jamais trouvé, donc jamais remplacé....
}
$nb_lignes_comparatif = 0;
$nb_renvois_comparatif = 0;
/* $requete = 'SELECT * FROM TB_Comparatif WHERE Validite=1 AND Visible_public=1 ORDER BY Priorite_affichage, Cle_primaire ';
// echo "Requete = ".$requete.'<br />';
$reponse = Requete_bdd($requete, __FILE__, __LINE__);
*/
$requete = 'SELECT ID, ';
$requete .= 'Renvoi, ';
$requete .= '(SELECT Texte FROM TB_Textes_traduction WHERE ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?) AND ID_TEXTES=ID_FONCTION) AS Texte, ';
$requete .= 'CONCAT(\'{\',GROUP_CONCAT(CONCAT(\'"\',ID_PRODUITS,\'":"\',(SELECT Texte FROM TB_Textes_traduction WHERE ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?) AND ID_TEXTES=ID_RESULTAT),\'"\') ORDER BY ID_PRODUITS ASC SEPARATOR ","),"}") AS Produits ';
$requete .= 'FROM TB_Galerie_comparatif LEFT JOIN TB_Comparatif ON TB_Galerie_comparatif.ID_COMPARATIF=TB_Comparatif.ID JOIN TB_Comparatif_produits ON TB_Comparatif.ID=TB_Comparatif_produits.ID_COMPARATIF ';
$requete .= 'WHERE TB_Galerie_comparatif.Priorite!=0 GROUP BY TB_Comparatif.ID ORDER BY TB_Galerie_comparatif.Priorite ASC';
$reponse = Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['langue']),
array('s', $_SESSION['langue'])),
__FILE__, __LINE__);
while ($donnees = Recherche_ligne_bdd($reponse))
{
$lignes_comparatif[$nb_lignes_comparatif]['id'] = $donnees['ID'];
$lignes_comparatif[$nb_lignes_comparatif]['fonction'] = $donnees['Texte'];
// Traitement des renvois de bas de page :
if ($donnees['Renvoi'] > 0)
{
// Recherche si le même texte de renvoi a déjà été utilisé :
$renvoi_deja_utilise = 0;
for ($i=0; $i<$nb_renvois_comparatif; $i++)
{
if ($renvois_comparatif[$i]['id'] == $donnees['Renvoi'])
{
$renvoi_deja_utilise = $renvois_comparatif[$i]['no'];
break;
}
}
if ($renvoi_deja_utilise != 0) $lignes_comparatif[$nb_lignes_comparatif]['fonction'] .= '<span class="renvoi">['.$renvoi_deja_utilise.']</span>';
else
{
$renvois_comparatif[$nb_renvois_comparatif]['no'] = $nb_renvois_comparatif + 1;
$renvois_comparatif[$nb_renvois_comparatif]['id'] = $donnees['Renvoi'];
$renvois_comparatif[$nb_renvois_comparatif]['texte'] = nl2br($_SESSION['textes']['boutique']['accueil']['comparatif']['texte_renvoi_'.$donnees['Renvoi'].'']);
$lignes_comparatif[$nb_lignes_comparatif]['fonction'] .= '<span class="renvoi">['.($nb_renvois_comparatif + 1).']</span>';
$nb_renvois_comparatif++;
}
}
// Remplacement des textes "Oui"/"Yes" par l'image d'une case cochée + suppression de la langue dans la variable :
$lignes_comparatif[$nb_lignes_comparatif]['Produits'] = array();
foreach(json_decode($donnees['Produits'], true) as $id_produit => $produit)
{
$lignes_comparatif[$nb_lignes_comparatif]['Produits'][$id_produit] = str_replace($texte_coche, "<img src=\"images/".$image_coche."\">", $produit);
}
// Demande de regroupement des lignes pour lesquelles les valeurs sont identiques :
$lignes_comparatif[$nb_lignes_comparatif]['type_ligne'] = count(array_unique($lignes_comparatif[$nb_lignes_comparatif]['Produits'])) <= 1 ? "unique" : "multiple";
$nb_lignes_comparatif ++;
}
Liberation_jeu_de_resultat_bdd($reponse);
$requete = "SELECT CONCAT('{',GROUP_CONCAT(DISTINCT CONCAT('\"',ID_PRODUITS,'\":\"',(SELECT Texte FROM TB_Textes_traduction WHERE ID_LANGUAGES=(SELECT ID FROM TB_Langues WHERE Prefix=?) AND ID_TEXTES=(SELECT ID_NOM FROM TB_Produits WHERE ID=ID_PRODUITS)),'\"') ORDER BY ID_PRODUITS ASC SEPARATOR ','),'}') AS resultat FROM TB_Comparatif_produits";
$reponse = Requete_preparee_bdd($requete,
array(
array('s', $_SESSION['langue'])),
__FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
$title_comparatif = json_decode($donnees['resultat'], true);
Liberation_jeu_de_resultat_bdd($reponse);
Fermeture_bdd(); // Déconnexion de MySQL
//=========================================================================
// Affichage :
echo '<div class="comparatif">';
//-----------------------------------------------------------------
// Bouton de sélection de l'affichage ou non de la table de comparaison :
echo '<div id="divButtonCollapseComparatif" class="bouton_comparatif plus '.$type_fond.'">';
echo '<a title="'.$_SESSION['textes']['boutique']['accueil']['comparatif']['titre_plus_a_title'].'" class="btn" data-bs-toggle="collapse" href="#collapseComparatif" role="button" aria-expanded="false" aria-controls="collapseComparatif" id="buttonCollapseComparatif">
'.nl2br($_SESSION['textes']['boutique']['accueil']['comparatif']['titre_plus_a_texte']); // Texte 111
echo '</a>';
echo '</div>';
echo '<div class="collapse" id="collapseComparatif">';
//-----------------------------------------------------------------
// Table principale avec fonctions et valeur pour chaque version :
echo '<table class="table_comparatif">';
echo '<thead>
<tr>';
/* echo '<th>'.$_SESSION['textes']['boutique']['accueil']['comparatif']['titre_1'].'</th>';
foreach($title_comparatif as $id_produit => $produit)
{
echo '<th>'.$produit.'</th>';
}
*/
echo '<th> </th>';
echo '<th> </th>';
echo '</tr>
</thead>';
// $nb_lignes_comparatif = 0;
echo '<tbody>';
for ($j = 0; $j < $nb_lignes_comparatif; $j ++)
{
echo '<tr>
<td>'.nl2br($lignes_comparatif[$j]['fonction']).'</td>';
foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit)
{
echo '<td class="version">'.nl2br($produit).'</td>';
break;
}
/* if ($lignes_comparatif[$j]['type_ligne'] == "multiple")
{
foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit)
{
echo '<td class="version">'.nl2br($produit).'</td>';
}
}
else
{
foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit)
{
echo '<td class="version" colspan="4">'.nl2br($produit).'</td>';
break;
}
}
*/
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
//-----------------------------------------------------------------
// Table des renvois :
echo '<table class="table_renvois_comparatif">
<tbody>';
for ($j = 0; $j < $nb_renvois_comparatif; $j ++)
{
echo '<tr>
<td>['.$renvois_comparatif[$j]['no'].'] '.nl2br($renvois_comparatif[$j]['texte']).'</td>
</tr>';
}
echo '</tbody>
</table>';
echo '</div>';
echo "<script>
$('#collapseComparatif').on('shown.bs.collapse', function () {
$('#divButtonCollapseComparatif').removeClass('plus');
$('#divButtonCollapseComparatif').addClass('moins');
$('buttonCollapseComparatif').attr('title','".$_SESSION['textes']['boutique']['accueil']['comparatif']['titre_moins_a_title']."');
$('buttonCollapseComparatif').html('".nl2br($_SESSION['textes']['boutique']['accueil']['comparatif']['titre_moins_a_texte'])."');
});
$('#collapseComparatif').on('hidden.bs.collapse', function () {
$('#divButtonCollapseComparatif').removeClass('moins');
$('#divButtonCollapseComparatif').addClass('plus');
$('buttonCollapseComparatif').attr('title','".$_SESSION['textes']['boutique']['accueil']['comparatif']['titre_plus_a_title']."');
$('buttonCollapseComparatif').html('".nl2br($_SESSION['textes']['boutique']['accueil']['comparatif']['titre_plus_a_texte'])."');
});
</script>";
echo '</div>';
}
//************************************************************************************************************
// Fonction : Convertit une valeur de latitude/longitude décimale en chaine de caratères comprenant Degrés, Minutes et Secondes
// Reçoit : L'indication "LAT" ou "LON" et la valeur décimale
// Retour : La chaine convertie
//************************************************************************************************************
function Conversion_DECtoDMS($lat_lon, $valeur)
{
if ($lat_lon == "LAT") $direction = $valeur < 0 ? 'S': 'N';
elseif ($lat_lon == "LON") $direction = $valeur < 0 ? 'W': 'E';
else $direction = "";
$signe = $valeur < 0 ? '-': '';
$degres = floor(abs($valeur ?? 0));
$decimale = (abs($valeur ?? 0)-$degres) * 3600;
$min = floor($decimale / 60);
$sec = round($decimale - ($min * 60), 1);
return (sprintf("%s%s°%02d'%04.1f\" %s", $signe, $degres, $min, $sec, $direction));
}
//************************************************************************************************************
// Fonction : Enregistrement dans le fichier de log de l'évènement
// Reçoit : Le texte à afficher dans le log, le fichier d'origine et la ligne d'origine
// Retour : Rien
//************************************************************************************************************
function Enregistrement_log($texte, $fichier, $ligne)
{
$repertoire_logs = REPERTOIRE_LOGS."/www_shipheart";
if (!file_exists($repertoire_logs) OR !is_dir($repertoire_logs)) // On vérifie d'abord que le répertoire existe, sinon on le créé.
{
mkdir($repertoire_logs);
$message_information .= "Le répertoire de logs [".$repertoire_logs."] n'existait pas. Il vient d'êtrer crééé<br />";
}
$fichier_log = $repertoire_logs.'/log_shipheart_'.date("Y-m-d").'.txt';
$prefixe_ligne = date("d/m/Y H:i:s")." [".basename($fichier)." - ".$ligne."] \t: ";
$suffixe_ligne = "\r\n";
$log = fopen($fichier_log, "a+"); // Ouverture en lecture/écriture en mode append...
fputs($log, $prefixe_ligne); // Entete de ligne
fputs($log, $texte); // Ecriture du texte de log
fputs($log, $suffixe_ligne); // Fin de ligne
fclose($log); // Fermetue du fichier.
if(SHOW_DEBUG)
{
echo $prefixe_ligne . $texte . $suffixe_ligne;
}
}
//************************************************************************************************************
// Fonction : Conversion de format de dates
// Reçoit : Date à convertir
// Retour : la chaine mise en forme
//************************************************************************************************************
function Formatage_date($date)
{
if ($_SESSION['langue'] == "FR")
{
switch (substr($date, 5, 2))
{
case 1: {$mois="janvier"; break;}
case 2: {$mois="février"; break;}
case 3: {$mois="mars"; break;}
case 4: {$mois="avril"; break;}
case 5: {$mois="mai"; break;}
case 6: {$mois="juin"; break;}
case 7: {$mois="juillet"; break;}
case 8: {$mois="août"; break;}
case 9: {$mois="septembre"; break;}
case 10: {$mois="octobre"; break;}
case 11: {$mois="novembre"; break;}
case 12: {$mois="décembre"; break;}
default: $mois = substr($date, 5, 2);
}
$retour = substr($date, 8, 2).' '.$mois.' '.substr($date, 0, 4);
$suffixe_heure = 'à';
}
else
{
switch (substr($date, 5, 2))
{
case 1: {$mois="January"; break;}
case 2: {$mois="February"; break;}
case 3: {$mois="March"; break;}
case 4: {$mois="April"; break;}
case 5: {$mois="May"; break;}
case 6: {$mois="June"; break;}
case 7: {$mois="July"; break;}
case 8: {$mois="August"; break;}
case 9: {$mois="September"; break;}
case 10: {$mois="October"; break;}
case 11: {$mois="November"; break;}
case 12: {$mois="December"; break;}
default: $mois = substr($date, 5, 2);
}
$jour = ltrim(substr($date, 8, 2), "0"); // Suppression du zéro initial s'il y en a un...
switch($jour)
{
case 1:
case 21:
case 31: { $suffixe_jour = 'st'; break; }
case 2:
case 22: { $suffixe_jour = 'nd'; break; }
case 3:
case 23: { $suffixe_jour = 'rd'; break; }
default: { $suffixe_jour = 'th'; break; }
}
$retour = $mois.' '.$jour.'<sup>'.$suffixe_jour.'</sup>, '.substr($date, 0, 4);
$suffixe_heure = 'at';
}
if (strpos($date, ' ') !== false) $retour .= ' '.$suffixe_heure.' '.substr($date, 11); // Ajout de l'heure si la chaine d'entrée comprend un espace (entre date et heure)
return($retour);
}
//********************************************************************************************************************************
// Fonction : Recherche dans le BDD le prochain numéro de document, le formatte, et retourne le n° formatté du nouveau document.
// Reçoit : le type de document (cd dans definition.php) et l'année concernée
// Retour : Le numéro formatté du nouveau document, -1 si erreur de paramètres, -2 si dépassement de numérotation
// ATTENTION : l'accès à la BDD doit être ouvert AVANT d'accéder à cette fonction.
// NB : on pourrait l'ouvrir dedans mais on ne sait alors pas s'il faut la refermer...
//********************************************************************************************************************************
function nouveau_numero_document($type, $annee)
{
$nb_digits_numerotation = 4;
$erreur = 0;
// Contrôles et définition du préfixe au passage :
switch($type)
{
case NUM_TYPE_DEVIS : { $prefixe = "D"; $fonctionRequete = ""; break; }
case NUM_TYPE_COMMANDE : { $prefixe = "C"; $fonctionRequete = "porchainNoCommande"; break; }
case NUM_TYPE_FACTURE : { $prefixe = "F"; $fonctionRequete = "porchainNoFacture"; break; }
case NUM_TYPE_AVOIR : { $prefixe = "A"; $fonctionRequete = ""; break; }
default: return (-1);
}
// Recherche d'une numérotation existante :
$dernier_no = -1;
$requete = "SELECT $fonctionRequete(?) AS No";
$reponse = Requete_preparee_bdd($requete,
array(
array('i', $annee)),
__FILE__, __LINE__);
$donnees = Recherche_ligne_bdd($reponse);
$dernier_no = $donnees['No'];
Liberation_jeu_de_resultat_bdd($reponse);
// Formattage du n° de document :
if ($erreur != 0) return($erreur);
else return($prefixe.($annee-2000).str_pad($dernier_no, $nb_digits_numerotation, '0', STR_PAD_LEFT));
}
//************************************************************************************************************
// Fonction : Affichage du nom du jour de la semaine en français en version courte (3 lettres)
// Reçoit : Jour à convertir (entre 0: dimanche et 6: samedi voire 7:dimanche)
// Retour : Le texte court du jour en français
//************************************************************************************************************
function Texte_court_jour_semaine($jour)
{
switch ($jour)
{
case 0: {$texte_jour_semaine="Dim"; break;}
case 1: {$texte_jour_semaine="Lun"; break;}
case 2: {$texte_jour_semaine="Mar"; break;}
case 3: {$texte_jour_semaine="Mer"; break;}
case 4: {$texte_jour_semaine="Jeu"; break;}
case 5: {$texte_jour_semaine="Ven"; break;}
case 6: {$texte_jour_semaine="Sam"; break;}
case 7: {$texte_jour_semaine="Dim"; break;}
default: $texte_jour_semaine = "<Erreur de jour dans fonction 'texte_jour_semaine'>";
}
return($texte_jour_semaine);
}
//************************************************************************************************************
// Fonction : Affichage du nom du jour de la semaine en français
// Reçoit : Jour à convertir (entre 0: dimanche et 6: samedi voire 7:dimanche)
// Retour : Le texte du jour en français
//************************************************************************************************************
function Texte_jour_semaine($jour)
{
switch ($jour)
{
case 0: {$texte_jour_semaine="dimanche"; break;}
case 1: {$texte_jour_semaine="lundi"; break;}
case 2: {$texte_jour_semaine="mardi"; break;}
case 3: {$texte_jour_semaine="mercredi"; break;}
case 4: {$texte_jour_semaine="jeudi"; break;}
case 5: {$texte_jour_semaine="vendredi"; break;}
case 6: {$texte_jour_semaine="samedi"; break;}
case 7: {$texte_jour_semaine="dimanche"; break;}
default: $texte_jour_semaine = "<Erreur de jour dans fonction 'texte_jour_semaine'>";
}
return($texte_jour_semaine);
}
//************************************************************************************************************
// Fonction : Affichage du nom du mois en français
// Reçoit : Mois à convertir (entre 0: janvier et 11: décembre)
// Retour : Le texte du mois en français
//************************************************************************************************************
function Texte_mois($mois)
{
switch ($mois)
{
case 0: {$texte_mois="janvier"; break;}
case 1: {$texte_mois="février"; break;}
case 2: {$texte_mois="mars"; break;}
case 3: {$texte_mois="avril"; break;}
case 4: {$texte_mois="mai"; break;}
case 5: {$texte_mois="juin"; break;}
case 6: {$texte_mois="juillet"; break;}
case 7: {$texte_mois="août"; break;}
case 8: {$texte_mois="septembre"; break;}
case 9: {$texte_mois="octobre"; break;}
case 10: {$texte_mois="novembre"; break;}
case 11: {$texte_mois="décembre"; break;}
default: $texte_mois = "<Erreur de mois dans fonction 'Texte_mois'>";
}
return($texte_mois);
}
//************************************************************************************************************
// Fonction : Vérification d'un numero de téléphone + formatage
// Reçoit : Chaine représentant le numéro
// Retour : Le numéro formaté soud la forme "06 12 34 56 78 90"
//************************************************************************************************************
function Verification_numero_telephone($chaine_numero)
{
$numero_ok = true;
do
{
switch (strlen($chaine_numero))
{
case 10 : // Aucun séparateur n'est présent dans la chaine reçue :
{
for ($i=0; $i<5; $i++) $numeros[$i] = substr($chaine_numero, ($i*2), 2);
$chaine_numero = $numeros[0];
for ($i=1; $i<5; $i++) $chaine_numero .= ' '.$numeros[$i]; // Ajout des ' ' comme séparateur
break;
}
case 14 : // Un séparateur existe entre chaque groupe de deux chiffres :
{
for ($i=1; $i<5; $i++) $chaine_numero[($i*3)-1] = ' '; // Remplacement des séparateurs existants par des ' '
break;
}
default : // Comibinaison de nombre de séparateurs ou de chiffres incohérent :
{
$numero_ok = false;
break;
}
}
if (! $numero_ok) break; // On sort de la boucle DO si une erreur a déjà été trouvée.
// On décompose les 5 groupes :
$numeros = explode(" ", $chaine_numero);
if (count($numeros) != 5) {$numero_ok = false; break;}
foreach($numeros as $n)
{
if (strlen($n) != 2) {$numero_ok = false; break;}
if (($n < 0) OR ($n > 99)) {$numero_ok = false; break;}
}
if (($numeros[0] < 1) OR ($numeros[0] > 9)) {$numero_ok = false; break;}
} while (0);
if ($numero_ok) return($chaine_numero);
else return ("Numéro non valide");
}