Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
New folder
:
code_0014.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php // Fonction pour récupérer les jours fériés function getHolidays($year) { $holidays = [ "$year-01-01", // Jour de l'An "$year-05-01", // Fête du Travail "$year-05-08", // Victoire 1945 "$year-07-14", // Fête Nationale "$year-08-15", // Assomption "$year-11-01", // Toussaint "$year-11-11", // Armistice "$year-12-25", // Noël ]; $easterDate = easter_date($year); $ascension = date('Y-m-d', strtotime('+39 days', $easterDate)); $pentecost = date('Y-m-d', strtotime('+49 days', $easterDate)); $holidays[] = $ascension; $holidays[] = $pentecost; return $holidays; } // Vérifier si c'est un jour ouvré function isBusinessDay($date, $holidays) { $dayOfWeek = date('N', $date); // 1 (lundi) à 7 (dimanche) return $dayOfWeek < 6 && !in_array(date('Y-m-d', $date), $holidays); } // Fonction pour générer le tableau dynamique function generateTable($startDate, $endDate) { setlocale(LC_TIME, 'fr_FR.UTF-8'); $currentDate = strtotime($startDate); $endDate = strtotime($endDate); $holidays = getHolidays(date('Y', $currentDate)); $monthColors = [ "#FFCCCC", "#FFE5CC", "#FFFFCC", "#E5FFCC", "#CCFFCC", "#CCFFE5", "#CCFFFF", "#CCE5FF", "#CCCCFF", "#E5CCFF", "#FFCCFF", "#FFCCE5", ]; $weekOddColor = "#D6EAF8"; $weekEvenColor = "#AED6F1"; echo '<div class="table-responsive">'; echo '<table class="table table-bordered text-center" id="dynamicTable">'; // Première ligne : en-têtes echo '<thead><tr><th>Date</th>'; while ($currentDate <= $endDate) { if (isBusinessDay($currentDate, $holidays)) { $formattedDate = date('d/m/Y', $currentDate); echo '<th style="background-color: ' . $monthColors[date('n', $currentDate) - 1] . ';">' . $formattedDate . '</th>'; } $currentDate = strtotime('+1 day', $currentDate); } echo '</tr>'; // Réinitialiser la date pour la deuxième ligne (numéros de semaine) $currentDate = strtotime($startDate); echo '<tr><td>Semaine</td>'; $lastWeekNumber = null; $weekCellCount = 0; while ($currentDate <= $endDate) { if (isBusinessDay($currentDate, $holidays)) { $weekNumber = date('W', $currentDate); if ($weekNumber === $lastWeekNumber) { $weekCellCount++; } else { if ($lastWeekNumber !== null) { $color = ($lastWeekNumber % 2 === 0) ? $weekEvenColor : $weekOddColor; echo '<td colspan="' . $weekCellCount . '" style="background-color: ' . $color . ';">' . $lastWeekNumber . '</td>'; } $lastWeekNumber = $weekNumber; $weekCellCount = 1; } } $currentDate = strtotime('+1 day', $currentDate); } if ($lastWeekNumber !== null) { $color = ($lastWeekNumber % 2 === 0) ? $weekEvenColor : $weekOddColor; echo '<td colspan="' . $weekCellCount . '" style="background-color: ' . $color . ';">' . $lastWeekNumber . '</td>'; } echo '</tr>'; // Réinitialiser la date pour la troisième ligne (jours de la semaine) $currentDate = strtotime($startDate); echo '<tr><td>Jours</td>'; while ($currentDate <= $endDate) { if (isBusinessDay($currentDate, $holidays)) { $dayName = mb_substr(ucfirst(strftime('%A', $currentDate)), 0, 3) . '.'; echo '<td>' . $dayName . '</td>'; } $currentDate = strtotime('+1 day', $currentDate); } echo '</tr></thead>'; // Ajout d'une ligne vide au corps du tableau echo '<tbody id="dataBody"></tbody>'; echo '</table>'; echo '<button id="addRowBtn" class="btn btn-primary mt-3">Ajouter</button>'; echo '<button id="saveButton" class="btn btn-success mt-3" style="display: none;">Sauver</button>'; echo '<input type="file" id="loadFileBtn" class="btn btn-info mt-3" style="display: none;" />'; echo '<button id="loadFileBtnDisplay" class="btn btn-info mt-3">Charger</button>'; echo '</div>'; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Tableau Dynamique</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <style> .table_date[data-status="1"] { background-color: #007BFF; color: #fff; } .titre_nom[contenteditable="true"] { border: 1px dashed #000; padding: 5px; } </style> </head> <body> <div class="container my-5"> <h1 class="text-center mb-4">Tableau Dynamique</h1> <?php generateTable('2025-01-01', '2025-12-31'); ?> </div> <script> // Désactive le rechargement avec F5 ou Ctrl+R window.addEventListener('keydown', function(e) { if (e.key === "F5" || (e.ctrlKey && e.key === "r")) { e.preventDefault(); // Empêche le rechargement alert("Le rechargement est désactivé !"); } }); // Désactive également le clic droit pour rafraîchir window.addEventListener('contextmenu', function(e) { e.preventDefault(); // Empêche le menu contextuel alert("Le rechargement est désactivé !"); }); document.addEventListener('DOMContentLoaded', () => { const tableBody = document.getElementById('dataBody'); const saveButton = document.getElementById('saveButton'); const loadFileBtn = document.getElementById('loadFileBtn'); const loadFileBtnDisplay = document.getElementById('loadFileBtnDisplay'); // Ajouter une nouvelle ligne document.getElementById('addRowBtn').addEventListener('click', () => { const newRow = document.createElement('tr'); const firstCell = document.createElement('td'); firstCell.classList.add('titre_nom'); firstCell.setAttribute('contenteditable', 'true'); firstCell.textContent = 'Not define'; newRow.appendChild(firstCell); // Ajouter des cellules vides avec un contenu initial de 0 document.querySelectorAll('th').forEach(() => { const cell = document.createElement('td'); cell.classList.add('table_date'); cell.textContent = '0'; // Valeur initiale de la cellule cell.dataset.status = '0'; // Statut initial newRow.appendChild(cell); }); // Ajouter la nouvelle ligne au tableau tableBody.appendChild(newRow); saveButton.style.display = 'inline-block'; // Afficher le bouton Sauver }); // Toggle des cellules de 0 à 1 et inversement tableBody.addEventListener('click', (e) => { if (e.target.classList.contains('table_date')) { e.target.dataset.status = e.target.dataset.status === '0' ? '1' : '0'; e.target.textContent = e.target.dataset.status; } }); // Sauver les données dans un fichier JSON saveButton.addEventListener('click', () => { const tableData = []; const rows = tableBody.querySelectorAll('tr'); rows.forEach(row => { const rowData = []; const cells = row.querySelectorAll('td'); cells.forEach((cell, index) => { if (index === 0) { rowData.push(cell.textContent); // Première cellule (chaîne) } else { rowData.push(cell.dataset.status); // Valeur de la cellule (0 ou 1) } }); tableData.push(rowData); }); // Sauver les données en format JSON const jsonData = JSON.stringify(tableData); const blob = new Blob([jsonData], { type: 'application/json' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'tableau_data.json'; link.click(); }); // Charger les données depuis un fichier JSON loadFileBtnDisplay.addEventListener('click', () => { loadFileBtn.click(); }); loadFileBtn.addEventListener('change', (event) => { const file = event.target.files[0]; const reader = new FileReader(); reader.onload = (e) => { const data = JSON.parse(e.target.result); tableBody.innerHTML = ''; // Vider le tableau avant de charger les nouvelles données // Recréer le tableau avec les données chargées data.forEach(rowData => { const newRow = document.createElement('tr'); rowData.forEach((cellData, index) => { const cell = document.createElement('td'); if (index === 0) { cell.classList.add('titre_nom'); cell.setAttribute('contenteditable', 'true'); cell.textContent = cellData; // Remplir la première cellule avec la chaîne } else { cell.classList.add('table_date'); cell.textContent = cellData; // Remplir les autres cellules avec 0 ou 1 cell.dataset.status = cellData; } newRow.appendChild(cell); }); tableBody.appendChild(newRow); }); saveButton.style.display = 'inline-block'; // Afficher le bouton Sauver après le chargement }; reader.readAsText(file); }); }); </script> </body> </html>