瀏覽代碼

Ajout de la classe Alert pour gérer les alertes utilisateur et intégration des alertes dans les opérations de fichier (ajout, mise à jour, suppression). Amélioration de l'affichage des alertes dans le footer et ajout de styles CSS pour les alertes.

stany.ferer 2 月之前
父節點
當前提交
4a35bfe05c
共有 5 個文件被更改,包括 141 次插入14 次删除
  1. 30 0
      core/class/alert.class.php
  2. 21 7
      core/class/fichier.class.php
  3. 18 1
      core/page/_footer.php
  4. 3 3
      core/submit/video.delete.php
  5. 69 3
      public/css/media.css

+ 30 - 0
core/class/alert.class.php

@@ -0,0 +1,30 @@
+<?php
+
+class alert
+{
+
+    private static $alerts = [];
+
+    public static function addAlert($type, $message)
+    {
+        if (!isset($_SESSION['alerts'])) {
+            $_SESSION['alerts'] = [];
+        }
+        $_SESSION['alerts'][] = ['type' => $type, 'message' => $message];
+    }
+
+    public static function displayAlerts()
+    {
+        if (!isset($_SESSION['alerts']) || empty($_SESSION['alerts'])) return;
+
+        echo '<div class="alert-container">';
+        foreach ($_SESSION['alerts'] as $alert) {
+            $class = 'alert-' . $alert['type'];
+            echo '<div class="alert ' . $class . '">' . htmlspecialchars($alert['message']) . '<span class="alert-close">&times;</span></div>';
+        }
+        echo '</div>';
+
+        // Vider les alertes après affichage
+        unset($_SESSION['alerts']);
+    }
+}

+ 21 - 7
core/class/fichier.class.php

@@ -24,13 +24,16 @@ class fichier
 
                 try {
                     db::execute();
+                    alert::addAlert('success', 'Vidéo ajoutée avec succès.');
                     return $hash;
                 } catch (Exception $ex) {
                     error_log($ex->getMessage()); // Log l'erreur pour un examen ultérieur
+                    alert::addAlert('error', 'Erreur lors de l\'ajout de la vidéo : ' . $ex->getMessage());
                     return FALSE;
                 }
             }
         }
+        alert::addAlert('error', 'Erreur lors de l\'upload de la vidéo.');
         return FALSE;
     }
 
@@ -47,6 +50,7 @@ class fichier
         db::bind(':active', $form["videoStatus"]);
         db::bind(':id', $form["id"]);
         db::execute();
+        alert::addAlert('success', 'Vidéo mise à jour avec succès.');
     }
 
     static public function updateTime($_id, $_duration)
@@ -59,7 +63,7 @@ class fichier
         db::execute();
     }
 
-    public static function delete(string $_md5 = NULL, string $_folderFiles = "../video/")
+    public static function delete(string $_md5, string $_folderFiles = "../video/")
     {
         if (isset($_md5) and $_md5 != NULL and file_exists($_folderFiles . $_md5)) {
             if (unlink($_folderFiles . $_md5 . ".mp4")) {
@@ -69,14 +73,18 @@ class fichier
 
                 try {
                     db::execute();
+                    alert::addAlert('success', 'Vidéo supprimée avec succès.');
                     return TRUE;
                 } catch (Exception $ex) {
+                    alert::addAlert('error', 'Erreur lors de la suppression de la vidéo en base de données.');
                     return FALSE;
                 }
             } else {
+                alert::addAlert('error', 'Erreur lors de la suppression du fichier vidéo.');
                 return FALSE;
             }
         } else {
+            alert::addAlert('error', 'Fichier vidéo introuvable.');
             return FALSE;
         }
     }
@@ -148,13 +156,13 @@ class fichier
 
     static public function generatePreview($_md5)
     {
-        $videoPreview = "../video/" . $_md5 . ".jpg"; 
+        $videoPreview = "../video/" . $_md5 . ".jpg";
         if (file_exists($videoPreview)) {
             return ['success' => TRUE, 'file' => 'Le fichier existe déjà'];
         }
-        
+
         $time = "00:00:00";
-        $videoFile = "../video/" . $_md5 . ".mp4"; 
+        $videoFile = "../video/" . $_md5 . ".mp4";
 
         if (!file_exists($videoFile)) {
             return ['success' => FALSE, 'error' => 'Le fichier vidéo n\'existe pas.'];
@@ -164,8 +172,8 @@ class fichier
         $outputFile = tempnam(sys_get_temp_dir(), 'preview_') . '.jpg';
 
         // Commande FFmpeg pour faire une capture d'image
-        $command = "ffmpeg -i " . escapeshellarg($videoFile) 
-        . " -frames:v 1 -q:v 5 " . escapeshellarg($outputFile);
+        $command = "ffmpeg -i " . escapeshellarg($videoFile)
+            . " -frames:v 1 -q:v 5 " . escapeshellarg($outputFile);
 
         // Exécuter la commande FFmpeg
         exec($command, $output, $return_var);
@@ -196,6 +204,7 @@ class fichier
 
             // Vérifier que les temps sont au bon format (HH:MM:SS)
             if (!preg_match('/^\d{2}:\d{2}:\d{2}$/', $startTime) || !preg_match('/^\d{2}:\d{2}:\d{2}$/', $endTime)) {
+                alert::addAlert('error', 'Format incorrect pour startTime ou endTime.');
                 return ['success' => FALSE, 'error' => 'Format incorrect pour startTime ou endTime.'];
             }
 
@@ -203,6 +212,7 @@ class fichier
             $videoFile = "../video/" . basename($_POST['md5']) . ".mp4";
 
             if (!file_exists($videoFile)) {
+                alert::addAlert('error', 'Le fichier vidéo n\'existe pas.');
                 return ['success' => FALSE, 'error' => 'Le fichier vidéo n\'existe pas.'];
             }
 
@@ -221,19 +231,23 @@ class fichier
 
             // Vérifier si la commande a réussi
             if ($return_var === 0) {
-                $destinationFile = "../video/_" . basename($_POST['md5']. ".mp4");
+                $destinationFile = "../video/_" . basename($_POST['md5'] . ".mp4");
                 if (copy($outputFile, $destinationFile)) {
                     unlink($outputFile);  // Supprimer le fichier temporaire
+                    alert::addAlert('success', 'Vidéo découpée avec succès.');
                     return ['success' => TRUE, 'file' => $destinationFile];
                 } else {
                     unlink($outputFile);  // Supprimer le fichier temporaire en cas d'échec
+                    alert::addAlert('error', 'Erreur lors de la copie du fichier généré.');
                     return ['success' => FALSE, 'error' => 'Erreur lors de la copie du fichier généré.'];
                 }
             } else {
                 unlink($outputFile);  // Supprimer le fichier temporaire en cas d'échec
+                alert::addAlert('error', 'Erreur lors de l\'exécution de la commande FFmpeg.');
                 return ['success' => FALSE, 'error' => 'Erreur lors de l\'exécution de la commande FFmpeg.'];
             }
         } else {
+            alert::addAlert('error', 'Requête non autorisée.');
             return ['success' => FALSE, 'error' => 'Requête non autorisée.'];
         }
     }

