'.Texte_jour_semaine(date("w")).'

'.date("d").' '.Texte_mois(date("n")-1).'

'.date("Y").'

'.date("H:i").'

'; } //************************************************************************************************************ // 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 '

'.Texte_jour_semaine(date("w", $time)).'

'.date("d", $time).' '.Texte_mois(date("n", $time)-1).'

'.date("Y", $time).'

'; // echo '
// '.Texte_jour_semaine(date("w", $time)).'
' // .date("j", $time).' '.Texte_mois(date("n", $time)-1).' '.date("Y", $time).'

//
'; } //******************************************************************************************************************************** // 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 .= '
'; } 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.'
'; $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'] .= '['.$renvoi_deja_utilise.']'; 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'] .= '['.($nb_renvois_comparatif + 1).']'; $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, "", $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 '
'; //----------------------------------------------------------------- // Bouton de sélection de l'affichage ou non de la table de comparaison : echo '
'; echo ''; echo '
'; echo '
'; //----------------------------------------------------------------- // Table principale avec fonctions et valeur pour chaque version : echo ''; echo ''; /* echo ''; foreach($title_comparatif as $id_produit => $produit) { echo ''; } */ echo ''; echo ''; echo ''; // $nb_lignes_comparatif = 0; echo ''; for ($j = 0; $j < $nb_lignes_comparatif; $j ++) { echo ''; foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit) { echo ''; break; } /* if ($lignes_comparatif[$j]['type_ligne'] == "multiple") { foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit) { echo ''; } } else { foreach($lignes_comparatif[$j]['Produits'] as $id_produit => $produit) { echo ''; break; } } */ echo ''; } echo ''; echo '
'.$_SESSION['textes']['boutique']['accueil']['comparatif']['titre_1'].''.$produit.'
'.nl2br($lignes_comparatif[$j]['fonction']).''.nl2br($produit).''.nl2br($produit).''.nl2br($produit).'
'; //----------------------------------------------------------------- // Table des renvois : echo ''; for ($j = 0; $j < $nb_renvois_comparatif; $j ++) { echo ''; } echo '
['.$renvois_comparatif[$j]['no'].'] '.nl2br($renvois_comparatif[$j]['texte']).'
'; echo '
'; echo ""; echo '
'; } //************************************************************************************************************ // 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 // Ne doit JAMAIS interrompre la page qui l'appelle (synthèse §50) : si le répertoire ou le fichier de log // est inaccessible (cas du conteneur ship2net-php, où /home/koriolan/logs n'était pas monté), le message // part dans le journal d'erreurs de PHP (visible par "docker logs ship2net-php") au lieu de provoquer une // erreur fatale qui masquait l'erreur d'origine. // 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"; $prefixe_ligne = date("d/m/Y H:i:s")." [".basename($fichier)." - ".$ligne."] \t: "; $suffixe_ligne = "\r\n"; // Répertoire créé au besoin (y compris les répertoires parents), sans avertissement en cas d'échec : if (!is_dir($repertoire_logs)) @mkdir($repertoire_logs, 0775, true); $log = @fopen($repertoire_logs.'/log_shipheart_'.date("Y-m-d").'.txt', "a"); if ($log !== false) { fputs($log, $prefixe_ligne.$texte.$suffixe_ligne); fclose($log); } else { error_log("Ship2net (fichier de log inaccessible : ".$repertoire_logs.") ".$prefixe_ligne.$texte); } if(SHOW_DEBUG) { echo htmlspecialchars($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.''.$suffixe_jour.', '.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 = ""; } 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 = ""; } 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 = ""; } 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"); }