';
}
}
/**
* Affiche ou retourne une variable formatée pour le débogage.
*
* @param mixed $var Variable à afficher.
* @param string $label Étiquette pour identifier la variable (par défaut 'Dump').
* @param bool $echo Indique si la sortie doit être affichée (TRUE) ou retournée (FALSE).
* @return string|null Contenu formaté si $echo est FALSE, sinon NULL.
*/
public static function dump($var, $label = 'Dump', $echo = true)
{
// Start output buffering
ob_start();
echo "
";
echo "" . $label . ": ";
// Convert array or object to string
if (is_array($var)) {
print_r($var);
} elseif (is_object($var)) {
echo self::objectToString($var);
} else {
var_dump($var);
}
echo "";
// Get the contents of the buffer
$output = ob_get_clean();
// If echo is true, print the output
if ($echo) {
echo $output;
} else {
return $output;
}
}
/**
* Convertit un objet en chaîne formatée pour le débogage.
*
* @param object $object Objet à convertir.
* @param string|null $_tab Indentation pour le formatage (optionnel).
* @return string Représentation formatée de l'objet.
*/
public static function objectToString($object, $_tab = NULL) {
ob_start();
$tab = " " . $_tab;
echo "Object (" . get_class($object) . ")\n";
echo $_tab . "{\n";
foreach (get_object_vars($object) as $property => $value) {
echo $tab . "[$property] => ";
if (is_array($value)) {
echo self::arrayToString($value, $tab);
} elseif (is_object($value)) {
echo self::objectToString($value, $tab);
} else {
echo "" . var_export($value, true) . "\n";
}
}
echo $_tab . "}\n";
return ob_get_clean();
}
/**
* Convertit un tableau en chaîne formatée pour le débogage.
*
* @param array $array Tableau à convertir.
* @param string|null $_tab Indentation pour le formatage (optionnel).
* @return string Représentation formatée du tableau.
*/
public static function arrayToString($array, $_tab = NULL)
{
ob_start();
$tab = " ".$_tab;
echo "Array\n";
echo $_tab . "(\n";
foreach ($array as $key => $value) {
echo $tab . "[$key] => ";
if (is_array($value)) {
echo self::arrayToString($value, $tab);
} elseif (is_object($value)) {
echo self::objectToString($value, $tab);
} else {
echo "" . var_export($value, true) . "\n";
}
}
echo $_tab . ")\n";
return ob_get_clean();
}
/**
* Convertit une variable en chaîne de caractères pour le débogage.
*
* @param mixed $var La variable à convertir.
* @param string $label Une étiquette pour identifier la variable.
* @return string La représentation formatée de la variable.
*/
private static function variableToString($var, $label)
{
ob_start();
echo "$label: ";
if (is_array($var) || is_object($var)) {
print_r($var);
} else {
var_dump($var);
}
return ob_get_clean();
}
/**
* Récupère la trace d'exécution sous forme de chaîne.
*
* @return string La trace d'exécution formatée.
*/
public static function getTraces(){
$return = "Trace : ";
// Obtenir la trace d'exécution
$backtrace = debug_backtrace();
$nb = count($backtrace)-1;
for ($i=$nb; $i > 0; $i--) {
$return .= ($i != 0) ? "[".$backtrace[$i]["function"]."] " : NULL;
$return .= str_replace(DOCUMENT_ROOT, '', $backtrace[$i]["file"]).":".$backtrace[$i]["line"];
$return .= ($i != 1) ? " >> " : NULL;
}
return $return;
}
/**
* Affiche un tableau formaté pour le débogage.
*
* @param array|null $_array Le tableau à afficher (optionnel).
* @param int|null $_exit Si défini, termine le script après l'affichage (optionnel).
*/
public static function print_r(?array $_array = NULL, ?int $_exit = NULL)
{
echo "".debug::getTraces() . "
";
if(empty($_array)){
echo "EMPTY
";
} else {
echo "";
print_r($_array);
echo "";
}
($_exit != NULL) ? exit() : NULL;
}
/**
* Vérifie si une chaîne contient du HTML.
*
* @param string $_string La chaîne à vérifier.
* @return bool TRUE si la chaîne contient du HTML, FALSE sinon.
*/
public static function isHtml(string $_string) : bool
{
$stripped_string = strip_tags($_string);
return $_string !== $stripped_string;
}
/**
* Génère un contenu HTML encapsulé dans un iframe.
*
* @param string $htmlContent Le contenu HTML à encapsuler.
* @return string Le contenu HTML complet avec iframe.
*/
public static function generateHtmlContent($htmlContent)
{
$id = md5(microtime());
return <<
Exécution de HTML
HTML;
}
/**
* Ajoute un message au journal de débogage.
*
* @param mixed $_message Le message à ajouter.
* @param string|null $_mark Une marque pour identifier le message (optionnel).
*/
public static function log($_message, $_mark = NULL)
{
$mark = "";
$mark .= ($_mark != NULL) ? "
". $_mark . "
" : NULL;
$mark .= self::getTraces();
$mark .= "
";
if($_message != NULL) {
if(is_array($_message)){
self::$logs[] = ["data" => $mark ."" . self::arrayToString($_message) . "
", "nl2br" => TRUE];
} elseif(is_object($_message)){
self::$logs[] = ["data" => $mark ."" . self::objectToString($_message) . "
", "nl2br" => TRUE];
} elseif(self::isHtml($_message)){
self::$logs[] = ["data" => $mark ."" . self::generateHtmlContent($_message) . "
", "nl2br" => FALSE];
} elseif($mark != NULL){
self::$logs[] = ["data" => $mark ."" . $_message . "
", "nl2br" => TRUE];
} else {
self::$logs[] = ["data" => $_message, "nl2br" => TRUE];
}
}
}
/**
* Ajoute un message au journal de session de débogage.
*
* @param mixed $_message Le message à ajouter.
* @param string|null $_mark Une marque pour identifier le message (optionnel).
*/
public static function logSession($_message, $_mark = NULL)
{
$mark = "";
$mark .= ($_mark != NULL) ? "
". $_mark . "
" : NULL;
$mark .= self::getTraces();
$mark .= "
";
if($_message != NULL) {
if(is_array($_message)){
self::setSession(["data" => $mark ."" . self::arrayToString($_message) . "
", "nl2br" => TRUE]);
} elseif(is_object($_message)){
self::setSession(["data" => $mark ."" . self::objectToString($_message) . "
", "nl2br" => TRUE]);
} elseif(self::isHtml($_message)){
self::setSession(["data" => $mark ."" . self::generateHtmlContent($_message) . "
", "nl2br" => false]);
} elseif($mark != NULL){
self::setSession(["data" => $mark ."" . $_message . "
", "nl2br" => TRUE]);
} else {
self::setSession(["data" => $_message, "nl2br" => TRUE]);
}
}
}
/**
* Affiche le panneau des journaux du débogueur en HTML.
*
* Cette méthode affiche les versions de PHP et MySQL, le temps d'exécution, ainsi qu'un ensemble de cases à cocher
* pour intercepter différents types d'actions (Submit, requêtes SQL, Emails et mode debug d'envoi d'email).
* Elle affiche ensuite les journaux de débogage collectés et, si disponibles, les journaux de session.
* Enfin, elle charge le JavaScript associé au débogage.
*
* @return void
*/
public static function renderLogs()
{
echo "";
echo "";
echo "
";
foreach (self::$logs as $log) {
if($log != NULL){
echo "
";
echo $log["nl2br"] == TRUE ? nl2br($log["data"]) : $log["data"];
echo "
";
}
}
if(self::ifSession()){
foreach (self::getSession() as $logSession) {
echo "
";
echo $logSession["nl2br"] == TRUE ? nl2br($logSession["data"]) : $logSession["data"];
echo "
";
}
}
echo "
";
get::javascript("debug");
}
/**
* Initialise le débogueur en enregistrant une fonction de fermeture.
*/
public static function init()
{
register_shutdown_function(function () {
self::renderLogs();
});
}
/**
* Démarre un chronomètre pour mesurer le temps d'exécution.
*/
public static function startTimer()
{
self::$startTime = microtime(true);
}
/**
* Arrête le chronomètre et calcule le temps écoulé.
*/
public static function endTimer()
{
self::$closeTime = microtime(true) - self::$startTime;
}
/**
* Génère un badge HTML avec un lien et un libellé.
*
* @param string $_link Lien vers lequel le badge redirige.
* @param string $_label Libellé affiché sur le badge.
* @return string Le code HTML du badge.
*/
public static function getBadge(string $_link,string $_label){
return ''. $_label .'';
}
/**
* Affiche l'environnement actuel si ce n'est pas l'environnement de production.
*/
public static function printEnvironnement(){
echo (ENVIRONNEMENT != "PROD") ? " [" . ENVIRONNEMENT . "]" : NULL;
}
/**
* Construit un badge HTML personnalisé à partir des données fournies.
*
* @param array $_data Données pour personnaliser le badge (couleur, texte, lien, etc.).
* @return string Le code HTML du badge.
*/
private static function buildBadge(array $_data){
$color = empty($_data["color"]) ? "black" : $_data["color"];
$backgroundColor = empty($_data["background-color"]) ? "orangered" : $_data["background-color"];
$class = empty($_data["class"]) ? NULL : $_data["class"];
$link = empty($_data["link"]) ? "#" : $_data["link"];
$txt = empty($_data["txt"]) ? NULL : $_data["txt"];
$icon = empty($_data["icon"]) ? NULL : " ";
return "" . $icon . $txt . "";
}
/**
* Récupère tous les badges de débogage disponibles.
*
* @return string Les badges HTML générés.
*/
public static function getBadges(){
$return = "";
if(debug::isFile("maintenance")){
$return .= self::buildBadge([
"icon" => "bi bi-exclamation-diamond-fill",
"link" => "/parametres.html#parametres-debug",
"background-color" => "red",
"color" => "white",
"txt" => "MODE MAINTENANCE"
]);
}
if(debug::isFile("debug")){
$return .= self::buildBadge([
"icon" => "bi bi-bug-fill",
"class" => "toggle-logs",
"link" => "#",
"background-color" => "orangered",
"color" => "white",
"txt" => "MODE DEBUG"
]);
}
if(self::isFile("sql")){
$return .= self::buildBadge([
"icon" => "bi bi-database-fill",
"class" => "toggle-logs",
"link" => "#",
"background-color" => "orange",
"color" => "black",
"txt" => "DEBUG SQL"
]);
}
if(self::isFile("email")){
$return .= self::buildBadge([
"icon" => "bi bi-envelope-fill",
"class" => "toggle-logs",
"link" => "#",
"background-color" => "orange",
"color" => "black",
"txt" => "DEBUG EMAIL"
]);
}
if(self::isFile("send-email")){
$return .= self::buildBadge([
"icon" => "bi bi-envelope-fill",
"class" => "toggle-logs",
"link" => "#",
"background-color" => "orange",
"color" => "black",
"txt" => "DEBUG SEND EMAIL"
]);
}
if(self::isFile("submit")){
$return .= self::buildBadge([
"icon" => "bi bi-send-fill",
"class" => "toggle-logs",
"link" => "#",
"background-color" => "orange",
"color" => "black",
"txt" => "DEBUG SUBMIT"
]);
}
return $return;
}
/**
* Ajoute des données au tableau de session de débogage.
*
* @param mixed $_data Les données à ajouter à la session.
*/
public static function setSession($_data){
$_SESSION["DEBUG"][] = $_data;
}
/**
* Récupère les données de la session de débogage et les réinitialise.
*
* @return array Les données de la session de débogage.
*/
public static function getSession(){
$return = $_SESSION["DEBUG"];
self::resetSession();
return $return;
}
/**
* Vérifie si des données de débogage sont présentes dans la session.
*
* @return bool TRUE si des données sont présentes, FALSE sinon.
*/
public static function ifSession(){
return empty($_SESSION["DEBUG"]) ? FALSE : TRUE;
}
/**
* Réinitialise les données de la session de débogage.
*/
public static function resetSession(){
unset($_SESSION["DEBUG"]);
}
}