+ 18 - 1
core/page/_footer.php

@@ -1,6 +1,23 @@
-
 <script src='https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js'></script>
 <script src='https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js'></script>
+<script>
+    document.addEventListener('DOMContentLoaded', function() {
+        const closeButtons = document.querySelectorAll('.alert-close');
+        closeButtons.forEach(button => {
+            button.addEventListener('click', function() {
+                const alert = this.parentElement;
+                alert.style.opacity = '0';
+                setTimeout(() => {
+                    alert.remove();
+                }, 300);
+            });
+        });
+    });
+</script>
+<?php alert::displayAlerts(); ?>
+<div style="position: fixed; bottom: 0; left: 0; background: transparent; color: #ddd; padding: 5px 10px; font-size: 12px; z-index: 999;">
+    PHP: <?php echo phpversion(); ?> | Post Max: <?php echo ini_get('post_max_size'); ?> | Upload Max: <?php echo ini_get('upload_max_filesize'); ?> | Memory: <?php echo ini_get('memory_limit'); ?>
+</div>
 </body>
 
 </html>

+ 3 - 3
core/submit/video.delete.php

@@ -1,6 +1,6 @@
-<?php 
+<?php
 
-if(isset($_GET["delete"])){
+if (isset($_GET["delete"])) {
     require_once "../core/controllers/session.php";
     fichier::delete($_GET["delete"]);
     header("Location: /");
@@ -8,4 +8,4 @@ if(isset($_GET["delete"])){
 } else {
     header("Location: /");
     exit();
-}
+}

+ 69 - 3
public/css/media.css

@@ -42,39 +42,48 @@ h1 {
     overflow: hidden;
     transition: max-height 0.3s ease;
 }
+
 .video-content {
     display: flex;
     justify-content: space-between;
     align-items: center;
     padding: 15px;
 }
+
 .video-details {
     display: flex;
     flex-direction: column;
-    justify-content: flex-start; /* Aligne le contenu en haut */
+    justify-content: flex-start;
+    /* Aligne le contenu en haut */
     flex-grow: 1;
 }
+
 .video-info {
     font-size: 0.9em;
     color: #666;
     width: 100%;
 }
+
 .video-title {
     font-size: 1.2em;
     font-weight: bold;
     margin: 5px 0 10px 0;
 }
+
 .title-little {
     margin: 0 !important;
 }
+
 .actions {
     display: flex;
     flex-direction: row-reverse;
     margin-top: -5px;
 }
+
 .actions .btn {
     margin-left: 5px;
 }
+
 .video-preview {
     width: 200px;
     height: 113px;
@@ -105,11 +114,68 @@ h1 {
     border-radius: 0;
 }
 
-.big_topic{
+.big_topic {
     display: none;
 }
 
-.little_topic:hover{
+.little_topic:hover {
     background-color: #dbf3fa;
     cursor: ns-resize;
+}
+
+/* Styles pour les alertes */
+.alert-container {
+    position: fixed;
+    bottom: 20px;
+    right: 20px;
+    z-index: 1000;
+    max-width: 300px;
+}
+
+.alert {
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 15px;
+    margin-bottom: 10px;
+    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+    position: relative;
+    opacity: 1;
+    transition: opacity 0.3s ease;
+}
+
+.alert-error {
+    background-color: #ffe6e6;
+    /* rouge pâle */
+    border-left: 5px solid #ff9999;
+}
+
+.alert-warning {
+    background-color: #fff9e6;
+    /* jaune pâle */
+    border-left: 5px solid #ffcc99;
+}
+
+.alert-info {
+    background-color: #e6f7ff;
+    /* bleu pâle */
+    border-left: 5px solid #99d6ff;
+}
+
+.alert-success {
+    background-color: #e6ffe6;
+    /* vert pâle */
+    border-left: 5px solid #99ff99;
+}
+
+.alert-close {
+    position: absolute;
+    top: 5px;
+    right: 10px;
+    cursor: pointer;
+    font-weight: bold;
+    color: #666;
+}
+
+.alert-close:hover {
+    color: #000;
 }